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:

Hướng dẫn xây dựng Command-Line Interface (CLI) bằng Quo trong Python

Hướng dẫn xây dựng Command-Line Interface (CLI) bằng Quo trong Python

Hướng dẫn toàn diện về module datetime trong Python

Hướng dẫn toàn diện về module datetime trong Python

Cách truy cập và thiết lập biến môi trường trong Python

Cách truy cập và thiết lập biến môi trường trong Python

Lớp dữ liệu (Data Classes) trong Python với decorator @dataclass

Lớp dữ liệu (Data Classes) trong Python với decorator @dataclass

Từ khóa yield trong Python

Từ khóa yield trong Python

Sự khác biệt giữa sort() và sorted() trong Python

Sự khác biệt giữa sort() và sorted() trong Python

Sử dụng Poetry để quản lý dependencies trong Python

Sử dụng Poetry để quản lý dependencies trong Python

Định dạng chuỗi Strings trong Python

Định dạng chuỗi Strings trong Python

Một tác vụ phổ biến khi làm việc với danh sách trong Python

Một tác vụ phổ biến khi làm việc với danh sách trong Python

Làm việc với các biến môi trường trong Python

Làm việc với các biến môi trường trong Python

Sự khác biệt giữa set() và frozenset() trong Python

Sự khác biệt giữa set() và frozenset() trong Python

Sự khác biệt giữa iterator và iterable trong Python

Sự khác biệt giữa iterator và iterable trong Python

Cách làm việc với file tarball/tar trong Python

Cách làm việc với file tarball/tar trong Python

Chuyển đổi kiểu dữ liệu trong Python

Chuyển đổi kiểu dữ liệu trong Python

Sự khác biệt giữa toán tử == và is trong Python

Sự khác biệt giữa toán tử == và is trong Python

Làm việc với file ZIP trong Python

Làm việc với file ZIP trong Python

Cách sử dụng ThreadPoolExecutor trong Python

Cách sử dụng ThreadPoolExecutor trong Python

Sự khác biệt giữa byte objects và string trong Python

Sự khác biệt giữa byte objects và string trong Python

Xử lý độ chính xác các hàm floor, ceil, round, trunc, format  trong Python

Xử lý độ chính xác các hàm floor, ceil, round, trunc, format trong Python

Cách lặp qua nhiều list với hàm zip() trong Python

Cách lặp qua nhiều list với hàm zip() trong Python

Top