Code coverage (покрытие кода) - это метрика, которая показывает, какая часть вашего кода выполняется во время выполнения тестов. Она помогает выявить области кода, которые не протестированы, и, следовательно, могут содержать ошибки.
Для использования code coverage с unittest и pytest в Python, обычно применяется библиотека coverage.py.
Использование с unittest:
coverage:pip install coverageunittest тесты, используя команду 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-covpytest с опциями для 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: