【问题标题】:PHPUnit code coverage doesn't include certain linesPHPUnit 代码覆盖率不包括某些行
【发布时间】: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


【解决方案1】:

xdebug 将可执行和执行的行报告给 PHPUnit。不同版本的 xdebug 可能在报告的行中有所不同。

如果您觉得它们不正确,请提供一个简单的测试用例并在xdebug's issue tracker 处打开一个错误。

【讨论】:

    猜你喜欢
    • 2019-08-13
    • 1970-01-01
    • 2012-05-04
    • 2022-11-08
    • 2013-12-07
    • 2018-05-29
    • 2012-08-04
    • 1970-01-01
    • 2012-01-18
    相关资源
    最近更新 更多