Coverage.py – проверка покрытия кода тестами

онлайн тренер по питону
Онлайн-тренажер Python 3 для начинающих

Теория без воды. Задачи с автоматической проверкой. Подсказки на русском языке. Работает в любом современном браузере.

начать бесплатно

Введение

Вы написали тесты. Отлично! Но насколько они действительно покрывают ваш код? Пропущенные условные блоки, неиспользуемые ветви, мёртвый код — всё это может остаться незамеченным. Чтобы это выявить, используется Coverage.py – проверка покрытия кода тестами — утилита для анализа того, какие строки кода выполнялись при тестировании.

Coverage.py позволяет вам увидеть, какие части кода покрыты тестами, а какие — нет. Это особенно важно для поддержки качества, уверенности в рефакторинге и проверки полноты тестов в командной разработке.

Установка и подключение Coverage.py

Установить Coverage.py можно через pip:

bash
pip install coverage

Если вы используете Pytest:

bash
pip install pytest-cov

Основные команды Coverage.py

Запуск анализа покрытия

bash
coverage run my_test_script.py

С Pytest:

bash
pytest --cov=my_module tests/

Просмотр отчёта в терминале

bash
coverage report

Выводит таблицу с количеством строк, покрытием и процентами.

Генерация HTML-отчёта

bash
coverage html

Затем откройте файл htmlcov/index.html в браузере. Вы увидите строки кода, которые покрыты (зелёные), частично (жёлтые) или не покрыты (красные).

Другие полезные команды

  • coverage erase — удалить старые данные

  • coverage combine — объединить результаты с разных запусков

  • coverage xml — генерация XML-файла для CI-инструментов

Работа с отчетами покрытия

Пример текстового отчета:

markdown
Name Stmts Miss Cover ----------------------------------------- my_module.py 50 10 80%

HTML-отчет:

  • Позволяет визуально изучить, какие строки были выполнены

  • Очень удобен для анализа сложных условий и циклов

Интеграция с Pytest и Unittest

С Pytest:

bash
pytest --cov=my_module tests/

Сразу можно получить HTML:

bash
pytest --cov=my_module --cov-report html

С Unittest:

bash
coverage run -m unittest discover coverage html

Настройка покрытия с помощью .coveragerc

Создайте файл .coveragerc:

ini
[run] branch = True source = my_module [report] omit = tests/* */__init__.py */migrations/*

Это позволяет исключить ненужные файлы и включить анализ ветвлений.

Покрытие условий и ветвлений

По умолчанию coverage измеряет строки, а не ветви условий (if, elif, else). Для этого добавьте:

ini
[run] branch = True

Теперь можно увидеть, покрываются ли все варианты условий.

Проверка недостижимого кода

Coverage покажет строки, которые не были выполнены:

python
def divide(a, b): if b == 0: return None return a / b

Если вы не проверяете b == 0, Coverage выделит соответствующую строку как неиспользуемую.

Отчёты по модулям и пакетам

Coverage можно использовать для анализа:

  • Отдельных файлов

  • Групп пакетов

  • Визуального сравнения покрытия разных компонентов

Также можно задать порог покрытия, ниже которого Pytest выдаст ошибку:

bash
pytest --cov=my_module --cov-fail-under=90

Интеграция с CI/CD

GitHub Actions:

yaml
- name: Run coverage run: | pip install coverage coverage run -m pytest coverage report coverage xml

Затем можно использовать сервисы вроде Codecov или Coveralls для загрузки результатов и анализа в PR.

GitLab CI:

yaml
test: script: - coverage run -m pytest - coverage report - coverage xml

Интеграция с VS Code, PyCharm и другими IDE

PyCharm

  • Поддерживает Coverage из коробки

  • Результаты отображаются цветом в редакторе

VS Code

  • Установите расширение Python и Coverage Gutters

  • Настройте запуск с coverage и визуализацию отчётов

Использование вместе с TDD

Coverage отлично дополняет подход "сначала тесты":

  • Помогает понять, написали ли вы тест для каждой новой функции

  • Позволяет выявить избыточный код без тестов

Советы по интерпретации отчётов

  • 100% покрытие — не гарантия отсутствия багов

  • Важно тестировать граничные случаи, ошибки и исключения

  • Иногда лучше иметь меньше кода, чем 100% покрытия ненужного функционала

Часто задаваемые вопросы (FAQ)

1. Что такое Coverage.py?
Инструмент для анализа покрытия кода тестами в Python.

2. Как включить покрытие ветвлений?
Добавьте branch = True в .coveragerc.

3. Как запустить покрытие с Pytest?
pytest --cov=package --cov-report html

4. Как визуализировать результат?
С помощью coverage html и открытия htmlcov/index.html.

5. Что такое coverage xml?
Создание отчёта в формате XML для CI-интеграции.

6. Как исключить файл из анализа?
Через omit в .coveragerc или # pragma: no cover в коде.

Полный справочник по работе с coverage.py — инструментом измерения покрытия кода тестами в Python

Установка

bash
pip install coverage

Основные команды CLI

Команда Описание
coverage run Запуск программы с измерением покрытия.
coverage report Текстовый отчёт о покрытии.
coverage html Генерация HTML-отчёта.
coverage xml Генерация XML-отчёта для CI.
coverage erase Очистка предыдущих данных покрытия.

Быстрый пример

1. Напиши тест

python
# math_utils.py def add(a, b): return a + b
python
# test_math.py import unittest from math_utils import add class TestAdd(unittest.TestCase): def test_add(self): self.assertEqual(add(2, 3), 5) if __name__ == "__main__": unittest.main()

2. Запусти тест с coverage

bash
coverage run test_math.py coverage report

Пример отчёта

bash
Name Stmts Miss Cover ------------------------------- math_utils.py 2 0 100% test_math.py 5 0 100%

Генерация HTML-отчёта

bash
coverage html

Открой htmlcov/index.html в браузере — ты увидишь визуальное отображение строк, которые были или не были выполнены.


Использование с pytest

bash
coverage run -m pytest coverage report

Игнорирование строк

Добавь # pragma: no cover, чтобы исключить строку из расчётов:

python
def debug(): print("Debugging") # pragma: no cover

Конфигурация (файл .coveragerc)

ini
[run] omit = */tests/* */__init__.py [report] show_missing = True skip_covered = True

Покрытие по пакетам/папкам

bash
coverage run -m unittest discover coverage report --include="myapp/*"

Очистка предыдущих данных

bash
coverage erase

Использование с tox или CI

coverage отлично интегрируется с:

  • CI/CD (GitHub Actions, GitLab, Jenkins),

  • tox (мультиверсионное тестирование),

  • codecov и coveralls (визуализация покрытия).


Когда использовать coverage.py

  • Когда нужно понять, насколько тесты покрывают код.

  • При подготовке релизов, особенно в критичных проектах.

  • Для визуального анализа в HTML и контроля покрытия в CI.

  • Для улучшения тестирования путём обнаружения мёртвого кода.

Заключение

Coverage.py – проверка покрытия кода тестами — это важный инструмент контроля качества. Он помогает не просто узнать, какие строки были выполнены, но и выявить слабые места в тестах, улучшить читаемость, упростить отладку. Это стандартный помощник Python-разработчика, особенно в командах и проектах с высоким уровнем ответственности.