С ростом проекта, определить какой код протестирован, а какой нет, становится сложно, хотя подобная потребность возникает регулярно. Обычно это происходит тогда, когда в команде есть разные люди и не все из них ответственно подходят к написанию тестов. В таком случае может страдать качество проекта.
Протестированность кода можно измерить. Для этого используют метрику "покрытие кода тестами" (code coverage). Покрытие анализируется тестовыми фреймворками, которые считают отношения строчек, задействованных в тестах, ко всем строчкам исходного кода. Например, если в коде есть условная конструкция, и она не проверяется тестами, это значит, что все строки кода, входящие в неё, не будут покрыты.
Для работы покрытия в PHPUnit необходимо установить расширение xdebug. Проще всего его установить через командную строку:
# https://pecl.php.net/
pecl install xdebug
В PHPUnit покрытие меряется крайне просто. Достаточно запустить тесты с флагом --coverage-text
:
# Пример пакета https://github.com/hexlet-boilerplates/php-package
cd php-package
composer exec --verbose phpunit tests -- --coverage-text
PHPUnit 9.5.1 by Sebastian Bergmann and contributors.
. 1 / 1 (100%)
Time: 00:00.058, Memory: 12.00 MB
OK (1 test, 2 assertions)
Code Coverage Report:
2021-01-20 02:14:24
Summary:
Classes: 50.00% (1/2)
Methods: 75.00% (3/4)
Lines: 83.33% (5/6)
Php\Package\App
Methods: 0.00% ( 0/ 1) Lines: 0.00% ( 0/ 1)
Php\Package\User
Methods: 100.00% ( 3/ 3) Lines: 100.00% ( 5/ 5)
После выполнения всех тестов, PHPUnit выводит сводную таблицу. В ней показан процент покрытия кода тестами. В примере выше видно что в классе PHP\Package\User покрыто 100% кода, а вот класс PHP\Package\App не тестируется вообще, так как покрытие 0%. При этом общее покрытие кода 83.33%. Обратите внимание, что покрытие сильно зависит от того, какие тесты выполнились. Если часть из них упала с ошибками, то PHPUnit покажет намного меньшее покрытие, так как тесты просто не доберутся до всего кода. Поэтому покрытие измеряют только тогда, когда все тесты зелёные.
Различные флаги для генерации отчетов позволяют генерировать отчеты в разных форматах. Флаг -coverage-html /path/to/report
позволяет сгенерировать человекочитаемый отчет, который можно просматривать в браузере.
Эта статистика помогает найти места, где тестов мало. Дальше по ситуации их можно начинать добавлять. Если в проекте тестов не было вообще, то эта статистика начинает быстро расти. А вот дальше, ближе к 90 процентам, придётся бороться за каждую строчку кода.
Однако покрытие само по себе не гарантирует, что покрытый код работает правильно во всех ситуациях. Логические ошибки в коде невозможно отследить только покрытием. Для этого нужны тесты на одну и ту же функциональность, но с разным набором данных. Как правило, это тесты на пограничные случаи. В разработке есть хорошая практика: перед тем как чинить баги, сначала нужно написать тесты, которые их воспроизводят, и только затем уже можно починить их.
Какое покрытие считается допустимым? 100% покрытия выглядит красиво, но добиться его невероятно сложно. И для большинства проектов бессмысленно. Затраченные усилия не окупятся. Большинство разработчиков сходится во мнении, что 80% — это достаточно хорошее покрытие. На этом можно и остановиться.
--coverage-text
при запуске тестов, посмотрите как изменился вывод--coverage-html coverage
при запуске тестов. Затем откройте созданную директорию coverage и запустите внутри нее файл index.html. Изучите отчет по покрытию.Вам ответят команда поддержки Хекслета или другие студенты.
Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.
Загляните в раздел «Обсуждение»:
Статья «Ловушки обучения»
Вебинар «Как самостоятельно учиться»
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.
Наши выпускники работают в компаниях:
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.
Зарегистрируйтесь или войдите в свой аккаунт