2011-08-04 3 views
3

저는 PHPUnit 3.5.14를 사용하고 있으며 특정 부분을 제외한 PHP 응용 프로그램을 100 % 포함하는 테스트를 // @codeCoverageIgnore [Start | End]로하고 있습니다. HTML 적용 범위 보고서는 100 % 적용 범위를 보여줍니다. 그러나 Jenkins가 100 % 적용 범위 요구 사항을 시행하기 위해 읽으려는 클로버 XML 커버리지 보고서를 생성 할 때 모든 무시 된 코드가 표시되지 않은 것으로 표시됩니다.PHPUnit codeCoverageIgnore로 인해 HTML 및 클로버 적용 범위 보고서가 다릅니다

그림 : html로 커버리지 보고서가 덮여 완전히 무시 하나를 포함하는 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 

:

예를 들어, I는 다음과 같습니다 중 하나 (20 개) 방법과 컨트롤러 클래스가 : 적용 범위 보고서 발췌

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

그러나 클로버 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 있습니다.)

<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> 

I :

내 phpunit을 구성의 로깅 섹션은 다음과 같습니다 거기에 클로버 범위 로그 항목을 구성하거나 내 범위를 변경하여 코멘트를 무시하는 방법이있어 클로버 보고서가 HTML 보고서와 일치하도록 100 % 적용 범위를 표시합니까?

답변

2

이 문제는 PHP_CodeCoverage_Report_Clover::process()에 있습니다. 메서드에서 줄 수를 합산하는 동안 표시된 줄을 올바르게 무시하지만 PHP_Token_Stream에서 메서드 목록을 가져 와서 해당 코드 적용 주석에 대해 알지 못합니다. Github에서 issue #54을 만들었습니다. 비교적 쉽게 수정해야합니다.

BTW의 PHP_CodeCoverage::getLinesToBeIgnored()PHP_CodeCoverage_Report_Clover입니다. @codeCoverageIgnore을 해당 docblock에 추가하면 전체 클래스 또는 메소드를 무시할 수있는 것처럼 보입니다.

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

이 문제는 해결되지 않지만 일치하는 // 개의 의견을 사용하는 것보다 쉽습니다.이 수정 된 버전으로 PHP_CodeCoverage_Report_Clover::process() 내부의 방법을 통해 foreach 루프를 교체, 수정을 시도 할 경우

업데이트

.

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 
     ); 
    } 
} 
+0

변경 사항은 100 % 적용 범위를 나타내는 보고서를 제공하고 해당 요구 사항을 자동화 할 수 있어야하므로 내 문제를 수정합니다. 감사합니다. 그리고 docblock 팁에 감사드립니다. 그러나이 변경 사항은 다음과 같습니다. 'metrics methods = "19"coveredmethods = "19"조건문 = "0"coveredconditionals = "0"statements = "532"coveredstatements = "532"elements = "551"coveredelements = 551 "/> 그래서 무시 된 코드는 존재하지 않는 것으로 간주하지만 HTML 보고서는이를 덮어 쓴 것으로 간주합니다. 아마 두 가지가 일치해야합니다. –

+0

나는 충분한주의를 기울이지 않았다. 주석처럼 무시 된 코드를 죽은 코드로 처리하는 HTML 보고서를 선호합니다. 코드를 무시한다는 것은 "이 코드가 올바른 것으로 입증되었습니다."가 아니라 "이 코드를 테스트 할 수 없습니다"를 의미합니다. –

+0

동의합니다. Sebastian이이 문제에 대해 어떻게 느끼는지 확실하지 않습니다. 나는이 문제가 결코 과거에 제기 된 적이 없다고 상상할 수 없습니다. –