我正在阅读我的项目的代码覆盖率报告,我注意到一些奇怪的事情:一条线被发现,但我确信这条线在测试期间被执行了。所以,我之前添加了一个 var_dump(),这是我在执行测试时得到的:
bool(true)
PHPUnit 3.5.5 by Sebastian Bergmann.
...
这很奇怪。如何在PHPUnit初始化之前执行一行?我相信这就是为什么代码覆盖率表明该行未被发现的原因。
任何提示?
编辑:这是一些代码。它是一个IRC框架,它利用Doctrine Common库来读取注释,还使用 ClassLoader 和 EventDispatcher Symfony组件。这是有罪的方法:/**
* Returns this module's reflection.
*
* @return \ReflectionClass
* @access public
*/
static public function getReflection()
{
// The var_dump() displaying bool(false) is executed before PHPUnit, while the other
// ones are correctly executed.
var_dump(is_null(self::$reflection));
if (null === self::$reflection) {
// This line is reported as uncovered, but it must be executed since I'm
// accessing the reflection!
self::$reflection = new \ReflectionClass(get_called_class());
}
return self::$reflection;
}
您怎么看?
答案 0 :(得分:1)
然后,为什么所有其他的var_dump()(该方法在应用程序中多次执行)显示在PHPUnit的输出之后?为什么即使执行了代码覆盖范围内也没有报告该行?
我假设(但这只是因为你没有显示代码而很难说,因为它与在文件包含上执行的代码相关,而是在执行实际测试函数或实例化测试用例之后)。
答案 1 :(得分:0)
必须在初始化self::$reflection
的单元测试之外调用访问器。之后,对getReflection()
的所有进一步调用都会跳过if
块,因此永远不会被视为已覆盖。在运行任何测试或跟踪代码覆盖率之前,PHPUnit实例化所有测试用例类 - 每个测试方法一个,数据提供者方法和数据提供者参数数组。查找从其构造函数或类本身外部调用getReflection()
的测试用例,其中代码在加载时执行。
我忘了如果在PHPUnit输出版本之前实例化测试用例并且现在无法检查,但我相信是这种情况。另一种可能是您从getReflection()
拨打bootstrap.php
,但您可能已经检查过了。