Title Image

Blog Logo

Unit Test (2) Code Coverage

🌱 Unit Test (2) Code Coverage

    Ở post trước, mình đã giới thiệu về Unit Test, chúng ta biết được kiểm thử (Test) là một công việc rất quan trọng trong quá trình phát triển một phần mềm, đặc biệt là phần mềm nhúng. Và trong quá trình kiểm thử, để tìm ra bug thì việc kiểm tra qua càng nhiều dòng code, càng nhiều nhánh càng tốt. 

    ➤ Chỉ số các dòng, các nhánh trong code dev được thực hiện trong code test được gọi là Code Coverage. Có nhiều chỉ số đánh giá Code Coverage: Statement Coverage, Decision Coverage - Branch Coverage, Condition Coverage, Modified condition/decision coverage, ...

    👉 Statement Coverage (SC)

    Statement Coverage là một chỉ số đảm bảo rằng việc thực hiện code test đi qua số lượng câu lệnh/dòng code tối đa. Tức là mong muốn mỗi dòng code hay câu lệnh được thực thi ít nhất một lần, hạn chế các dòng code "chết" trong chương trình.

    Ví dụ một chương trình dưới đây, có tổng cộng 8 dòng code, với một câu lệnh điều kiện if

SC

     Có thể thấy nếu điều kiện condition = true, thì chương trình sẽ đi qua câu lệnh printf("Condition is true\n"); Như vậy SC = 100% chỉ với 1 lần Test (1 Test Case).

    💥 Mình ví dụ nếu điều kiện condition luôn luôn false (ví dụ như uint8 t > 255, điều này không bao giờ xảy ra), thì chương trình sẽ không bao giờ nhảy vào đoạn code trên mà chỉ đi qua printf("Continous!!"); Như vậy SC =  5/8 = 62.5 % cho dù có test bao nhiêu lần. 

    Trường hợp này chúng ta coi như tìm ra một đoạn code "chết" của chương trình!!

    👉 Decision Coverage/Branch Coverage (DC)

    Một chỉ số khác cũng thường được nhắc đến bên cạnh SC đó là DC - Decision Coverage hay Branch Coverage. DC biểu thị cho các nhánh mà chương trình có thể được thực thi. Không giống như SC quan tâm đến các dòng code, DC quan tâm đến nhánh chương trình, tức là cả những điều không được thực thi bằng dòng code. 

    ➤ Sử dụng ví dụ ở trên với SC:

DC

    Đối với chỉ số DC, chúng ta sẽ quan tâm đến nhánh chương trình, tức là đối với câu lệnh điều kiện if, chúng ta có thể có 2 nhánh là điều kiện true hoặc false:

DC

    Vì vậy, trong trường hợp này, để DC = 100%, chúng ta phải thực hiện 2 lần test (2 Test Case), với một lần test điều kiện sẽ là true, và lần sau là false, để có thể đi qua cả 2 nhánh trong chương trình.

     Đây cũng chính là điểm khác biệt lớn nhất giữa DC và SC, có thể thấy để cover được DC thì khó hơn và cần nhiều test case hơn so với SC. 

     Có thể kết luận:

100 % Decision Coverage = 100 % Statement Coverage

100 % Statement Coverage != 100 % Decision Coverage

    👉 Modified condition/decision coverage (MC/DC)

    MC/DC là chuẩn đo source về độ bao phủ, với kết quả trả về sau khi kiểm tra là true hoặc false, cùng với thông số quan trọng nhất là % độ bao phủ của hàm đó. 

    Tức là MC/DC cần test những đối tượng độc lập, các test case để bao phủ các trường hợp trả về true hoặc false. 

  • Cần có 1 Test Case để đảm bảo kết quả là đúng khi mà A đúng.
  • Cần có 1 Test Case để đảm bảo kết quả là sai khi mà A sai.

    Mình sẽ xét ví dụ sau cho dễ hiểu, để có một cốc cafe nóng chúng ta cần phải có 3 yếu tố là Ấm đun nước, Cốc và cuối cùng là Cafe.


    ➤ Phải có đủ 3 yếu tố này thì chúng ta mới có được một cốc Cafe ngon lành !!!


    👉 Mình sẽ lập một bảng logic như sau để liệu kê toàn bộ các điều kiện có thể test:
 
MCDC

    Ở đây, Test số 4Test số 8 chỉ ra ấm đun nước "Kettle" có thể độc lập về mặt kết quả. Với Cup và Coffee = 1, thì kết quả sẽ bằng với Kettle. 

    Tương tự, Test 6Test 8 chỉ ra cốc uống nước "Cup" là độc lập về mặt kết quả. Còn Test 7 Test 8 chỉ ra "Coffee" là độc lập về mặt kết quả.

    👉 Vì vậy, chúng ta kết luận, chỉ cần các Test 4, 6, 7, 8 là có thể bao phủ 100% MC/DC. Trong khi đó các Test 1, 2, 3, 5 là không cần thiết.

     Trên đây là những tìm hiểu của mình về một số chỉ số Code Coverage, và chỉ là những tìm hiểu cơ bản nhất. Vẫn còn khá nhiều chỉ số khác để đánh giá mức độ Coverage mà các bạn có thể tìm hiểu thêm trong quá trình học tập, làm việc.

>>>= Follow ngay =<<<

💚 Kênh Youtube Lập trình - Điện tử 💚

Để nhận được những bài học miễn phí mới nhất nhé 😊

    Chúc các bạn học tập tốt 😊

(1) Unit Test                (3) Testing Framework

Đăng nhận xét

2 Nhận xét

  1. Hiện tại em đang làm đồ án về kiểm thử nhúng bằng công cụ embedded unit. Nguồn tài liệu về đồ án này khá ít. Rất may mắn khi có thể xem được bài giảng của anh lúc này, hy vọng anh có thể ra thêm nhiều bài giảng hơn nữa ạ. Em cảm ơn anh nhiều.

    Trả lờiXóa