Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Покрытие кода тестами Python: Автоматическое тестирование

С ростом проекта становится сложно определить, какой код уже протестирован, а какой — еще нет. При этом подобная потребность возникает регулярно. Обычно это происходит тогда, когда не все члены команды ответственно подходят к написанию тестов. В таком случае может страдать качество проекта.

Но есть решение — протестированность кода можно измерить. В этом уроке мы познакомимся с метрикой, которая помогает подсчитать количество тестов и качество тестирования.

Как работает покрытие тестами

В тестировании часто используют метрику code coverage — это покрытие кода тестами. Покрытие анализируется тестовыми фреймворками, которые считают отношения строчек, задействованных в тестах, ко всем строчкам исходного кода.

Например, если в коде есть условная конструкция, не проверенная тестами, то все строки кода в этой конструкции будут не покрытыми.

В Pytest покрытие измеряется крайне просто. Достаточно установить одну зависимость и запустить тесты с правильным флагом:

poetry add pytest-cov

poetry run pytest --cov

# Примерный вывод
tests/test_example.py ..      [ 66%]
tests/test_hexlet_pytest.py . [100%]

Name                        Stmts   Miss  Cover
-----------------------------------------------
hexlet_pytest/__init__.py       1      0   100%
hexlet_pytest/example.py        4      1    75%
-----------------------------------------------
TOTAL                           5      1    80%

После всех тестов Pytest выводит сводную таблицу по каждому файлу. В ней показан процент покрытия кода тестами.

В примере выше видно, что в файле _init_.py покрыто 100% кода, а вот в файле example.py — только 75%. При этом общее покрытие кода 80%.

Обратите внимание, что покрытие сильно зависит от того, какие тесты выполнились. Если часть тестов упало с ошибкой, то Pytest покажет намного меньшее покрытие — тесты просто не доберутся до всего кода. Поэтому покрытие измеряют только тогда, когда все тесты зеленые.

Эта статистика помогает найти места, где тестов мало. Дальше по ситуации их можно добавлять. Если в проекте тестов не было вообще, то эта статистика начинает быстро расти. А вот дальше, ближе к 90 процентам, придется бороться за каждую строчку кода.

Каким должно быть покрытие

Само по себе покрытие не гарантирует, что код работает правильно во всех ситуациях. Логические ошибки в коде невозможно отследить только покрытием. Для этого нужны тесты на одну и ту же функциональность, но с разным набором данных.

Как правило, это тесты на пограничные случаи. В разработке есть хорошая практика: перед починкой багов нужно написать тесты, которые их воспроизводят, и только затем уже можно чинить эти баги.

Какое покрытие считается допустимым? 100% покрытия выглядит красиво, но добиться его невероятно сложно. Более того, для большинства проектов это бессмысленно — затраченные усилия не окупятся. Большинство разработчиков сходится во мнении, что 80% — это достаточно хорошее покрытие. На этом можно и остановиться.


Самостоятельная работа

  1. Клонируйте себе репозиторий python-package
  2. Запустите тесты и посмотрите на их вывод
  3. Добавьте флаг --cov=hexlet_python_package при запуске тестов
  4. Посмотрите, как изменился вывод

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Об обучении на Хекслете

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
от 6 300 ₽ в месяц
Разработка веб-приложений на Django
10 месяцев
с нуля
Старт 25 апреля

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»