Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Sử dụng Unittest Coverage trong Python
Trong bài viết này, bạn sẽ học cách sử dụng lệnh coverage
của unittest
trong Python để tạo báo cáo về độ bao phủ kiểm thử. Độ bao phủ kiểm thử là một chỉ số quan trọng giúp đánh giá mức độ mà bộ kiểm thử của bạn đã kiểm tra mã nguồn. Bằng cách sử dụng công cụ coverage
, bạn có thể xác định các phần của mã nguồn chưa được kiểm thử và cải thiện chất lượng kiểm thử của mình. Hướng dẫn này sẽ chỉ cho bạn từng bước cụ thể để tạo báo cáo độ bao phủ kiểm thử, giúp bạn có cái nhìn toàn diện và chi tiết về hiệu quả của các bài kiểm thử hiện tại.
Độ bao phủ kiểm thử là gì?
Độ bao phủ kiểm thử là tỷ lệ giữa số dòng mã được thực thi ít nhất một lần bởi một trường hợp kiểm thử và tổng số dòng mã của toàn bộ mã nguồn:
độ bao phủ kiểm thử = số dòng mã được thực thi / tổng số dòng mã
Độ bao phủ kiểm thử thường được sử dụng để đánh giá chất lượng của bộ kiểm thử. Nếu độ bao phủ kiểm thử thấp, ví dụ 5%, điều đó cho thấy bạn chưa kiểm thử đủ.
Tuy nhiên, điều ngược lại không phải lúc nào cũng đúng. Ví dụ, độ bao phủ kiểm thử 100% không đảm bảo rằng bạn có một bộ kiểm thử tốt. Nói cách khác, một bộ kiểm thử có độ bao phủ cao vẫn có thể kém chất lượng.
Bài viết này được đăng tại [free tuts .net]
Ví dụ về độ bao phủ kiểm thử với unittest
Chúng ta sẽ sử dụng cấu trúc dự án sau để minh họa cách sử dụng coverage
với unittest
. Bạn có thể lấy mã nguồn từ hướng dẫn này.
D:\python-unit-testing ├── shapes | ├── circle.py | ├── shape.py | └── square.py └── test ├── test_circle.py ├── test_square.py └── __init__.py
Để tạo báo cáo độ bao phủ, bạn cần thực hiện hai bước:
Bước 1: Chạy mô-đun coverage
để tạo dữ liệu độ bao phủ:
python -m coverage run -m unittest
Bước 2: Biến dữ liệu độ bao phủ thành một báo cáo:
python -m coverage report
Output:
Name Stmts Miss Cover ----------------------------------------- shapes\circle.py 9 0 100% shapes\shape.py 4 0 100% shapes\square.py 9 0 100% test\__init__.py 0 0 100% test\test_circle.py 14 0 100% test\test_square.py 14 0 100% ----------------------------------------- TOTAL 50 0 100%
Để tạo báo cáo độ bao phủ ở định dạng HTML, bạn thay đổi tùy chọn của mô-đun coverage
thành HTML như sau:
python -m coverage html
Output:
Wrote HTML report to htmlcov\index.html
Kết quả cho thấy vị trí của báo cáo độ bao phủ HTML tại htmlcov\index.html
trong thư mục dự án. Nếu bạn mở tệp index.html
trong thư mục htmlcov
, nó sẽ trông như sau:
Xem chi tiết báo cáo độ bao phủ với unittest
Đầu tiên, thêm phương thức perimeter()
vào lớp Circle
như sau:
import math from .shape import Shape class Circle(Shape): def __init__(self, radius: float) -> None: if radius < 0: raise ValueError('The radius cannot be negative') self._radius = radius def area(self) -> float: return math.pi * math.pow(self._radius, 2) def perimeter(self) -> float: return 2 * math.pi * self._radius
Tiếp theo, thu thập dữ liệu độ bao phủ bằng cách chạy lệnh sau:
python -m coverage run -m unittest
Sau đó, tạo báo cáo độ bao phủ bằng lệnh:
python -m coverage report
Output:
Name Stmts Miss Cover ----------------------------------------- shapes\circle.py 11 1 91% shapes\shape.py 4 0 100% shapes\square.py 9 0 100% test\__init__.py 0 0 100% test\test_circle.py 14 0 100% test\test_square.py 14 0 100% ----------------------------------------- TOTAL 52 1 98%
Độ bao phủ hiện tại là 98% tổng thể và 91% trong mô-đun shapes\circle.py
. Điều này là do phương thức perimeter()
chưa được kiểm thử.
Sau đó, tạo báo cáo độ bao phủ ở định dạng HTML:
python -m coverage html