Condition/Decision Coverage
Bao phủ quyết định/điều kiện – Condition/Decision Coverage là sự kết hợp giữa bao phủ quyết định và bao phủ điều kiện để giải quyết nhược điểm của bao phủ chỉ có điều kiện đã chỉ ra ở bài viết trước. Với loại kiểm thử này, chúng ta cần đạt được phạm vi bao phủ ở mức điều kiện trong đó mỗi điều kiện nguyên tử được kiểm tra theo cả hai cách, TRUE và FALSE, đồng thời chúng ta cũng cần đảm bảo rằng chúng ta đạt được phạm vi bao phủ quyết định bằng cách đảm bảo rằng biểu thức tổng thể được kiểm tra theo cả hai cách, TRUE và FALSE.
A && B
Quay trở lại ví dụ bài viết trước một lần nữa khi chúng ta có phạm vi điều kiện nhưng không có phạm vi quyết định, chúng ta đã có hai trường hợp thử nghiệm như sau:
Test 1: A == FALSE, B == TRUE ⇒ FALSE
Test 2: A == TRUE, B == FALSE ⇒ FALSE
Test 3: A == TRUE, B == TRUE ⇒ TRUE
Bằng cách thêm trường hợp thử nghiệm thứ ba trong đó cả A và B đều được đặt thành TRUE, giờ đây chúng ta buộc biểu thức phải đánh giá là TRUE, do đó giờ đây chúng ta cũng có phạm vi quyết định.
Quay trở lại với câu hỏi: Liệu chúng ta đã thực hiện kiểm thử đủ chưa?
Để trả lời câu hỏi này, hãy cùng mình xem xét phần tiếp theo của bài viết nhé.
Modified Condition/Decision Coverage
Vẫn còn một mức độ bao phủ mạnh mẽ hơn mà chúng ta phải thảo luận. Cái này được gọi là Modified Condition/Decision Coverage (thường được viết tắt là MC/DC).
Mức độ bao phủ này được coi là mạnh hơn vì nó thêm một yếu tố khác vào những gì chúng ta đã thử nghiệm trong bao phủ quyết định/điều kiện (Condition/Decision Coverage). Đó là “Mỗi điều kiện phải ảnh hưởng đến quyết định kết quả một cách độc lập trong khi các điều kiện nguyên tử khác được giữ cố định”. Như vậy, với kỹ thuật kiểm thử này, chúng đảm bảo được 3 điều kiện:
- Tất cả các điều kiện nguyên tử được kiểm tra cho cả hai trường hợp TRUE và FALSE
- Tất cả các điều kiện tổng thể được kiểm tra cho cả hai trường hợp TRUE và FALSE
- Mỗi điều kiện nguyên tử có khả năng ảnh hưởng đến quyết định kết quả một cách độc lập trong khi không làm thay đổi các giá trị điều kiện nguyên tử khác.
Giả thuyết lỗi của chúng ta cho biết rằng chúng ta có thể tìm thấy một ví dụ về lỗi ẩn trong không gian nhỏ cuối cùng mà chúng ta chưa kiểm tra.
Các Yếu Tố Cần Xem Xét Trong Kiểm Thử MC/MD
Việc kiểm tra vùng bao phủ MC/DC có thể phức tạp. Có hai vấn đề cần phải thảo luận: đoản mạch (short-circuit) và tình trạng xảy ra nhiều lần.
Hiện Tượng Đoản Mạch
Đầu tiên, chúng ta sẽ xem xét hiện tượng đoản mạch. Đoản mạch (hay short circuit) có nghĩa là gì? Một số ngôn ngữ lập trình được định nghĩa theo cách mà các biểu thức Boolean có thể được giải quyết mà không cần thông qua từng biểu thức phụ, tùy thuộc vào toán tử Boolean được sử dụng.
Giá trị của A | Giá trị của B | A||B |
T | T | T |
T | F | T |
F | T | T |
F | F | F |
Hãy xem điều gì sẽ xảy ra khi một hệ thống thời gian chạy được xây dựng bằng trình biên dịch đoản mạch giải quyết biểu thức Boolean (A || B). Nếu A tự nó đánh giá là TRUE thì giá trị của B là bao nhiêu không quan trọng. Tại thời điểm thực thi, khi hệ thống thời gian chạy thấy A là TRUE, nó thậm chí không thèm đánh giá B. Điều này giúp tiết kiệm thời gian thực hiện.
C++ và Java là ví dụ về các ngôn ngữ thể hiện hành vi này. Một số dạng biểu thức đoản mạch của C và Pascal không bị đoản mạch, nhưng Delphi có tùy chọn trình biên dịch để cho phép đoản mạch nếu lập trình viên muốn.
Lưu ý rằng cả OR và AND đều đoản mạch theo những cách khác nhau. Xét biểu thức (A || B). Khi toán tử Boolean là OR, nó sẽ đoản mạch khi số hạng đầu tiên là TRUE vì số hạng thứ hai không quan trọng. Nếu toán tử Boolean là AND (&&), nó sẽ bị đoản mạch khi số hạng đầu tiên là FALSE, vì không có giá trị nào của số hạng thứ hai ngăn cản việc đánh giá biểu thức là FALSE.
Tình Trạng Xảy Ra Nhiều Lần
Vấn đề thứ hai cần được thảo luận là khi một điều kiện xuất hiện nhiều lần trong một biểu thức. Hãy xem xét ví dụ sau đây:
A || (! A && B)
Trong ví dụ này, A và !A được cho là được ghép nối. Chúng không thể thay đổi độc lập như phạm vi bảo hiểm MC/DC yêu cầu. Giống như hiện tượng đoản mạch, có (ít nhất) hai cách tiếp cận vấn đề này.
Một cách tiếp cận được gọi là Unique Cause MC/DC. Theo cách tiếp cận này, thuật ngữ điều kiện trong định nghĩa MC/DC được coi là điều kiện tách rời và câu hỏi sẽ trở thành vấn đề tranh luận.
Cách tiếp cận khác được gọi là Masking MC/DC và nó cho phép nhiều điều kiện thay đổi cùng một lúc. Người kiểm thử phải thực hiện phân tích, trên cơ sở từng trường hợp cụ thể, logic của vị từ để đảm bảo rằng chỉ một điều kiện quan tâm ảnh hưởng đến quyết định. Một lần nữa, đề xuất của chúng ta là tuân theo bất kỳ quy tắc nào mà cơ quan quản lý áp đặt cho bạn có thể ngăn chặn việc phát hành hệ thống của bạn.
Khả Năng Áp Dụng
Kỹ thuật này được sử dụng trong ngành công nghiệp hàng không vũ trụ và ô tô cũng như các ngành công nghiệp khác dành cho các hệ thống quan trọng về an toàn. Nó được sử dụng khi kiểm thử phần mềm khi lỗi có thể gây ra thảm họa. Kiểm tra điều kiện/quyết định đã sửa đổi có thể là nền tảng trung gian hợp lý giữa kiểm tra quyết định và kiểm tra nhiều điều kiện (do có số lượng lớn các kết hợp để kiểm tra). Nó nghiêm ngặt hơn so với kiểm tra quyết định nhưng yêu cầu thực hiện ít điều kiện kiểm tra hơn nhiều so với kiểm tra nhiều điều kiện khi có một số điều kiện nguyên tử trong quyết định.
Hạn Chế/ Khó Khăn
Việc đạt được MC/DC có thể phức tạp khi có nhiều lần xuất hiện của cùng một biến trong một quyết định có nhiều điều kiện. Khi điều này xảy ra, các điều kiện có thể được “kết hợp”. Tùy thuộc vào quyết định, có thể không thể thay đổi giá trị của một điều kiện sao cho chỉ riêng nó thôi cũng khiến kết quả của quyết định thay đổi.
Một số trình biên dịch và/hoặc trình thông dịch được thiết kế sao cho chúng thể hiện hành vi đoản mạch khi đánh giá một câu lệnh quyết định phức tạp trong code. Nghĩa là, code thực thi có thể không đánh giá toàn bộ biểu thức nếu kết quả cuối cùng của việc đánh giá có thể được xác định sau khi chỉ đánh giá một phần của biểu thức. Thông thường, có thể xác định cấu hình trình biên dịch để tắt tính năng tối ưu hóa đoản mạch cho quá trình thử nghiệm. Nhưng điều này có thể không được phép đối với các ứng dụng quan trọng về an toàn, trong đó code được kiểm tra và code được phân phối phải giống hệt nhau.
Ví Dụ Về Kiểm Thử MC/MD
Hãy cùng mình xem xét đoạn code sau:
if ((A OR B) AND C) then…
Giả sử rằng chúng ta đang sử dụng một trình biên dịch không bị đoản mạch và chúng ta sẽ không sử dụng bất kỳ điều kiện kết hợp nào. Làm cách nào để đạt được phạm vi phủ sóng MC/DC?
Chúng ta có ba điều kiện nguyên tử, A, B và C. Chúng ta có thể đạt được phạm vi quyết định/điều kiện bằng cách chạy hai trường hợp thử nghiệm như sau:
- A đặt thành TRUE, B đặt thành TRUE, C đặt thành TRUE trong đó biểu thức ước tính là TRUE
- A đặt thành FALSE, B đặt thành FALSE, C đặt thành FALSE trong đó biểu thức ước tính là FALSE
Lưu ý rằng B không bao giờ ảnh hưởng độc lập đến kết quả của quyết định vì giá trị của A luôn ghi đè lên nó. Chúng ta có thể đạt được phạm vi phủ sóng MC/DC mong muốn bằng cách thay đổi một chút đầu vào thử nghiệm và thêm một thử nghiệm duy nhất.
- A đặt thành TRUE, B đặt thành FALSE, C đặt thành TRUE, kết quả là TRUE
- A đặt thành FALSE, B đặt thành TRUE, C đặt thành TRUE, kết quả là TRUE
- A đặt thành TRUE, B đặt thành TRUE, C đặt thành FALSE, kết quả là FALSE
Như bạn có thể thấy, mỗi điều kiện nguyên tử sẽ thay đổi đánh giá đầu ra ít nhất một lần trong bộ thử nghiệm miễn là các điều kiện khác được giữ ổn định. Nếu giá trị A thay đổi trong thử nghiệm 1, kết quả sẽ bị đảo ngược, tương tự như vậy B trong thử nghiệm 2 và C trong thử nghiệm 3.
Bài viết hôm nay khá dài, hy vọng các bạn đã hiểu hơn về kỹ thuật kiểm thử Modified Condition/Decision Testing. Hẹn gặp lại các bạn trong các bài viết tiếp theo.
Hayppy Testing!