Khi viết unit test cho PHP, nhiều đội phát triển thường đặt mục tiêu code coverage ≥ 80%. Tuy nhiên, không phải ai cũng hiểu rõ coverage thực sự có bao nhiêu loại và mỗi loại đo lường điều gì.
Bài viết này sẽ giúp bạn hiểu rõ các loại code coverage phổ biến trong unit test PHP, cũng như cách chúng được sử dụng trong thực tế.
Code Coverage là gì?
Code coverage là chỉ số cho biết bao nhiêu phần trăm code của bạn đã được chạy khi thực hiện unit test.
Trong PHP, coverage thường được đo bằng các công cụ như:
- PHPUnit (framework viết unit test phổ biến)
- Xdebug (extension hỗ trợ debug và đo coverage)
- PCOV (driver chuyên dùng để đo coverage nhanh hơn)
Các công cụ này sẽ phân tích quá trình chạy test và tạo ra báo cáo coverage.
Các loại Code Coverage phổ biến
1. Line Coverage (Statement Coverage)
Đây là loại coverage phổ biến nhất và thường được sử dụng làm chỉ số chính trong nhiều dự án.
Line Coverage đo bao nhiêu dòng code đã được thực thi khi chạy test.
Ví dụ:
if ($a > 0) {
echo "positive";
}Nếu unit test chạy qua dòng echo "positive"; thì dòng này được tính là covered.
Ưu điểm
- Dễ hiểu
- Dễ đo lường
- Được hỗ trợ mặc định bởi PHPUnit
Nhược điểm
- Không đảm bảo test đủ mọi trường hợp logic.
2. Branch Coverage
Branch Coverage đo tất cả các nhánh logic của chương trình đã được test chưa.
Ví dụ:
if ($a > 0) {
echo "positive";
} else {
echo "negative";
}Để đạt 100% branch coverage, unit test phải chạy cả:
$a > 0$a <= 0
Nếu test chỉ chạy một nhánh, line coverage vẫn có thể cao nhưng branch coverage sẽ chưa đủ.
3. Path Coverage
Path Coverage đo tất cả các đường đi logic có thể xảy ra trong chương trình.
Ví dụ:
if ($a > 0) {
if ($b > 0) {
echo "A B";
}
}Các đường đi logic có thể xảy ra:
$a <= 0$a > 0 && $b <= 0$a > 0 && $b > 0
Path coverage thường khó đạt 100% khi chương trình phức tạp, vì số lượng path có thể tăng theo cấp số nhân.
4. Function / Method Coverage
Loại coverage này đo bao nhiêu function hoặc method đã được gọi trong unit test.
Ví dụ:
function add($a, $b) {
return $a + $b;
}
function sub($a, $b) {
return $a - $b;
}Nếu unit test chỉ gọi add() thì:
Function coverage = 50%
5. Class / Trait Coverage
Class coverage đo bao nhiêu class đã được test trong project.
Ví dụ:
- Project có 10 class
- Unit test sử dụng 7 class
Khi đó:
Class coverage = 70%
Trong PHP thực tế thường dùng loại nào?
Khi chạy coverage bằng PHPUnit với Xdebug hoặc PCOV, báo cáo thường bao gồm:
| Metric | Ý nghĩa |
|---|---|
| Lines | Line Coverage |
| Methods | Function / Method Coverage |
| Classes | Class Coverage |
Trong nhiều dự án, Line Coverage là chỉ số được dùng làm mục tiêu chính.
Mục tiêu Coverage phổ biến trong dự án
Một số mục tiêu thường thấy:
- Line Coverage ≥ 80%
- Business Logic quan trọng ≥ 90%
- Các module critical được test kỹ hơn
Tuy nhiên, cần nhớ rằng coverage cao không đồng nghĩa với test tốt. Một test kém chất lượng vẫn có thể tạo ra coverage cao nhưng không thực sự kiểm tra logic của hệ thống.
Kết luận
Có 5 loại code coverage phổ biến trong unit test:
- Line Coverage
- Branch Coverage
- Path Coverage
- Function / Method Coverage
- Class / Trait Coverage
Trong các dự án PHP thực tế, team thường tập trung vào:
- Line Coverage
- Function Coverage
- Class Coverage
và đặt mục tiêu coverage từ 70% – 80% trở lên cho toàn bộ codebase.
Code coverage là một chỉ số hữu ích, nhưng điều quan trọng hơn vẫn là viết test kiểm tra đúng logic và các trường hợp biên của hệ thống.
Bình luận
Bài viết có vấn đề ? Hãy cho chúng tôi biết.
Gửi báo cáo sai phạmHãy để nguồn Sutamedia.com khi phát hành lại nội dung này !
Hãy là nguời đầu tiên bình luận về Có bao nhiêu loại Code Coverage trong Unit Test PHP