首页 文章

当单独运行时,PHPUnit报告同一测试的不同代码覆盖率%

提问于
浏览
4

首先,让我说我经历了Reaching 100% Code Coverage with PHPUnitSO以及How to get 100% Code Coverage with PHPUnitSO . 我无法借助其中任何一个解决问题 .

我的问题是,与运行整个测试套件时相比,PHPUnit在隔离运行时报告了相同测试的不同代码覆盖率% . 因此,当我使用 phpunit test/src/artax/UsesRequestTraitTest 仅运行相关的特定测试时,我得到以下覆盖:

enter image description here

但是,如果我使用 phpunit 运行我的全套测试而未指定特定测试,则会收到以下相同文件:

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和最新的2.2 xdebug trunk版本,因为xdebug的发行版本还不支持PHP5.4 .

由于对新PHP版本的支持仍在不断发展,我们已经解决了这个问题,但是我想在浪费有关方面的时间和不必要的错误报告之前得到其他意见 . 有没有人知道什么可能导致这个或如何纠正它所以我 geek OCD doesn't drive me insane over this gap in 100% coverage?

附:下面是60%覆盖率版本的实际图形覆盖率报告 . 当测试单独运行时,下面显示为未覆盖的线为绿色(覆盖):

enter image description here

UPDATE

我也尝试将特征方法的 @covers 注释添加到具体类的测试 use 这个特性,但这也没有帮助......

1 回答

  • 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;
    }
    

相关问题