Nếu bạn là một lập trình viên thì chắc hẳn đã từng nghe qua thuật ngữ Unit test. Một số thì biết về nó, đã viết ở mức cơ bản, viết rất nhiều.
Unit test sinh ra với mục đích để cover được những đoạn logic được viết ra. Giúp đoạn code được test kĩ càng, khi logic code bị thay đổi thì unitest sẽ phát huy sức mạnh của nó. Kiểm tra xem logic code có đúng như các unitest đã được viết trước đó hay không. Nếu không nó cần được xem xét và sửa lại một cách kĩ càng.
Vậy mọi người có đặt ra câu hỏi, "Vậy viết bao nhiêu testcase thì sẽ đủ, sẽ cover được hết các case của logic?"
Trong bài này chúng ta sẽ tìm hiểu về Test coverage - độ phủ unittest - C0, C1, C2.
Về khái niệm, các bạn có thể chat GPT nhé.
def demo(i1, i2):
if (i1 > 10): - condition 1
// logic 1
else:
//logic 2
if (i1 % 2 == 0 && i2 % 2 == 0): condition 2
// logic 3
else:
// logic 4
Chúng ta sẽ sử dụng đoạn code đơn giản bên trên để giải thích rõ hơn về C0, C1, C2.
C0 - bao phủ câu lệnh - Statement Coverage
Bộ Testcase sẽ chỉ cần đảm bảo đi qua các logic từ 1 lần trở lên.
VD: với 2 mẫu test là
i1 = 11 sẽ đi qua logic 1, logic 4
i1 = 4, i2=4 sẽ đi qua logic 2, logic 3
Như vâỵ là chúng ta đã có thể pass được C0 với 2 testcase. Rất đơn giản!
C1 - bao phủ nhánh - Branch Coverage
Đánh giá đoạn code trên thì sẽ có 4 nhánh:
condition 1 khi true: nhánh logic 1 -> logic 3 và logic 1 -> logic 4
condition 1 khi false: nhánh logic 2 -> logic 3 và logic 2 -> logic 4
như vậy chúng ta sẽ cần viết 4 testcase
VD:
condition 1 = true và conditon 2 = false tương ứng logic 1 -> logic 4
condition 1 = true và conditon 2 = true tương ứng logic 1 -> logic 3
condition 1 = false và conditon 2 = false tương ứng logic 2 -> logic 4
condition 1 = false và conditon 2 = true tương ứng logic 2 -> logic 3
Hãy để ý tới conditon 2 = false, chúng ta sẽ không quan tâm tới là i1 % 2 == 0 = false hay i2 % 2 == false.
Chỉ cần quan tâm tới kết quả cuối cùng của tổ hợp điều kiện.
C2 - bao phủ điều kiện - Condition Coverage
Ở loại này chúng ta sẽ quan tâm tới từng điều kiện nhỏ trong tổ hợp condition 1 và condition 2. Hay sẽ coi tất cả các điều kiện nhỏ trong condition 1, condition 2 là độc lập.
Dựng bảng các case:
condition 1 | i1 % 2 == 0 | i2 % 2 == 0
true | true| true
true | true | false
true | false | true
true | false | false
false | true| true
false | true | false
false | false | true
false | false | false
=> Chúng ta sẽ cần viết 8 testcase với C2
Với mỗi Cx yêu cầu viết số lượng case khác nhau, độ phủ của C2 được cho là cao nhất.
Nhưng còn tuỳ thuộc vào nhiều yếu tố khách quan khác của dự án. Hãy thống nhất với nhau về tiêu chuẩn coverage
khi phát triển ứng dụng.