Как использовать тестирование с покрытием кода (code coverage) в сочетании с `unittest` и `pytest`?

Для `unittest`:
  1. Установите `coverage.py`: `pip install coverage`
  2. Запустите тесты с измерением покрытия: `coverage run -m unittest discover` (или `coverage run your_test_file.py`)
  3. Создайте отчет: `coverage report -m` (консольный) или `coverage html` (HTML отчет)
Для `pytest`:
  1. Установите `pytest-cov`: `pip install pytest-cov`
  2. Запустите тесты с параметром `--cov`: `pytest --cov=.` (измеряет покрытие для текущей директории)
  3. Можно указать конкретные файлы/директории: `pytest --cov=my_module --cov=another_module`
  4. Добавьте параметры для отчета: `--cov-report term` (консольный), `--cov-report html` (HTML), `--cov-report xml` (XML)
Общее:
  • `coverage.py` измеряет, какие строки кода выполняются при прогоне тестов.
  • Отчет показывает процент покрытия кода тестами и позволяет найти непокрытые участки для улучшения качества тестов.

Code coverage (покрытие кода) - это метрика, которая показывает, какая часть вашего кода выполняется во время выполнения тестов. Она помогает выявить области кода, которые не протестированы, и, следовательно, могут содержать ошибки.

Для использования code coverage с unittest и pytest в Python, обычно применяется библиотека coverage.py.

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

  1. Установка: Установите библиотеку coverage:
  2. pip install coverage
  3. Запуск тестов с coverage: Запустите ваши unittest тесты, используя команду coverage run:
  4. coverage run -m unittest discover -s tests -p "*.py"

    Здесь:

    • coverage run запускает Python скрипт под контролем coverage.py.
    • -m unittest discover запускает обнаружение и запуск тестов unittest.
    • -s tests указывает каталог, в котором искать тесты (в данном случае, папка "tests").
    • -p "*.py" задаёт шаблон файлов для поиска тестов.

  5. Создание отчета: Сгенерируйте отчет о покрытии:
  6. coverage report -m

    Эта команда выводит отчет в консоль, показывающий процент покрытия для каждого файла и пропущенные строки кода (если они есть). Опция -m показывает номера строк, которые не покрыты тестами.

  7. Создание HTML отчета: Для более детального анализа можно создать HTML отчет:
  8. coverage html

    Эта команда создаст каталог htmlcov с интерактивным HTML отчетом.

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

  1. Установка: Установите coverage и плагин pytest-cov:
  2. pip install pytest-cov
  3. Запуск тестов с coverage: Запустите pytest с опциями для coverage:
  4. pytest --cov=myproject --cov-report term-missing

    Здесь:

    • --cov=myproject указывает, какой пакет/модуль нужно измерять на покрытие (замените myproject на имя вашего проекта). Можно указать несколько --cov для нескольких пакетов.
    • --cov-report term-missing выводит отчет в терминал и показывает строки, которые не покрыты тестами. Другие возможные опции для отчета: term (только сводка), html (HTML отчет), xml (XML отчет).

  5. Создание HTML отчета (альтернативный способ): Если вы не использовали опцию html при запуске pytest, можно сгенерировать HTML отчет отдельно:
  6. 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:
  • Интерпретация результатов: Высокий процент покрытия не всегда означает хорошее качество тестов. Важно, чтобы тесты проверяли логику кода, а не просто запускали его. Code coverage - это инструмент для выявления областей, требующих внимания, а не самоцель.
  • Непрерывная интеграция (CI): Интеграция code coverage в ваш CI/CD пайплайн позволяет автоматически проверять покрытие кода при каждом изменении кода. Это помогает поддерживать высокое качество тестов. Можно использовать такие сервисы, как Codecov или Coveralls.
0