PYTHON UNIT TESTING
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

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.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Độ 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:

python unittest coverage png

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

python unittest coverage example png

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

python unittest coverage detail 20 1  png

Kết bài

Trong bài viết này, mình đã tìm hiểu cách sử dụng công cụ coverage để đánh giá độ bao phủ kiểm thử của mã nguồn Python. Bằng cách sử dụng lệnh python -m coverage run -m unittest, chúng ta có thể thu thập dữ liệu về độ bao phủ của các bài kiểm thử. Sau đó, lệnh python -m coverage report cho phép chúng ta tạo báo cáo chi tiết về độ bao phủ dưới dạng văn bản. Cuối cùng, lệnh python -m coverage html giúp mình tạo báo cáo độ bao phủ ở định dạng HTML, cung cấp một giao diện trực quan và dễ dàng phân tích. Việc sử dụng công cụ coverage không chỉ giúp mình đảm bảo rằng các phần quan trọng của mã nguồn đã được kiểm thử mà còn cung cấp thông tin chi tiết để cải thiện chất lượng bộ kiểm thử. Hãy áp dụng những kiến thức này vào dự án của bạn để nâng cao hiệu quả kiểm thử và chất lượng mã nguồn.

Cùng chuyên mục:

Sử dụng câu lệnh raise from trong Python

Sử dụng câu lệnh raise from trong Python

Ngoại lệ tùy chỉnh trong Python

Ngoại lệ tùy chỉnh trong Python

Ngoại lệ Raise trong Python

Ngoại lệ Raise trong Python

Tìm hiểu về các ngoại lệ trong Python

Tìm hiểu về các ngoại lệ trong Python

Tìm hiểu về decorator dataclass trong Python

Tìm hiểu về decorator dataclass trong Python

Ví dụ sử dụng metaclass trong Python

Ví dụ sử dụng metaclass trong Python

Lớp Metaclass trong Python

Lớp Metaclass trong Python

Tìm hiểu về Class Type trong Python

Tìm hiểu về Class Type trong Python

Phương thức __new__ trong Python

Phương thức __new__ trong Python

Phân biệt Data Descriptor và Non-data Descriptor trong Python

Phân biệt Data Descriptor và Non-data Descriptor trong Python

Mô tả Descriptors trong Python

Mô tả Descriptors trong Python

Tìm hiểu về các lớp mixin trong Python

Tìm hiểu về các lớp mixin trong Python

Đa kế thừa trong Python

Đa kế thừa trong Python

Nguyên tắc đảo ngược sự phụ thuộc trong Python

Nguyên tắc đảo ngược sự phụ thuộc trong Python

Interface Segregation Principle - ISP trong Python.

Interface Segregation Principle - ISP trong Python.

Nguyên tắc thay thế Liskov - LSP trong Python

Nguyên tắc thay thế Liskov - LSP trong Python

Nguyên tắc Đóng-Mở trong Python

Nguyên tắc Đóng-Mở trong Python

Single Responsibility Principle trong Python

Single Responsibility Principle trong Python

Cách sử dụng hàm Auto() của Python

Cách sử dụng hàm Auto() của Python

Tùy chỉnh và mở rộng lớp Enum trong Python

Tùy chỉnh và mở rộng lớp Enum trong Python

Top