当--coverage-html时,Phpunit非常慢

时间:2014-09-05 09:37:30

标签: php xml phpunit

我正在使用Phpunit。如果我只是运行我的测试:

  

phpunit --log-junit output.xml

这会在一秒钟内运行。但如果我想要代码覆盖:

  

phpunit --coverage-html ./report --log-junit output.xml

然后非常慢,phpunit发送"配置从 * .xml"它会挂起一分钟,然后开始执行测试

5 个答案:

答案 0 :(得分:5)

默认情况下,PHPUnit将评估配置白名单中所有文件的覆盖范围,即使您为单个测试运行PHPUnit也是如此。

如果白名单中有大量文件,这可能会增加很多时间来生成代码覆盖率。

通过将addUncoveredFilesFromWhitelist属性设置为false,您可以通过将PHPUnit配置为仅为您编写/执行测试的文件生成代码覆盖率来加快速度。

<phpunit>
    <!-- ... -->
    <filter>
        <whitelist addUncoveredFilesFromWhitelist="false">
            <!-- ... -->
        </whitelist>
    </filter>
</phpunit>

禁用此设置后,您应该看到生成的代码覆盖率文件仅描述您为其运行测试的文件。

请注意,默认情况下,PHPUnit documentation建议addUncoveredFilesFromWhitelistfalse,但在版本5.5上,默认情况下显示为true

答案 1 :(得分:5)

只是增加最后一个答案。通常,它发生是因为PHPunit看到所有文件,你需要告诉他们不要这样做,如下例所示:

看看我的过滤器节点到这样的phpunit.xml

<filter>
    <whitelist>
        <directory>../src</directory>
    </whitelist>
</filter>

我需要添加等于false的addUncoveredFilesFromWhitelist并添加我需要排除的所有文件,如下所示:

<filter>
   <whitelist addUncoveredFilesFromWhitelist="false">
        <directory suffix=".php">../src</directory>
        <exclude>
            <directory>../vendor</directory>
            <directory>../anotherpath</directory>
            <directory>../src/Modules/*/Fixture</directory>
            <file>../src/Modules/*/Bootstrap.php</file>
        </exclude>
    </whitelist>
</filter>

注意我的排除列表,其中我排除所有模块的“Fixture”目录和Bootstrap.php文件

完成这个简单的更改后,我的单元测试从10分钟变为3分钟,所以尽情享受:)

答案 2 :(得分:3)

当运行具有代码覆盖率的phpunit时,影响速度最大的事情是,对于每个测试方法,phpunit使用带有XDEBUG_CC_UNUSEDXDEBUG_CC_DEAD_CODE的xdebug,它会检查死的和未使用的代码在特定测试执行期间触及的每个文件中。这包括供应商类,测试类,phpunit框架类以及白名单之外的任何其他类。 phpunit实际上只关心被测试的主题(或白名单中的类)。我正在调整代码覆盖率,以便更聪明地运行带有2个提到的标志的xdebug,所以它只是困扰检查phpunit关心的文件的死和未使用的代码。您可以在此查看进度。 https://github.com/sebastianbergmann/php-code-coverage/pull/387

答案 3 :(得分:2)

这是正常行为。

想想PHPUnit在做什么:

它正在运行您的测试,跟踪执行每个代码行,然后获取所有原始数据(每行执行的次数)并构建通过阅读代码并将其重新格式化为HTML来报告,并补充所有执行数据。

这需要很长时间,这并不奇怪。

答案 4 :(得分:1)

phpdbg比xdebug快得多的时间

有关更多信息,请查看以下链接 https://hackernoon.com/generating-code-coverage-with-phpunite-and-phpdbg-4d20347ffb45

Linux的安装过程:

sudo apt-get update -y
sudo apt-get install -y php-phpdbg

有关更多信息,请查看以下链接 https://zoomadmin.com/HowToInstall/UbuntuPackage/php-phpdbg

生成代码覆盖率

phpdbg -qrr vendor/bin/phpunit --coverage-html ./var/log

我希望它对每个人都非常有用。