Отчеты о покрытии PHPUnit HTML и Clover различаются из-за codeCoverageIgnore - PullRequest
3 голосов
/ 05 августа 2011

Я использую PHPUnit 3.5.14 и у меня есть набор тестов, который покрывает 100% моего PHP-приложения, исключая определенные части с // @codeCoverageIgnore [Start | End]. Отчет о покрытии HTML показывает 100% охват. Но когда я создаю отчет о покрытии Clover XML, который я хотел бы, чтобы Дженкинс прочитал, чтобы обеспечить соблюдение требования о 100% покрытии, он показывает весь мой игнорируемый код как не покрытый.

Например, у меня есть класс контроллера с 20 методами, один из которых выглядит следующим образом:

// @codeCoverageIgnoreStart
/**
 * Gets an instance of Foo.  Abstracted for testing.
 *
 * @param array $options The constructor argument
 *
 * @return Foo
 */
protected function _getFoo(array $options)
{
    return new Foo($options);
}
// @codeCoverageIgnoreEnd

В отчете о покрытии HTML показано 20 описанных методов, в том числе полностью игнорируемый:

рис .: выдержка из отчета о покрытии

enter image description here http://i.imgur.com/VRtKR.png

Но в отчете Clover XML показано 19/20 описанных методов и не упоминается _getFoo:

<class name="CampaignController" namespace="global" (...)>
  <metrics methods="20" coveredmethods="19" conditionals="0" coveredconditionals="0" statements="532" coveredstatements="532" elements="552" coveredelements="551"/>

...

  <line num="592" type="stmt" count="1"/>
  <line num="593" type="stmt" count="1"/>
  <line num="615" type="method" name="createAction" crap="2" count="2"/>
  <line num="617" type="stmt" count="2"/>

(строки _getFoo вверху - это строки 596-608.)

Раздел ведения журнала моей конфигурации PHPUnit выглядит следующим образом:

<logging>
    <log type="coverage-html" target="../public/build/coverage" charset="UTF-8"
        yui="true" highlight="true" lowUpperBound="90" highLowerBound="100"/>
    <log type="coverage-clover" target="../public/build/test-coverage.xml"/>
</logging>

Есть ли способ настроить запись в журнале покрытия Clover или изменить мое покрытие, игнорируя комментарии, чтобы в отчете Clover отображалось 100% покрытие в соответствии с отчетом HTML?

1 Ответ

2 голосов
/ 05 августа 2011

Проблема заключается в PHP_CodeCoverage_Report_Clover::process(). Хотя он правильно игнорирует отмеченные строки при суммировании количества строк в методе, он получает список методов из PHP_Token_Stream, который не знает об этих комментариях покрытия кода. Я создал проблему # 54 в github, которую относительно легко исправить.

Кстати, читая PHP_CodeCoverage::getLinesToBeIgnored(), который использует PHP_CodeCoverage_Report_Clover, кажется, что вы можете игнорировать весь класс или метод, добавив @codeCoverageIgnore к его блоку документации.

/**
 * Gets an instance of Foo.  Abstracted for testing.
 *
 * @param array $options The constructor argument
 * @return Foo
 *
 * @codeCoverageIgnore
 */

Хотя это не решит проблему, это проще, чем использовать соответствующие // комментарии.

Обновление: Если вы хотите попробовать исправление, замените цикл foreach на методы внутри PHP_CodeCoverage_Report_Clover::process() этой модифицированной версией.

foreach ($_class['methods'] as $methodName => $method) {
    $methodCount        = 0;
    $methodLines        = 0;
    $methodLinesCovered = 0;

    for ($i  = $method['startLine'];
         $i <= $method['endLine'];
         $i++) {
        if (isset($ignoredLines[$i])) {
            continue;
        }

        $add   = TRUE;
        $count = 0;

        if (isset($files[$filename][$i])) {
            if ($files[$filename][$i] != -2) {
                $classStatistics['statements']++;
                $methodLines++;
            }

            if (is_array($files[$filename][$i])) {
                $classStatistics['coveredStatements']++;
                $methodLinesCovered++;
                $count = count($files[$filename][$i]);
            }

            else if ($files[$filename][$i] == -2) {
                $add = FALSE;
            }
        } else {
            $add = FALSE;
        }

        $methodCount = max($methodCount, $count);

        if ($add) {
            $lines[$i] = array(
              'count' => $count,
              'type'  => 'stmt'
            );
        }
    }

    if ($methodLines > 0) {
        $classStatistics['methods']++;

        if ($methodCount > 0) {
            $classStatistics['coveredMethods']++;
        }

        $lines[$method['startLine']] = array(
          'count' => $methodCount,
          'crap'  => PHP_CodeCoverage_Util::crap(
                       $method['ccn'],
                       PHP_CodeCoverage_Util::percent(
                         $methodLinesCovered,
                         $methodLines
                       )
                     ),
          'type'  => 'method',
          'name'  => $methodName
        );
    }
}
...