【发布时间】:2012-04-15 18:50:45
【问题描述】:
我在使用 PHPUnit 时遇到了一个奇怪的问题。我正在与一组开发人员一起开发一个项目,所有这些开发人员都必须使用 PHPUnit 3.6.5。在大多数情况下,我的 PHPUnit 运行良好,并产生与其他开发人员机器相同的结果。但是,我偶尔会发现某行没有覆盖在我的机器上,而是在其他开发人员的机器上。这是最近的一个场景:
- Bob 正在签入他刚刚更新的新文件。他确保该文件的单元测试通过并具有 95% 的代码覆盖率。执行此检查后,他签入文件,在其中构建并运行单元测试。如果服务器上的单元测试失败,我们的构建会变成红色,并且没有人可以签入。
- 服务器运行 phpunit 测试并通过。
- 包括我自己在内的其他开发人员从 perforce 存储库中获取最新信息
-
在进行了自己的一组更改后,我为应用程序运行了所有 phpunit 测试,但我注意到其中一个文件没有足够的代码覆盖率。这是 Bob 刚刚签入的文件。我与团队中的其他一些开发人员进行了核对,该文件通过了代码覆盖率,对他们来说没有任何问题。当我检查代码覆盖率报告时,我看到以下内容:
array_walk( $variable1, function($val,$key) use(&$variableData, &$variable2) { $variableData[$variable2][$key] = 1; } );
$变量1,
函数($val,$key) 使用(&$variableData, &$variable2)
这两行没有覆盖!我不明白为什么我的 phpunit 不想覆盖这些行。一定有一个我不知道的设置导致了这种情况,因为我与其他开发人员拥有相同版本的 PHPUnit,并且它在他们的机器上可以正常通过,但在我的机器上却不行。我在这样的声明中也看到了同样的问题:
if ($var === 1) {
echo 'yes';
} else {
echo 'nope';
}
现在,单元测试将涵盖这两个条件,但是,它不涵盖以下行:
} 其他 {
这有任何意义吗?关于它最奇怪的部分是它大部分时间都在工作,但是有一些地方有这种行为,尽管没有模式可以表明它是什么原因造成的。我让其他开发人员在我的机器上查看了这个问题,他们感到困惑,无法解释是什么原因造成的。问题是,因为它在本地对我来说是失败的,即使我没有接触过 Bob 的文件,它也会阻止我检查我的更改。有没有人遇到过这个问题?我将尝试卸载 php 单元并重新安装它,但除此之外,我无话可说。任何帮助将不胜感激!这是我的规格:
PHPUnit:版本 3.6.5 操作系统:OS X 10.6.8 PHP:PHP 5.3.8-ZS5.5.0(cli)(内置:2011 年 8 月 24 日 11:03:29) Zend 调试器:关闭 XDebug:开启 Zend Optimizer+:关闭
问候,
会
【问题讨论】:
-
我认为 PHPUnit(运行 XDebug)会告诉你哪些行被执行。我认为您的数组遍历线永远不会在解释器看到的情况下执行,同样 } else {。您的同事看到这些与所涵盖的完全相同的行吗?
-
...请仔细阅读您的注释。 Bob 获得了良好的覆盖率,您获取、更改您的代码,但现在覆盖率不正确?如果您获取干净并运行测试会发生什么?为什么你显然相信这不是你改变的?
-
你们都在运行相同的 php/xdebug 版本?
-
Ira Baxter,我相信这与我的更改没有任何关系,因为如果我根本没有更改并从存储库中提取最新的内容,它仍然不会涵盖这些行,但确实如此在其他开发人员机器上。 edorian,我会仔细检查 php 版本和 xdebug,但我确定我们都在运行相同版本的 phpunit。
标签: php phpunit code-coverage