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: