код покрытия xDebug и PHPUnit говорит 100%, на самом деле это не

У меня есть следующая функция:

function foo($p) { if ($p == null) throw new Exception('bla'); if ($p == null) { throw new Exception('bla'); } [...] } 

Мой тест для этой функции не охватывает строки, генерирующие исключение. Но PHPUnit говорит мне, что первый оператор «throw» – это coverd, второй – нет. Может быть, первый интерпретируется, но он не выполняется.

Поэтому я не хочу получать сообщение «100%», если я не достиг 100%.

Это ошибка в xDebug или у меня есть возможность настроить xDebug / PHPUnit?

Показатели покрытия кода xDebug основаны на операторах, а не на основе строк. Это означает, что структура управления без блока, заключенного в фигурные скобки, рассматривается как один оператор. Чтобы xDebug рассматривал линию throw как отдельную от теста if() , окружите ее фигурными скобками, как это было во втором утверждении.

 if ($p == null) // statement 1 throw new Exception('bla'); // rest of statement 1 

против

 if ($p == null) { // statement 1 throw new Exception('bla'); // statement 2 } 

Это происходит из-за того, что xDebug не может предоставлять более качественные данные, поскольку он знает только о операторах, а не о «строках» и документируется в документации PHPUnit в разделе:

Code coverage analysis - Edge Cases :

 <?php // Due to how code coverage works internally these two lines are special. // This line will show up as non executable if(false) // This line will show up as covered because it is actually the // coverage of the if statement in the line above that gets shown here! will_also_show_up_as_coveraged(); // To avoid this it is necessary that braces are used if(false) { this_call_will_never_show_up_as_covered(); } 

То же самое касается $x ? $y : $z; $x ? $y : $z; построить. Единственный способ избежать этого поведения – добавить фигурные скобки.

Его довольно плохо, когда вам нужно изменить свой источник, чтобы преодолеть недостатки используемых вами инструментов.

Наш тестовый инструмент для тестирования PHP не имеет этой проблемы.

Кроме того, если вы разместите несколько операторов в одной строке, наши будут отслеживать их отдельно. Я считаю, что XDebug будет отмечать «линию» как охватываемую, если будет покрыта любая часть первого оператора в строке. Я считаю, что это будет сделано даже для следующего:

 if (... ) { .... } 

Таким образом, вы получите сообщение об ошибке «false» для блока, управляемого условным, даже если условное значение всегда ложно.