Покрытие кода тестами в Python — создание отчета

В этом руководстве рассмотрим, как использовать команду 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, он будет выглядеть следующим образом:

Покрытие юнит-тестом в Python

Изучение подробного отчета о покрытии юнит-тестами

  • Сначала добавьте метод 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

Отчет о покрытии в формате HTML

Circle.py содержит 11 операторов. Тест выполняет 10 из них и пропускает один оператор. Таким образом, покрытие тестами составляет 10/11 ~ 91%.

Наконец, щелкните модуль Circle.py для получения подробного отчета:

Получение подробного отчета

Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *