Code coverage (покрытие кода) - это метрика, которая показывает, какая часть вашего кода выполняется во время выполнения тестов. Она помогает выявить области кода, которые не протестированы, и, следовательно, могут содержать ошибки.
Для использования code coverage с unittest
и pytest
в Python, обычно применяется библиотека coverage.py
.
Использование с unittest
:
coverage
:pip install coverage
unittest
тесты, используя команду coverage run
:coverage run -m unittest discover -s tests -p "*.py"
Здесь:
coverage run
запускает Python скрипт под контролем coverage.py
.-m unittest discover
запускает обнаружение и запуск тестов unittest
.-s tests
указывает каталог, в котором искать тесты (в данном случае, папка "tests").-p "*.py"
задаёт шаблон файлов для поиска тестов.coverage report -m
Эта команда выводит отчет в консоль, показывающий процент покрытия для каждого файла и пропущенные строки кода (если они есть). Опция -m
показывает номера строк, которые не покрыты тестами.
coverage html
Эта команда создаст каталог htmlcov
с интерактивным HTML отчетом.
Использование с pytest
:
coverage
и плагин pytest-cov
:pip install pytest-cov
pytest
с опциями для coverage:pytest --cov=myproject --cov-report term-missing
Здесь:
--cov=myproject
указывает, какой пакет/модуль нужно измерять на покрытие (замените myproject
на имя вашего проекта). Можно указать несколько --cov
для нескольких пакетов.--cov-report term-missing
выводит отчет в терминал и показывает строки, которые не покрыты тестами. Другие возможные опции для отчета: term
(только сводка), html
(HTML отчет), xml
(XML отчет).html
при запуске pytest
, можно сгенерировать HTML отчет отдельно:coverage html
Эта команда также создаст каталог htmlcov
с HTML отчетом.
Важные моменты:
.coveragerc
файл: Можно настроить coverage.py
с помощью файла .coveragerc
, чтобы исключить из отчета определенные файлы или строки (например, логи, дебаг-код, boilerplate код). Пример файла:
[run]
omit =
*/migrations/*
*/__init__.py
[report]
exclude_lines =
pragma: no cover
if __name__ == '__main__':
if TYPE_CHECKING: