Tiếp theo Phần 2:Unit Test ở Front End với Karma của loạt bài viết về Front End,trong phần này mình sẽ giới thiệu đến các bạn Phần 3:Code coverage với Istanbul.
Bạn đang xem: Code coverage là gì
Trong phần trước tất cả chúng ta đã trò chuyện về Unit Test, những khái niệm, kinh nghiệm tay nghề và cách setup để chạy Unit Test. Tuy nhiên làm thế nào tất cả chúng ta biết được UT của tất cả chúng ta viết ra đã đạt tiêu chuẩn chưa ? UT đã bao trùm hết những trường hợp thiết yếu chưa ? Làm sao những trưởng nhóm, trưởng dự án Bất Động Sản biết bạn đã viết tốt hay không ? … và rất nhiều câu hỏi khác .
Để trả lời những câu hỏi đó, chúng ta phải có một tiêu chuẩn để đánh giá, một cách để report tự động những gì quá trình UT đã làm. Đó chính là Code coverage.
Bạn đang đọc: Code coverage là gì
Các khái niệm về code coverage
Statements: là tiêu chuẩn đánh giá các câu lệnh được/không được phủ(được gọi) bởi code Unit Test.Branches: là tiêu chuẩn đánh giá các nhánh điều kiệnđược/không được phủ(được gọi) bởi code Unit Test.Functions: là tiêu chuẩn đánh giá các hàm được/không được phủ(được gọi) bởi code Unit Test.Lines:là tiêu chuẩn đánh giá số dòng code được/không được phủ(được gọi) bởi code Unit Test.
Xem thêm:
Statements : là tiêu chuẩn nhìn nhận những câu lệnh được / không được phủ ( được gọi ) bởi code Unit Test. Branches : là tiêu chuẩn nhìn nhận những nhánh điều kiệnđược / không được phủ ( được gọi ) bởi code Unit Test. Functions : là tiêu chuẩn nhìn nhận những hàm được / không được phủ ( được gọi ) bởi code Unit Test. Lines : là tiêu chuẩn nhìn nhận số dòng code được / không được phủ ( được gọi ) bởi code Unit Test. Xem thêm : Sự Cố Vấn Chuyên Môn Tiếng Anh Là Gì ? Đặc Điểm Và Cơ Hội Nghề NghiệpBạn xem hình sau :
Ở dòng đầu tiên của report này là kết quả cho cả package bạn đang chọn:
Ở các dòng tiếp theo là kết quả cho từng file/class đã được test:
Ý nghĩa màu report:
Xanh lá cây: nghĩa là thông số được report đạt tiêu chuẩn đặt raVàng: nghĩa là thông số được report chưa được tốt lắm, cần chú ýĐỏ: tốt nhất bạn đi fix đi, nó là FAILED: nghĩa là thông số kỹ thuật được report đạt tiêu chuẩn đặt ra : nghĩa là thông số kỹ thuật được report chưa được tốt lắm, cần chú ý quan tâm : tốt nhất bạn đi fix đi, nó là FAILED
Ý nghĩa các con số:
Statements 62.5% – 10/16: nghĩa là trong class được test có 16 câu lệnh nhưng chỉ có 10 câu lệnh được test, còn 6 câu lệnh chưa được code UT chạy quaBranches 38.46% – 5/13: nghĩa là trong code của bạn có 13 nhánh điều kiện nhưng chi có 5 nhánh được code UT chạy quaFunctions 50% – 1/2:nghĩa là trong code của bạn có 2 functions nhưng chi có 1 function được code UT chạy quaLines 64.29% – 9/14:nghĩa là trong code của bạn có 14 dòng lệnh nhưng chỉ có 9 dòng lệnh được code UT chạy qua
: nghĩa là trong class được test có 16 câu lệnh nhưng chỉ có 10 câu lệnh được test, còn 6 câu lệnh chưa được code UT chạy qua: nghĩa là trong code của bạn có 13 nhánh điều kiện nhưng chi có 5 nhánh được code UT chạy qua:nghĩa là trong code của bạn có 2 functions nhưng chi có 1 function được code UT chạy qua:nghĩa là trong code của bạn có 14 dòng lệnh nhưng chỉ có 9 dòng lệnh được code UT chạy qua
Làm sao để tính các con số này từ source code?
Đây là câu hỏi khó cho dân Dev ^ _ ^, chính do nó không đơn thuần là nhìn vào những dòng code, điều kiện kèm theo if else, code block để đưa ra những số lượng, nó phức tạp hơn những bạn nghĩ .Nếu bạn thực sự muốn biết cụ thể, bạn đọc những tài liệu tương quan đến kỹ thuật testing, kiểm thử nhé. Một vài tài liệu mình từng đọc :
(Siêu nhân QA nào đi ngang qua bài này, nhờ bạn comment vài tài liệu hữu ích cho người đi sau tham khảo nghen ^_^).
Xem thêm: Chảy Dãi Khi Ngủ Chảy Nhãi Là Bệnh Gì, Ngủ Chảy Nước Miếng Là Bệnh Gì
Report code coverage tốt có nghĩa là chất lượng tốt?
Nếu bạn nhìn vào bảng report trên thì bạn nghĩ rằng cứ con số 100% là ngon? chưa hẳn như vậy, bạn xem các ví dụ sau nhé:
Ví dụ 1: Statements vs Lines
// Code chínhexport const getUserInfor = (yearOld, userName) => { let output = <>; if (yearOld > 18) { output.push(`${userName} is an adult`); } else {return “Nothing”} return output;}// Code testdescribe(“Testing Coverage Sample”, () => { it(“Mr. Namx is an adult”, () => { const yearOld = 20; const userName = “Mr. Namx”; const outputs = getUserInfor(yearOld, userName); expect(outputs).to.include.members(< "Mr. Namx is an adult" >); });});Kết quả chạy UT của ví dụ này sẽ là:
Xanh với 88.33% – 5/6 câu lệnh được phủ, tuy nhiên bạn nhìn kỹ hơn ở code UT, bạn truyền vào giá trị yearOld là 20, có nghĩa là câu lệnh if chỉ được thực hiện ở về đầu, vế else phía sau chưa được kiểm thử. Nên code UT và kết quả này chưa tốt.Lines Xanh lè với 100% – 4/4 dòng được phủ kín. ^_^ nhìn vào kết quả này thì có câu nói nổi tiếng trong nghề Dev “Có Thánh mới biết bạn làm gì”, không ai đủ thời gian để đi đọc từng câu lệnh của bạn đã viết để phát hiện ra là con số 100% đó chưa đủ tốt.May thay trong kết quả này có thông số Branches 50%, nó sẽ bắt được trường hợp này cho bạn để bạn sửa lại.Statements màucâu lệnh được phủ, tuy nhiên bạn nhìn kỹ hơn ở code UT, bạn truyền vào giá trị yearOld là 20, có nghĩa là câu lệnh if chỉ được thực thi ở về đầu, vếphía sau chưa được kiểm thử. Nên code UT và hiệu quả này chưa tốt. Linesdòng được phủ kín. ^ _ ^ nhìn vào tác dụng này thì có câu nói nổi tiếng trong nghề Dev ” Có Thánh mới biết bạn làm gì “, không ai đủ thời hạn để đi đọc từng câu lệnh của bạn đã viết để phát hiện ra là con sốđó chưa đủ tốt. May thay trong tác dụng này có thông số kỹ thuật, nó sẽ bắt được trường hợp này cho bạn để bạn sửa lại .
Xem thêm: Tứ niệm xứ – Wikipedia tiếng Việt
Ví dụ 2: 100%
/ / Code chínhexport const getUserInfor = ( yearOld, userName ) => { let output = < > ; if ( userName. length % 2 = = = 0 ) { output.push ( ` USD { userName } is a man ` ) ; } else { output.push ( ` USD { userName } is a woman ` ) ; } return output ; } / / Code UTdescribe ( ” Testing Coverage Sample “, ( ) => { it ( ” Mr. Namx is a man “, ( ) => { const yearOld = 20 ; const userName = ” Mr. Namx ” ; const outputs = getUserInfor ( yearOld, userName ) ; expect ( outputs ). to.include.members ( < " Mr. Namx is a man " > ) ; } ) ; it ( ” Mr. Nam is a woman “, ( ) => { const yearOld = 20 ; const userName = ” Mr. Nam ” ; const outputs = getUserInfor ( yearOld, userName ) ; expect ( outputs ). to.include.members ( < " Mr. Nam is a woman " > ) ; } ) ; } ) ; Ở ví dụ này mình chạy 2 test cases, với độ dài của tên là chẳn và lẻ để phủ kín hàng loạt code chính, report của ví dụ này chắc như đinh 100 % hàng loạt thông số kỹ thuật
Source: https://mindovermetal.org
Category: Wiki là gì