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

Покрытие кода тестами (Code Coverage) PHP: Автоматическое тестирование

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

Протестированность кода можно измерить. Для этого используют метрику "покрытие кода тестами" (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 позволяет сгенерировать человекочитаемый отчет, который можно просматривать в браузере.

PHPUnit codecoverage report in html format

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

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

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

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

  1. клонируйте себе репозиторий php-package
  2. запустите тесты, посмотрите на их вывод
  3. добавьте флаг --coverage-text при запуске тестов, посмотрите как изменился вывод
  4. добавьте флаг --coverage-html coverage при запуске тестов. Затем откройте созданную директорию coverage и запустите внутри нее файл index.html. Изучите отчет по покрытию.

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

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

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

Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете

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

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

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

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

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

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

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

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы PHP-разработчик
Профессия
Разработка веб-приложений на Laravel
27 октября 8 месяцев

Есть вопрос или хотите участвовать в обсуждении?

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

Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг»