Почему PHPUnit показывает некоторые закрытые фигурные скобки как не охватываемые? - PullRequest
5 голосов
/ 12 января 2012

Я использую PHPUnit 3.6.7, PHP_CodeCoverage 1.1.1 и Xdebug 2.1.2. Когда PHPUnit записывает мою статистику покрытия кода в XML-файл в стиле клевера, он иногда показывает закрывающую фигурную скобку как не покрытую тестами.

Я вижу много дискуссий в Интернете, когда PHPUnit «достигает» тесных фигурных скобок, но я не понимаю общую концепцию происходящего. Например, у меня нулевое покрытие на одну строку здесь:

if (is_array($foo)) {
    foreach ($foo as $bar) {
        if (property_exists($bar, 'baz')) {
            return $bar;
        }
    }
}  // this line has 0 coverage
return null;

А здесь:

class Foo
{
    public $myProperty;
    public function myMethod()
    {
        $this->myProperty = '1';
    }
}  // this line has 0 coverage

Другие классы в моем проекте не имеют этой проблемы; их закрытые фигурные скобки вообще не отображаются в файле XML, поэтому они не указаны как имеющие нулевое покрытие.

Я понимаю, что PHP_CodeCoverage 1.1.2 (еще не выпущен) позволит мне добавить комментарий "// @codeCoverageIgnore" после закрытой фигурной скобки, но пока он не станет доступен, я хочу знать, что происходит, чтобы я мог исправить мои тесты, чтобы дать мне полный охват. Какое эмпирическое правило должно указывать мне, когда фигурные скобки следует считать «покрытыми» или «не покрытыми»?

1 Ответ

4 голосов
/ 12 января 2012

Какое эмпирическое правило говорит мне, когда фигурная скобка должна считаться "покрытой" или "не покрытой"?

Существует "Edge Cases" section in the phpunit documentation но это, по-видимому, не завершено, как я узнал в последние дни просмотра:)

То, что я лично никогда не видел, - это ваш второй пример неудачный.Я также не мог воспроизвести это: я не мог найти комбинацию PHP / xDebug / PHPUnit, где это не сработало.(Воспроизведите ниже)

То же самое относится и к другому случаю, который вы показали.Для всех я мог протестировать обе закрывающие скобки, которые были определены как «не выполнимые / достижимые», как и следовало ожидать.

Так что для обоих этих случаев не нужно // @ codeCoverageIgnore или // @ codeCoverageIgnore [Start | End].

Как @Derick предложил в комментариях для дальнейшего анализа в целомпотребуется файл.


Воспроизвести

<?php

class Foo
{
    public $myProperty;
    public function myMethod()
    {
        $this->myProperty = '1';
    }
}

<?php

require __DIR__ . '/closingBrace.php';

class FooTest extends PHPUnit_Framework_TestCase {

    public function testMyMethod() {
        $x = new Foo();
        $x->myMethod();
    }

}

Запуск phpunit --coverage-text fooTest.php

Code Coverage Report 
  2012-01-12 10:17:32

 Summary: 
  Classes: 100.00% (1/1)
  Methods: 100.00% (1/1)
  Lines:   100.00% (2/2)

, который только отмечает $this->myProperty = '1';, что его закрывающая скобка является исполняемым.

...