Как получить 100% покрытие кода с помощью PHPUnit

Я пишу приложение Zend Framework и модуль, тестирующий его с помощью PHPUnit. В общем, все идет плавно, но у меня небольшая, но раздражающая проблема с PHPUnit и охватом кода – иногда мне говорят, что определенная строка не проверена, и я не знаю, как заставить ее тестироваться.

В следующем коде, например, я запускаю два теста: один с запросом GET, один с запросом POST. Тест проходит, и все в порядке. Однако, когда я смотрю на покрытие кода, это показывает мне, что строка «else» не выполняется.

public function editAction() { if ($request->isPost()) { // do actions related to POST } else { // do action related to GET } } 

Есть идеи? Как побочный вопрос, вы обычно упорствуете с модульными тестами, пока не получите 100% -ный охват кода? Или это не очень практично?

Большое спасибо …

Код, который у вас есть только для комментариев, имеет значение. Закрывающая скобка блока будет показана как исполняемая в отчете о покрытии кода, если можно проскочить до конца. Найдите ветку, которую вы на самом деле не проверяете.

 if ($request->isPost()) { if ($x < 5) { return '<'; } elseif ($x > 5) { return '>'; } // Do you have a test for $x == 5? } 

Что касается цели покрытия 100% кода, я полностью согласен с Биллом. Для некоторых классов классов, которые я пишу, я буду стремиться сделать 100%, но я знаю, что это не значит, что я действительно проверял каждую возможность. Часто, когда я нахожу себя слишком тяжело, чтобы достичь 100% -ного охвата, возможно, это OCD. 🙂

Просто . , , один . , , Больше . , , контрольная работа . , ,

Я был руководителем проекта на Zend Framework несколько лет назад, выпуском ZF 1.0. Я довольно много работал над повышением охвата тестирования для всех компонентов, и у нас была политика, согласно которой компонент должен иметь определенный минимальный охват кода, который должен быть принят в ZF из инкубатора.

Тем не менее, вы правы, пытаясь получить 100% -ый охват кода от тестов для всех ваших классов, не очень практичны. Некоторые из классов в ZF имеют 100% -ный охват, но для них справедливо одно или несколько из следующих утверждений:

  • Класс был тривиально простым.
  • В тестах была написана необычная работа. Например, сложный код установки для создания условий для выполнения всех неясных краевых дел. Посмотрите на модульные тесты для Zend_Db, которые я написал! Хотя полезно заставлять себя проверять эти угловые случаи, потому что я гарантирую, что это приведет вас к коду, который вам нужно исправить.
  • Класс должен был быть реорганизован, чтобы быть более «проверяемым». В любом случае это очень хорошо, потому что вы получаете лучший код OO, с меньшим количеством связей, меньшим количеством статических элементов и т. Д. См. Классы и тесты для Zend_Log.

Но мы также поняли, что 100% -ый охват кода иногда является искусственной целью. Тем не менее, набор тестов, который обеспечивает менее 100% -ный охват загара, может быть адекватным. И набор тестов, который доходит до 100% покрытия, не обязательно гарантирует качество.

Было бы очень легко получить 100% -ный охват кода для следующей функции. Но проверили ли мы деление на ноль?

 function div($numerator, $denominator) { return $numerator / $denominator; } 

Поэтому вы должны использовать охват кода как один показатель тестирования, но не конечную цель.

Если это все, что есть в вашем тесте, я бы предположил, что ваши тесты выглядят так, как сказал Матфей :

 class UserControllerTest extends Zend_Test_PHPUnit_ControllerTestCase { // [...] public function testSomething() { $this->request ->setMethod('POST') ->setPost(array( 'username' => 'foobar', 'password' => 'foobar' )); $this->editAction(); // assertThatTheRightThingsHappend } } 

и в этом случае я не вижу причин, по которым не должно быть легко получить 100% покрытие кода.

Но да: довольно сложно тестировать контроллеры Zend Framework, и в какой-то момент вам нужно либо очень стараться, чтобы получить всю вашу логику приложения из контроллеров или просто жить с ним.

То же самое относится и к вашим моделям. Те, которые должны быть очень легко протестированы, даже в приложении ZF.

Цель, которую охватывает код, заключается в том, что она сообщает вам, какие части вашей базы кода даже не выполняются . Это не говорит вам, что действительно проверено, и может служить лишь «минимумом», чтобы получить представление о качестве вашего набора тестов (если вы не используете @covers, даже если это может вам помочь).

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