3. Kiểm thử phần mềm 1 Khái niệm về kiểm thử
3.2. Các phương pháp kiểm thử a Kiểm thử hộp trắng
Câu 48. Kiểm thử hộp trắng dựa trên cơ sơ nào để thiết kế ca kiểm thử? Thiết kế ca kiểm thử phải đảm bảo điều kiện gì?
Kiểm thử hộp trắng sử dụng cấu trúc điều khiển của thiết kế thủ tục để hình thành các ca kiểm thử.
Thiết kế ca kiểm thử phải đảm bảo:
- Bảo đảm rằng mọi con đường độc lập trong một modul đều được thực hiện ít nhất một lần.
- Mọi ràng buộc logic được thực hiện cả phía true và false.
- Thực hiện tất cả các vòng lặp ở biên của nó và cả với biên vận hành của nó. - Thực hiện các cấu trúc dữ liệu nội tại để bảo đảm tính hiệu lực của nó
Câu 49. Đồ thị dòng gồm những yếu tố nào? Xây dựng nó dựa vào đâu? Nó có đặc trưng gì? Đồ thị dòng dùng để làm gì?
- Đồ thị dòng là một kĩ thuật dùng cho kiểm thử hộp trắng, được Tom McCabe đưa ra đầu tiên.
- Đồ thị dòng gần giống đồ thị luồng điều khiển của chương trình.
- Phương pháp đương cơ sở làm cho người thiết kế ca kiểm thử có thể suy dẫn ra một cách đo độ phức tạp logic của thiết kế thủ tục và dùng cách đo này như một hướng dẫn để xác định một tập cơ sở các đường thực hiện. Các ca kiểm thử được suy dẫn ra để thực hiện một tập cơ sở, được đảm bảo để thực hiện mọi câu lệnh trong chương trình ít nhất một lần trong khi kiểm thử.
- Đồ thị dòng nhận được từ đồ thị luồng điều khiển của chương trình bằng cách: + Gộp các lệnh tuần tự
+ Thay lệnh rẽ nhánh và điểm kết thúc của các đường điều khiển bằng 1 nút vị tự. - Cấu trúc đồ thị dòng gồm:
+ Mỗi nút (hình tròn) biểu thị một hay một số lệnh tuần tự, hoặc thay cho điểm hội tụ các đường điều khiển.
+ Mỗi cạnh nối hai nút biểu diễn dòng điều khiển. Kết quả:◊
+ Một nút là vị từ biểu thị sự phân nhánh hoặc hội nhập của cung. Đồ thị dòng dùng để biểu diễn thiết kế thủ tục
Câu 50. Con đường cơ bản trong đồ thị dòng là cái gì? Độ phức tạp của chu trình là gì? Nêu các công thức tính độ phức tạp?
Các đường cơ bản trong đồ thị dòng: - Độ phức tạp của chu trình
+ Để đảm bảo các câu lệnh đều được kiểm thử ít nhất một lần, cần tìm tất cả các đường điều khiển độc lập trong chương trình (khác với các đường khác ít nhất một lệnh).
+ Số các đường độc lập của một chương trình là giới hạn trên của số các kiểm thử cần phải tiến hành. Nó được gọi là độ phức tạp chu trình của chương trình.
+ Các đường độc lập của 1 chương trình trùng với các đường độc lập của đồ thị dòng (tìm đơn giản hơn)
Một tập cơ bản con đường độc lập là tập:
- Mọi cạnh của đồ thị dòng đều có mặt trong một con đường của tập này.
- Mỗi con đường của tập đó đều chứa ít nhất một cung không có mặt trong mọi con đường khác của nó.
- Số lượng các con đường của tập này cho ta số đo độ phức tạp chu trình của một chương trình Ví dụ: Đường độc lập: - Đường 1: 1-11 - Đường 2: 1-2-3-4-5-10-1-11 - Đường 3: 1-2-3-6-7-9-10-1-11 - Đường 4: 1-2-3-6-8-9-10-1-11 Các công thức tính độ phức tạp chu trình
+ Độ phức tạp chu trình V(G) đối với 1 đồ thị dòng G được tính theo các cách sau: V(G) = số miền phẳng
V(G) = P + 1 (Với P là số nút vị từ - nút có chứa một điều kiện, được đặc trưng bởi hai hay nhiều cạnh phát ra từ nó)
Giá trị V(G) cung cấp cho chúng ta một cận trên về số các đường độc lập bao gồm tập cơ sở, và kết quả là một cận trên về số các phép kiểm thử phải được thiết kế và thực hiện để đảm bảo bao quát tất cả các câu lệnh chương trình.
Câu 51. Ma trận kiểm thử được cấu trúc như thế nào? Nó được dùng để làm gì?
- Cấu trúc ma trận kiểm thử:
+ Ma trận kiểm thử là một ma trận vuông có kích thước bằng số các nút trong đồ thị dòng, trong đó: Mỗi dòng/cột ứng với tên một nút, mỗi ô là tên một cung nối nút dòng đến nút cột. + Ma trận kiểm thử được sử dụng như là một dữ liệu có cấu trúc để kiểm tra các con đường cơ bản. (Vì thủ tục để suy dẫn ra đồ thị dòng và xác định một tập các đường cơ bản tuân theo việc máy móc hóa)
+ Nhân liên tiếp k ma trận này được ma trận chỉ số con đường k cung từ nút dòng tới nút cột.
- Để ma trận kiểm thử trở thành công cụ mạnh mẽ trong việc đánh giá cấu trúc điều khiển chương trình khi kiểm thử người ta sử dụng ma trận có trọng số (thêm trọng số cho các cung) như sau:
+ Xác suất cung đó được thực thi.
+ Thời gian xử lý của tiến trình đi qua cung đó. + Bộ nhớ đòi hỏi của tiến trình đi qua cung đó.
+ Nguồn lực được đòi hỏi của tiến trình đi qua cung đó.
Câu 52. Nêu các loại điều kiện trong cấu trúc điều khiển và cho ví dụ? Có những loại sai nào trong điều kiện khi kiểm thử?
- Điều kiện logic của cấu trúc điều khiển:
+ Điều kiện đơn: là 1 biến Bool (có thể có toán tử phủ định): X + Điều kiện đơn: là biểu thức quan hệ giữa 2 biểu thức số học , với là phép so sánh: <, ≤, =, ≥ hay ≠
+ Điều kiện phức hợp: cấu thành từ hơn một điều kiện đơn nhờ các toán tử Bool: hoặc , và , phủ định
, trong đó Xi là điều kiện đơn, & là toán tử Bool. - Kiểu sai trong điều kiện logic kiểm thử:
+ Sai biến Bool + Sai toán tử Bool
+ Sai số hạng trong biểu thức toán tử Bool + Sai toán tử quan hệ
+ Sai biểu thức số học.
Câu 53. Chiến lược kiểm thử phân nhánh nghĩa là gì? Yêu cầu đặt ra cho kiểm thử phân nhánh là gì?
- Kiểm thử phân nhánh là chiến lược kiểm thử từng điều kiện chương trình
- Kiểm thử nhánh: Với mỗi điều kiện kết hợp C thì các nhánh "true" và "false" của C và mỗi điều kiện đơn trong C phải được kiểm thử ít nhất 1 lần.
- Yêu cầu: Không chỉ phát hiện sai trong điều kiện đó mà mà còn phát hiện các sai khác trong chương trình.
Câu 54. Chiến lược kiểm thử miền là cái gì? Nó dựa trên tư tưởng nào?
- Chiến lược kiểm thử miền đòi hỏi 3 hoặc 4 kiểm thử cho một biểu thức quan hệ: gồm các trường hợp <, >, = và có thể ≠ nữa.
Ví dụ:
Với biểu thức quan hệ có dạng E1 <toán tử quan hệ> E2 thì cần tới 3 phép kiểm thử để làm cho giá trị của E1 lớn hơn, bằng hoặc nhỏ hơn giá trị của E2 tương ứng. Nếu <toán tử quan hệ> là không đúng và E1 và E2 đúng thì 3 phép kiểm thử này đảm bảo phát hiện ra toán tử sai. Để phát hiện ra lỗi trong E1 và E2, phép kiểm thử làm cho giá trị của E1 lớn hơn hay bé hơn giá trị của E2 nên tạo ra sự khác biệt giữa hai giá trị này nhỏ nhất có thể có được.
- Với biểu thức Bool có n biến sẽ cần 2n phép kiểm thử có thể có (n>0) nên có chỉ thuận lợi nếu n nhỏ và sẽ thiếu thực tế nếu n lớn.
Câu 55. Chiến lược kiểm thử BRO là cái gì? Nó dựa trên tư tưởng nào?
- Chiến lược kiểm thử BRO là kiểm thử toán tử quan hệ và nhánh. Kỹ thuật này đảm bảo việc phát hiện ra các lỗi quan hệ và nhánh trong điều kiện mà tất các các biến Bool và toán tử quan hệ chỉ xuất hiện 1 lần và không có biến chung.
BRO dùng đến "ràng buộc điều kiện cho điều kiện cần thử".
Giả sử: , Xi: điều kiện đơn, &: toán tử Bool. Cần đặc tả ràng buộc đầu ra của Xi tương ứng với điều kiện D đã xác định?
+ Ta nói rằng ràng buộc Xi của điều kiện D là được phủ bởi một sự thực thi của C nếu như trong quá trình thực thi đó, đầu ra của mỗi điều kiện đơn Xi tr D thoả mãn các ràng buộc tương ứng. Có nghĩa là: khi giâ trị của D đã cho, ta cần tìm các điều kiện ràng buộc mà mỗi Xi (1 thành viên của D) cần thoả mãn để đảm bảo được giá trị của D.
- Tư tưởng: Cho phép thử nhạy cảm sai cho biểu thức Bool. Với một biểu thức Bool duy nhất (một biểu thức Bool mà mỗi biến Bool chỉ xuất hiện 1 lần) với n biến Bool (n>0) chúng ta có thể dễ dàng sinh ra một tập kiểm thử ít hơn 2n phép thử sao cho tập kiểm thử này đảm bảo phát hiện ra nhiều lỗi toán tử Bool và cũng là hiệu quả để phát hiện các lỗi khác.
Câu 56. Lấy ví dụ về các điều kiện "ràng buộc đầu ra" cho các trường hợp: 1 biến Bool, hợp của biến Bool và biểu thức quan hệ, hợp của hai biểu thức quan hệ?
- Với một biến Bool B. thì ràng buộc đầu ra của B là t (true) hoặc f (false)
- Với một biểu thức quan hệ thì ràng buộc đầu ra của nó là toán tử quan hệ: có thể nhận một trong 4 giá trị >, <, =, ≠
- Xét điều kiện , A và B là 2 biến Bool. Khi đó ràng buộc đầu ra của C là một cặp giá trị của t và f. Chiến lược kiểm thử BRO đòi hỏi rằng tập 3 cặp ràng buộc (t,t), (t,f), (f,t) đểu được phủ bởi các thực thi của C:
Cặp (t,t) ứng với C=t
Cặp (t,f) và (f,t) ứng với C=f
- Xét điều kiện C là hội biến Bool và biểu thức quan hệ: A & (B=E). Khi đó các ràng buộc của C là các cặp (t,t), (t,f), (f,t): với (B=E) có giá trị t tương ứng với =, và giá trị f tương ứng với < hoặc >. Bởi vậy, tập các ràng buộc đầu ra của C phải gồm 4 phần tử: (t,=), (t,<), (t,>), (f,=). Phủ của các ràng buộc này đảm bảo phát hiện được sai biến Bool hoặc toán tử quan hệ trong C.
- Xét điều kiện C: (A>B)&(E=F). Tập ràng buộc đầu ra sẽ là(t,t), (t,f), và (f,t) và tương ứng sẽ là: (>,=), (>,<), (>,>), (=,=) và (<,=). Phủ của ràng buộc này đảm bảo rằng phát hiện được sai ở các toán tử trong quan hệ C.
Câu 57. Kiểm thử điều khiển dòng dữ liệu nghĩa là gì? Cho ví dụ?
- Phương pháp kiểm thử dòng dữ liệu là kiểm thử tuyển chọn các đường của chương trình tương ứng với việc định vị các xác định biến và các sử dụng biến trong chương trình. Đã có một số chiến lược kiểm thử dòng dữ liệu và so sánh chúng.
- Giả sử rằng mỗi câu lệnh của chương trình được gán với số câu lệnh duy nhất và mỗi hàm không được cải biên các tham số của nó và các biến toàn cục.
- Với mỗi câu lệnh S ta định nghĩa:
DEF(S) = {X | câu lệnh S chứa định nghĩa của X} USE(S) = {X | câu lệnh S chứa một sử dụng X}
Nếu S là câu lệnh if hoặc câu lệnh vòng lặp thì DEF(S) là rỗng, còn USE(S) được xác định tùy theo điều kiện trong S.
Giả thiết: định nghĩa của biến X ở câu lệnh S là còn sống tại câu lệnh S' nếu có một con đường từ S tới S' mà trên con đường đó không chứa một định nghĩa nào khác của X.
+ Một dây truyền DU sử dụng của X là DU=[X,S,S'] với X trong DEF(S), và trong USE(S') và định nghĩa X trong S vẫn còn sống trong S'.
+ Chiến lược kiểm thử dòng dữ liệu đòi hỏi rằng mọi DU đều phải được phủ ít nhất một lần.
+ Kiểm thử DU không bảo đảm phủ tất cả các nhánh của chương trình; tuy nhiên một nhánh không được phủ bởi DU kiểm thử là rất hiếm.
- Kiểm thử dòng dữ liệu là hữu ích để chọn các đường của chương trình có chứa lồng các câu lệnh if hoặc chu trình lồng nhau.
Ví dụ: Proc x B1; Do while C1 If C2 Then
If C4 Then B4; Else B5; Endif; Else If C3 Then B2; Else B3; Endif Endif Enddo; B6; End proc;
Giả sử biến X được định nghĩa trong câu lệnh cuối của các khối B1, B2, B3, B4, B5 và được dùng trong câu lệnh đầu tiên của các khối B2, B3, B4, B5 và B6. Chiến lược kiểm thử DU đòi hỏi việc thực hiện của đường đi ngắn nhất từ mỗi Bi 0<i<=5 tới mỗi Bj 1<j<=6 (Việc kiểm thử như vậy cũng bao quát mọi việc dùng biến X trong các điều kiện C1,C2, C3, C4) Mặc dầu có tới 25 dây chuyền DU của biến X, chúng ta chỉ cần năm đường đi để bao quát các dây chuyền DU của X từ Bi 0<i<=5 tới B6 và các dây chuyền DU khac có thể được bao quát bằng cách làm cho năm đường này có chứa những việc lặp của chu trình.
Câu 58. Kiểm thử điều khiển vòng lặp nghĩa là gì? Cho ví dụ?
- Kiểm thử vòng lặp là một kỹ thuật kiểm thử hộp trắng tập trung hoàn toàn vào tính hợp lệ của kết cấu vòng lặp. Có thể xác định 4 lớp vòng lặp khác nhau: vòng lặp đơn, vòng lặp lồng, vòng lặp nối tiếp, vòng lặp phi cấu trúc
- Vòng lặp đơn: tập các kiểm thử được áp dụng cho vòng lặp đơn với n là số tối đa các bước được phép qua vòng lặp
+ Nhảy qua toàn bộ vòng lặp + Chỉ qua một bước vòng lặp + Hai bước qua vòng lặp
+ m bước qua chu trình với m<n + n-1, n, n +1 bước qua vòng lặp
- Vòng lặp lồng: Số phép kiểm thử có thể sẽ tăng theo cấp số nhân khi mức độ lồng nhau tăng lên:
+ Bắt đầu từ vòng lặp bên trong nhất. Đặt tất cả các vòng lặp khác vào giá trị tối thiểu + Tiến hành kiểm thử vòng lặp đơn cho vòng lặp bên trong nhất trong khi giữ các vòng lặp bên ngoài ở giá trị tham số lặp tối thiểu. Bổ sung các kiểm thử khác về việc vượt cận hay giá trị bị loại ra
+ Tiến dần ra ngoài, thực hiện phép kiểm thử cho vòng lặp tiếp nhưng giữ tất cả các vòng lặp bên ngoài hơn ở giá trị tối thiểu và các vòng lặp lồng bên trong khác ở giá trị "điển hình"
+ Tiếp tục cho tới khi mọi vòng lặp đã được kiểm thử hết.
- Vòng lặp nối tiếp: Dùng cho các vòng lặp đơn nếu mỗi vòng lặp là độc lập. Tuy nhiên nếu 2 vòng lặp nối nhau và số đếm của vòng lặp 1 được dùng làm giá trị khởi đầu cho vòng lặp 2 thì các vòng lặp là không độc lập nhau. Khi các vòng lặp là không độc lập thì áp dụng cho các vòng lặp lồng nhau.
- Vòng lặp phi cấu trúc: Bất kỳ khi nào có thể được lớp vòng lặp này nên được thiết kế lại để phản ánh việc dùng các kết cấu lập trình có cấu trúc