С ростом проекта становится сложно определить, какой код уже протестирован, а какой — еще нет. При этом подобная потребность возникает регулярно. Обычно это происходит тогда, когда не все члены команды ответственно подходят к написанию тестов. В таком случае может страдать качество проекта.
Но есть решение — протестированность кода можно измерить. В этом уроке мы познакомимся с метрикой, которая помогает подсчитать количество тестов и качество тестирования.
Как работает покрытие тестами
В тестировании часто используют метрику 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% — это достаточно хорошее покрытие. На этом можно и остановиться.
Самостоятельная работа
- Клонируйте себе репозиторий python-package и установите зависимости
- Запустите тесты и посмотрите на их вывод
- Добавьте флаг
--cov=hexlet_python_package
при запуске тестов - Посмотрите, как изменился вывод
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.