1

我已设置phpunit.xml执行以下操作:

<filter>
    <whitelist  addUncoveredFilesFromWhitelist="true" processUncoveredFilesFromWhitelist="true">
       <directory suffix=".php">/my/app</directory>
    </whielist>
</filter> 

我运行测试:

 phpunit -c /path/to/phpunit.xml --coverage-text

但是,我希望永远不要在一个文件中对覆盖率进行评估,因为它会在我的文本测试覆盖率报告中输出一堆垃圾。假设类/方法被命名my\app\Response::render()

此方法的简化版本是:

public function render($response) {
     header($response['status']);
     echo $response['body'];
     echo "\n";
}

render()方法发出一个header() 命令以及许多echo()命令,这些命令在运行覆盖率报告时会引发大量文本和错误--coverage-text

我尝试了以下方法:

  • 添加了注释@codeCoverageIgnore
  • 到我在 xml 中的白名单块,试图排除整个文件:<exclude><file>/my/app/Response.php</file></exclude>

既不阻止该方法被执行(以某种方式)。

我考虑过像在这个方法中添加一些代码来检查我们是否正在通过 phpunit 执行的黑客攻击,比如将代码包装在:

 if(strpos($GLOBALS['argv'][0], 'phpunit') !==false){
     // ... do stuff
 }

或者,就像使用一个好的旧$do_debug变量方法一样,phpunit在 phpunit.xml 中指定的 via 中传递一个环境变量以禁用此代码(这样,如果以后我想运行 phpunit 并让该方法执行,我只需切换环境变量即可)。

这些选项似乎都不优雅。我不喜欢修改我的代码来解决测试问题(我什至有点不高兴在我的方法中添加测试提示注释,我宁愿用某种白/黑名单来处理它)。

但是,当在经过严格审查的一组库中出现一些需要不太优雅的解决方案的感知限制时,我喜欢对照社区检查我的头,看看是否有什么被忽略了。

任何人都知道我如何才能防止这种方法在 Phpunit 的功能范围内被处理?

4

1 回答 1

1

显然,没有被测试显式调用的方法不会被执行——不管有没有processUncoveredFilesFromWhitelist="true". 仅从测试中调用的全局和静态函数;在测试中调用的实例化类的方法;或任何类似于前两项的依赖项堆栈中从测试操作级联的依赖项开始运行(据我所知)。

除非您使用某种形式的模拟、测试替身等...来替换或绕过相关方法,否则在运行单元测试和检查覆盖率时,没有任何东西可以阻止执行被调用的方法。

这完全有道理。

事实证明,在我的情况下,在/my/app目录中某处找到的文件之一是一个普通的 PHP 文件(不是类文件)。

当您指定时processUncoveredFilesFromWhitelist="true",如果该文件有任何全局可执行的 php,它将运行。它实例化的任何类或它调用的方法/函数,就像任何其他代码执行一样。

我正在使用遵循通用 PHP 范例的自定义 MVC Web 框架。里面

  /my/app/public

有一个平原index.php可以实例化一个新的应用程序并执行它。就像是:

<?php

$app = new app\MyApp();
$app->handleRequest();

通过打开processUncoveredFilesFromWhitelist="true" index.php反应,就像它被快速 CGI 请求触发一样,从nginx配置php-fpm为使用文件 - 它启动了应用程序。

我将文件添加/my/app/public/index.php到我的白名单块中:

<filter>
    <whitelist  addUncoveredFilesFromWhitelist="true" processUncoveredFilesFromWhitelist="true">
        <directory suffix=".php">/my/app</directory>
        <exclude>
            <file>/my/app/public/index.php</file>
        </exclude>
    </whitelist>
</filter>
于 2017-01-22T22:38:02.023 回答