Ở Day 1, chúng ta đã tạo Unit Test và làm quen với Code Coverage. Ở Day 2, chúng ta tìm hiểu sự khác biệt giữa Line Coverage, Branch Coverage và cách viết test case có ý nghĩa. Trong dự án thực tế, solution thường có nhiều test project. Ví dụ: LibraryManagement.Tests : chứa Unit Test để kiểm tra logic nghiệp vụ. LibraryManagement.IntegrationTests : chứa Integration Test để kiểm tra sự phối hợp giữa các thành phần. Khi chạy từng test project, chúng ta có thể thu được nhiều file kết quả Coverage khác nhau. Nếu muốn xem tổng quan mức độ bao phủ của ứng dụng, chúng ta cần biết cách thu thập, phân biệt và tổng hợp các file kết quả này. Trong bài viết này, chúng ta sẽ sử dụng Coverlet để thu thập Coverage và ReportGenerator để tạo báo cáo HTML dễ đọc. 1. Mục tiêu bài học Sau bài này, bạn sẽ có thể: Hiểu vai trò của nhiều test project trong một solution .NET. Thu thập Coverage riêng cho Unit Test và Integration Test. Giải thích được tại sao thư mục Test...
Ở Day 1, chúng ta đã xây dựng LibraryService , viết unit test và sử dụng Code Coverage để quan sát những dòng code đã được thực thi. Tuy nhiên, một câu hỏi quan trọng vẫn còn: Nếu một dòng code đã chạy, điều đó có nghĩa là chúng ta đã kiểm tra hết logic của dòng code đó chưa? Trong bài này, chúng ta sẽ tìm hiểu ba khái niệm: Line Coverage: Dòng code có được thực thi không? Branch Coverage: Các nhánh của điều kiện có được thực thi không? Assertions: Test có thực sự kiểm tra kết quả mong đợi không? Chúng ta tiếp tục sử dụng ví dụ tính phí trả sách trễ hạn trong hệ thống quản lý thư viện. 1. Nhắc lại logic của LibraryService Ở Day 1, chúng ta đã xây dựng phương thức CalculateLateFee với quy tắc nghiệp vụ: Trả sách đúng hạn: không tính phí. Trễ hạn: tính 5.000 VNĐ cho mỗi ngày trễ. Số ngày trễ âm: dữ liệu không hợp lệ, cần ném ArgumentException . Mã nguồn của LibraryService.cs như sau: namespace LibraryManagement; public class LibraryService { ...