Quyết định là câu lệnh IF (if statement), câu lệnh điều khiển vòng lặp (ví dụ: DO-WHILE hoặc REPEAT-UNTIL) hoặc câu lệnh CASE, trong đó có hai hoặc nhiều lối rẽ hoặc kết quả có thể xảy ra từ câu lệnh. Với một câu lệnh IF, lối ra có thể là TRUE (Đúng) hoặc FALSE (sai) tùy thuộc vào giá trị của điều kiện logic xuất hiện sau IF. Với câu lệnh điều khiển vòng lặp, kết quả là có thực hiện mã trong vòng lặp hay không (một lần nữa là True hoặc False).
Độ bao phủ quyết định được tính bằng:
Kiểm thử chức năng có thể chỉ đạt được độ bao phủ quyết định từ 40% đến 60%. Kiểm thử đặc biệt điển hình (ad hoc) có thể chỉ bao phủ được 20% quyết định, còn lại 80% kết quả có thể chưa được kiểm thử. Ngay cả khi kiểm thử có vẻ khá kỹ lưỡng từ góc độ chức năng hoặc dựa trên đặc tả kỹ thuật, bạn có thể chỉ giải quyết được hai phần ba hoặc ba phần tư các quyết định. Bao phủ quyết định mạnh hơn bao phủ câu lệnh. Nó “bao gồm” (subsumes) bao phủ câu lệnh, điều này có nghĩa là độ bao phủ quyết định 100% luôn đảm bảo bao phủ 100% câu lệnh. Bất kỳ biện pháp bao phủ mạnh hơn nào cũng có thể yêu cầu nhiều trường hợp kiểm thử hơn để đạt được mức bao phủ 100%.
Trước đó, ta đã thấy rằng chỉ cần một trường hợp kiểm thử để đạt được phạm vi bao phủ 100% dòng lệnh. Tuy nhiên, bao phủ quyết định yêu cầu mỗi quyết định phải có cả kết quả Đúng (True) và Sai (False). Do đó, để đạt được bao phủ quyết định 100%, trường hợp kiểm thử thứ hai là cần thiết khi A nhỏ hơn hoặc bằng B. Điều này sẽ đảm bảo rằng tuyên bố quyết định”NẾU A > B” có kết quả Sai. Vì vậy, một bài kiểm thử là đủ để bao phủ 100% câu lệnh, nhưng cần có hai bài kiểm thử để bao phủ 100% quyết định. Lưu ý rằng bao phủ quyết định 100% đảm bảo bao phủ dòng lệnh 100%, nhưng không phải ngược lại!
Giả sử rằng chúng ta đã có bài kiểm thử sau đây, kiểm thử này cung cấp mức độ bao phủ dòng lệnh 100% (xem ví dụ code 4.3 ở trên)
TEST SET 2
Test 2_1: A = 20, B = 15
Chúng ta đã thực hiện kết quả quyết định nào với bài kiểm thử của mình? Giá trị của C là -10, vì vậy điều kiện “C < 0” là Đúng, vì vậy sẽ in ra “C negative” và chúng ta đã thực hiện kết quả Đúng từ câu lệnh quyết định đó, nhưng chưa thực hiện kết quả quyết định là Sai. Chúng ta cần kiểm thử khác để thực hiện kết quả Sai và để đạt được phạm vi quyết định 100%?
Trước khi trả lời câu hỏi đó, hãy xem một cách khác để biểu diễn mã này. Đôi khi cấu trúc quyết định dễ thấy hơn trong sơ đồ luồng điều khiển (xem Hình 4.4 ở trên).
Đường nét đứt hiển thị vị trí của Test 2_1 và cho thấy rõ ràng rằng chưa có bài kiểm thử nào đi vào luồng Sai từ câu lệnh IF. Hãy sửa đổi bộ kiểm thử hiện có bằng cách thêm một kiểm thử nghiệm:
TEST SET 2
Test 2_1: A = 20, B = 15
Test 2_2: A = 10, B = 2
Điều này hiện bao gồm cả hai kết quả quyết định, Đúng (với Test 2_1) và Sai (với Test 2_2). Nếu vẽ đường đi của Test 2_2, thì đó sẽ là một đường thẳng từ câu lệnh đã đọc xuống lối ra Sai và qua ENDIF. Lưu ý rằng có thể chọn các số khác để đạt được kết quả Đúng hoặc Sai.
Các kĩ thuật dựa trên cấu trúc khác (mục 4.4.4)
Có các kỹ thuật dựa trên cấu trúc khác có thể được sử dụng để đạt được kiểm thử ở các mức độ kỹ lưỡng khác nhau. Một số kỹ thuật mạnh hơn (yêu cầu nhiều bài kiểm thử hơn để đạt được mức độ phù hợp 100% và do đó, có nhiều cơ hội phát hiện lỗi hơn) và có những kỹ thuật khác thì yếu hơn.
Ví dụ: bao phủ nhánh (branch coverage) có liên quan chặt chẽ với bao phủ quyết định và ở mức độ bao phủ 100% chúng cho kết quả chính xác như nhau. Bao phủ quyết định đo lường bao phủ của các nhánh có điều kiện; bao phủ nhánh đo mức độ bao phủ của cả các nhánh có điều kiện và không có điều kiện. Syllabus sử dụng bao phủ quyết định, vì nó là nguồn gốc của các nhánh. Một số công cụ đo lường độ bao phủ có thể nói về độ bao phủ nhánh khi chúng thực sự có nghĩa là độ bao phủ quyết định.
Các luồng điều khiển đo độ bao phủ code khác bao gồm bao phủ chuỗi mã và bước nhảy tuyến tính (LCSAJ), bao phủ điều kiện, bao phủ nhiều điều kiện (còn được gọi là bao phủ kết hợp điều kiện) và bao phủ xác định điều kiện (còn được gọi là bao phủ quyết định nhiều điều kiện hoặc bao phủ quyết định điều kiện đã sửa đổi , MCDC). Kỹ thuật này yêu cầu bao quát tất cả các điều kiện có thể ảnh hưởng hoặc quyết định kết quả của quyết định.
Một biện pháp phổ biến khác, nhưng thường bị hiểu sai, là độ bao phủ đường dẫn (path coverage). Đôi khi, bất kỳ kỹ thuật dựa trên cấu trúc nào cũng được gọi là “kiểm thử đường dẫn” [Patton, 2001]. Tuy nhiên, nói một cách chính xác, đối với bất kỳ mã nào chứa vòng lặp, bao phủ đường dẫn là không thể vì đường dẫn đi vòng quanh vòng lặp ba lần khác với đường dẫn đi quanh cùng một vòng lặp bốn lần. Điều này đúng ngay cả khi phần còn lại của các đường dẫn giống hệt nhau. Vì vậy, nếu có thể đi vòng quanh một số lần không giới hạn thì sẽ có vô số đường đi qua đoạn mã đó. Vì lý do này, sẽ đúng hơn khi nói về “bao phủ phân đoạn đường dẫn độc lập” (independent path segment coverage) mặc dù thuật ngữ ngắn hơn (“bao phủ đường dẫn”) thường được sử dụng.
Các biện pháp dựa trên cấu trúc và kỹ thuật thiết kế kiểm thử liên quan được mô tả trong [BS7925-2]. Các kỹ thuật dựa trên cấu trúc cũng được thảo luận trong [Copeland, 2003] và [Myers, 1979]. Có thể tìm thấy mô tả hay về lý thuyết đồ thị đằng sau kiểm thử cấu trúc trong [Jorgensen, 1995] và [Hetzel, 1988] cũng chỉ ra cách tiếp cận cấu trúc. [Pol et al, 2001] mô tả một cách tiếp cận dựa trên cấu trúc được gọi là kiểm thử thuật toán.
Bản gốc Tiếng Anh các bạn có thể Tải về Tại đây