我正在使用Phpunit。如果我只是运行我的测试:
phpunit --log-junit output.xml
这会在一秒钟内运行。但如果我想要代码覆盖:
phpunit --coverage-html ./report --log-junit output.xml
然后非常慢,phpunit发送"配置从 * .xml"它会挂起一分钟,然后开始执行测试
答案 0 :(得分:5)
默认情况下,PHPUnit将评估配置白名单中所有文件的覆盖范围,即使您为单个测试运行PHPUnit也是如此。
如果白名单中有大量文件,这可能会增加很多时间来生成代码覆盖率。
通过将addUncoveredFilesFromWhitelist
属性设置为false
,您可以通过将PHPUnit配置为仅为您编写/执行测试的文件生成代码覆盖率来加快速度。
<phpunit>
<!-- ... -->
<filter>
<whitelist addUncoveredFilesFromWhitelist="false">
<!-- ... -->
</whitelist>
</filter>
</phpunit>
禁用此设置后,您应该看到生成的代码覆盖率文件仅描述您为其运行测试的文件。
请注意,默认情况下,PHPUnit documentation建议addUncoveredFilesFromWhitelist
为false
,但在版本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_UNUSED
和XDEBUG_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
我希望它对每个人都非常有用。