Покрытие кода тестами в Python — создание отчета
В этом руководстве рассмотрим, как использовать команду Python unittest Coverage для создания отчета о тестовом покрытии.
- Что такое тестовое покрытие в Python?
- Пример Unittest coverage
- Изучение подробного отчета о покрытии юнит-тестами
Что такое тестовое покрытие в Python?
Тестовое покрытие в Python — это соотношение количества строк, выполняемых хотя бы одним тест-кейсом, к общему количеству строк кодовой базы:
test coverage = lines of code executed / total number of lines
Тестовое покрытие также известно как покрытие кода тестами. Часто используется для оценки качества набора тестов. Если покрытие тестированием низкое, например 5%, это показатель того, что вы недостаточно тестируете.
Однако обратное может быть неверным. Например, 100% тестовое покрытие не является гарантией того, что у вас хороший набор тестов. Другими словами, набор тестов с высоким покрытием все равно может быть низкого качества.
Пример Unittest coverage
Мы будем использовать следующую структуру проекта для демонстрации unittest coverage. Обратите внимание, что вы можете получить исходный код из этого руководства.
D:\python-unit-testing ├── shapes | ├── circle.py | ├── shape.py | └── square.py └── test ├── test_circle.py ├── test_square.py └── __init__.py
Для формирования отчета о покрытии необходимо выполнить два шага:
- Сначала запустите модуль coverage, чтобы сгенерировать данные о покрытии:
python -m coverage run -m unittest
- Во-вторых, превратите данные о покрытии в отчет:
python -m coverage report
Выход:
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%
Чтобы создать отчет о покрытии в формате HTML, вы измените опцию модуля покрытия на HTML следующим образом:
python -m coverage html
Выход:
Wrote HTML report to htmlcov\index.html
В выходных данных указывается расположение отчета о покрытии HTML htmlcov\index.html в папке проекта.
Если вы откроете файл index.html в папке htmlcov, он будет выглядеть следующим образом:
Изучение подробного отчета о покрытии юнит-тестами
- Сначала добавьте метод Perimeter() в класс Circle следующим образом:
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
- Затем соберите данные о покрытии, выполнив следующую команду:
python -m coverage run -m unittest
- Затем создайте отчет о покрытии, выполнив следующую команду:
python -m coverage report
Выход:
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%
Покрытие сейчас составляет 98 % в целом и 91 % в модуле shape\circle.py. Это связано с тем, что метод perimeter() не тестировался.
После этого сгенерируйте отчет о покрытии в формате HTML:
python -m coverage html
Circle.py содержит 11 операторов. Тест выполняет 10 из них и пропускает один оператор. Таким образом, покрытие тестами составляет 10/11 ~ 91%.
Наконец, щелкните модуль Circle.py для получения подробного отчета: