首先,我要说我已经完成了Reaching 100% Code Coverage with PHPUnitSO以及How to get 100% Code Coverage with PHPUnitSO。我无法借助其中任何一个解决问题。
我的问题是,与运行整个测试套件时相比,PHPUnit在隔离运行时为同一测试报告的代码覆盖率不同。因此,当我使用phpunit test/src/artax/UsesRequestTraitTest
仅运行相关的特定测试时,我得到以下报道:
但是,如果我使用phpunit
运行我的全套测试而未指定特定测试,则会收到以下相同文件:
以下是测试的源代码:
<?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。
这可能(可能?)这是xdebug或phpunit中的一个错误,由于对新PHP版本的支持仍在不断发展,但尚未解决,但我想在浪费相关方之前得到其他意见'时间与不必要的错误报告。有没有人知道可能导致这种情况或如何纠正它,所以我的极客OCD并没有让我在100%覆盖范围内对这个差距感到疯狂?
P.S。下面是60%覆盖率版本的实际图形覆盖率报告。当测试单独运行时,下面显示为未覆盖的线条为绿色(覆盖):
更新
我也尝试将特征方法的@covers
注释添加到use
特征的具体类的测试中,但这对...都没有帮助...
答案 0 :(得分: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;
}