0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>В больших проектах сложно с ходу определить, какой код протестирован, а какой - нет. Такая потребность возникает регулярно. Обычно это происходит, когда не все члены команды ответственно подходят к написанию тестов. В таком случае может страдать качество проекта.</p>
1
<p>В больших проектах сложно с ходу определить, какой код протестирован, а какой - нет. Такая потребность возникает регулярно. Обычно это происходит, когда не все члены команды ответственно подходят к написанию тестов. В таком случае может страдать качество проекта.</p>
2
<p>Протестированность кода можно измерить. Для этого используют метрику<strong>покрытие кода тестами</strong>(<em>code coverage</em>). Покрытие анализируется тестовыми фреймворками, которые берут количество строчек, задействованных в тестах, и делят их на количество строчек в проекте. Например, если в коде есть условная конструкция, не покрытая тестами, то все строки кода внутри нее не будут покрыты.</p>
2
<p>Протестированность кода можно измерить. Для этого используют метрику<strong>покрытие кода тестами</strong>(<em>code coverage</em>). Покрытие анализируется тестовыми фреймворками, которые берут количество строчек, задействованных в тестах, и делят их на количество строчек в проекте. Например, если в коде есть условная конструкция, не покрытая тестами, то все строки кода внутри нее не будут покрыты.</p>
3
<p>Для работы покрытия в PHPUnit необходимо установить расширение<a>xdebug</a>. Проще всего его установить через командную строку:</p>
3
<p>Для работы покрытия в PHPUnit необходимо установить расширение<a>xdebug</a>. Проще всего его установить через командную строку:</p>
4
<p>Чтобы убедиться, что xdebug работает, запустим команду php -v. Она покажет версию PHP и расширения:</p>
4
<p>Чтобы убедиться, что xdebug работает, запустим команду php -v. Она покажет версию PHP и расширения:</p>
5
<p>В PHPUnit покрытие меряется крайне просто. Достаточно запустить тесты с флагом --coverage-text:</p>
5
<p>В PHPUnit покрытие меряется крайне просто. Достаточно запустить тесты с флагом --coverage-text:</p>
6
<p>После выполнения всех тестов, PHPUnit выводит сводную таблицу с процентом покрытия кода тестами. В примере выше видно, что в классе<em>PHP\Package\User</em>покрыто 100% кода. Обратите внимание, что покрытие сильно зависит от того, какие тесты выполнились. Если часть из них упала с ошибками, то PHPUnit покажет намного меньшее покрытие - тесты просто не доберутся до всего кода. Поэтому покрытие измеряют, только когда все тесты зеленые.</p>
6
<p>После выполнения всех тестов, PHPUnit выводит сводную таблицу с процентом покрытия кода тестами. В примере выше видно, что в классе<em>PHP\Package\User</em>покрыто 100% кода. Обратите внимание, что покрытие сильно зависит от того, какие тесты выполнились. Если часть из них упала с ошибками, то PHPUnit покажет намного меньшее покрытие - тесты просто не доберутся до всего кода. Поэтому покрытие измеряют, только когда все тесты зеленые.</p>
7
<p>Различные флаги для генерации отчетов позволяют создавать отчеты в разных форматах. Например, флаг --coverage-html /path/to/report создает человекочитаемый отчет, который можно просматривать в браузере:</p>
7
<p>Различные флаги для генерации отчетов позволяют создавать отчеты в разных форматах. Например, флаг --coverage-html /path/to/report создает человекочитаемый отчет, который можно просматривать в браузере:</p>
8
<p>Эта статистика помогает найти места, где тестов мало. Дальше по ситуации их можно начинать добавлять. Если в проекте тестов не было вообще, то эта статистика начинает быстро расти. А вот дальше, ближе к 90 процентам, придется бороться за каждую строчку кода.</p>
8
<p>Эта статистика помогает найти места, где тестов мало. Дальше по ситуации их можно начинать добавлять. Если в проекте тестов не было вообще, то эта статистика начинает быстро расти. А вот дальше, ближе к 90 процентам, придется бороться за каждую строчку кода.</p>
9
<p>Покрытие само по себе не гарантирует, что код работает правильно во всех ситуациях. Логические ошибки в коде невозможно отследить только покрытием. Для этого нужны тесты на одну и ту же функциональность, но с разным набором данных. Как правило, это тесты на пограничные случаи. В разработке есть хорошая практика: перед тем как чинить баги, сначала нужно написать тесты, которые их воспроизводят, и только затем уже можно починить их.</p>
9
<p>Покрытие само по себе не гарантирует, что код работает правильно во всех ситуациях. Логические ошибки в коде невозможно отследить только покрытием. Для этого нужны тесты на одну и ту же функциональность, но с разным набором данных. Как правило, это тесты на пограничные случаи. В разработке есть хорошая практика: перед тем как чинить баги, сначала нужно написать тесты, которые их воспроизводят, и только затем уже можно починить их.</p>
10
<p>Какое покрытие считается допустимым? 100% покрытия выглядит красиво, но добиться его невероятно сложно. И для большинства проектов бессмысленно. Затраченные усилия не окупятся. Большинство разработчиков сходится во мнении, что 80% - это достаточно хорошее покрытие. На этом можно и остановиться.</p>
10
<p>Какое покрытие считается допустимым? 100% покрытия выглядит красиво, но добиться его невероятно сложно. И для большинства проектов бессмысленно. Затраченные усилия не окупятся. Большинство разработчиков сходится во мнении, что 80% - это достаточно хорошее покрытие. На этом можно и остановиться.</p>