2012-02-01 7 views
4

まず、Reaching 100% Code Coverage with PHPUnitSOHow to get 100% Code Coverage with PHPUnitSOを通過したとしましょう。私はどちらかの助けを借りて問題を解決することができませんでした。PHPUnitは、孤立して実行されたときに同じテストで異なるコードカバレッジ%を報告します

私の問題は、PHPUnitがテストスイート全体を実行した場合と比較して、同じテストで別のコードカバレッジ%を単独で実行すると報告していることです。私は特定のテストを指定せずにphpunitを使用してテストの私の完全なスイートを実行する場合は、私は次のように受け取る

enter image description here

:私はphpunit test/src/artax/UsesRequestTraitTestを使用して問題の唯一の特定のテストを実行するときに、私は次のカバレッジを取得します同じファイルのために:

enter image description here

ここでは、テスト用のソースコードは次のとおりです。

<?php 

class UsesRequestTraitTest extends PHPUnit_Framework_TestCase 
{ 
    public function testIsInitiallyEmpty() 
    { 
    $traitObj = $this->getObjectForTrait('artax\UsesRequestTrait'); 
    $this->assertAttributeEmpty('request', $traitObj); 
    return $traitObj; 
    } 

    /** 
    * @depends testIsInitiallyEmpty 
    * @covers artax\UsesRequestTrait::setRequest 
    * @covers artax\UsesRequestTrait::getRequest 
    */ 
    public function testSetterAssignsRequestProperty($traitObj) 
    { 
    $r = new artax\blocks\http\HttpRequest(); 
    $traitObj->setRequest($r); 
    $this->assertEquals($r, $traitObj->getRequest()); 
    } 
} 

注意を払った場合は、PHP5.4の特性をテストしていることがわかります。私はPHP5.4RC6を使用しています。また、xdebugのリリース版はまだPHP5.4をサポートしていないため、最新版2.2xdebugトランク版を使用しています。

これはまだあるため、新たなPHPのバージョンについてはまだ進化のサポートで働いていませんxdebugのか、PHPUnitのバグであること(?そうな)ことは可能ですが、私は心配を無駄にする前に、他の意見を取得したいです不必要なバグレポートでパーティーの時間を過ごす。誰もこれを引き起こすかもしれない何考えか、またはそれを修正する方法を私のオタクのOCDは私を100%カバレッジでこのギャップで狂ってしまわないのですか?

P. 60%カバレッジバージョンの実際のグラフィカルカバレッジレポートを表示します。

enter image description here

UPDATE

Iもの試験を形質メソッドの@covers注釈を追加しようとした:以下発見として示される線は、テストが単独で実行されるとき(被覆)緑具体的なクラスはuseですが、これはどちらの特性にも役立ちませんでした。

+0

そのファイルの最後の隔離されたテストのカバレッジのみである可能性がありますか? – hakre

+0

@hakreあなたが何を求めているのか分かりません。それが価値あるものであれば、別のタイプのオブジェクト( '$ request'よりも)を扱う点を除けば、同じ特性の別の特性ファイルに対して同じ動作を経験します...本当に変わったのは、他の2つの特性ファイルが完全なテストスイートがカバレッジを正確に報告する同じテストで同じフォーマット。私は何かが正しく報告する原因となるテストの違いについて何度も見てきましたが、別のテストは正しくないが役立たない。 – rdlowrey

+0

テストを単独で実行すると、コードカバレッジも分離されていると思っています。書き込まれると、おそらく最後のカバレッジデータだけがHTMLに書き込まれます(以前のHTMLダンプを同じファイル名で上書きします)。それが私の言いたいことです。 – hakre

答えて

3

これは、PHPUnitの新しいgetObjectForTraitメソッドがどのように特性ファイルのコードカバレッジを報告するかに問題があるようです。 read about getObjectForTrait over at Sebastian Bergmann's blog.

組み込みのgetObjectForTraitメソッドの代わりに特性をテストするために具体的な実装クラスを使用すると、エラーが表示されなくなります。上記のコードを次のように変更して問題を解決してください:

<?php 

class UsesRequestTraitTest extends PHPUnit_Framework_TestCase 
{ 
    public function testIsInitiallyEmpty() 
    { 
    // trait code coverage not reported correctly using getObjectForTrait 
    //$traitObj = $this->getObjectForTrait('artax\UsesRequestTrait'); 

    // use a concrete implementation instead (see bottom for class definition) 
    $traitObj = new TraitImplementationClass(); 
    $this->assertAttributeEmpty('request', $traitObj); 
    return $traitObj; 
    } 

    /** 
    * @depends testIsInitiallyEmpty 
    * @covers artax\UsesRequestTrait::setRequest 
    * @covers artax\UsesRequestTrait::getRequest 
    */ 
    public function testSetterAssignsRequestProperty($traitObj) 
    { 
    $r = new artax\blocks\http\HttpRequest(); 
    $traitObj->setRequest($r); 
    $this->assertEquals($r, $traitObj->getRequest()); 
    } 
} 

// using this class to test instead of getObjectForTrait resolves the issue 
class TraitImplementationClass 
{ 
    use artax\UsesRequestTrait; 
} 
+0

この修正プログラムは、以下の環境に適用されます。** PHP_CodeCoverage 1.1.1 ** ** PHP 5.4.0RC6 **およびPHPUnit 3.6.10 ** – rdlowrey

+1

+1を使用して研究を報告してください。受け入れ! –

+0

もしあなたがまだいなければ、バグとして報告してください! – cmbuckley

関連する問題