Покрытие кода xDebug и PHPUnit говорит 100%, на самом деле это не так - PullRequest
3 голосов
/ 16 февраля 2012

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

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

Мой тест для этой функции не охватывает строки, выдающие исключение. Но PHPUnit говорит мне, что первое 'throw'-выражение закрыто, а второе нет. Возможно, первое интерпретируется, но не выполняется.

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

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

Ответы [ 3 ]

5 голосов
/ 16 февраля 2012

Метрики покрытия кода 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
}
2 голосов
/ 16 февраля 2012

Это происходит потому, что 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;. Единственный способ избежать такого поведения - добавить фигурные скобки.

0 голосов
/ 29 февраля 2012

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

У нашего PHP Test Coverage Tool такой проблемы нет.

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

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

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

...