我正在使用Phpunit . 如果我只是运行我的测试:
phpunit --log-junit output.xml
这在一秒钟内运行 . 但如果我想要代码覆盖:
phpunit --coverage-html ./report --log-junit output.xml
然后非常慢,phpunit发送“从* .xml读取配置”并挂起一分钟,然后开始执行测试
默认情况下,即使您为单个测试运行PHPUnit,PHPUnit也会评估配置白名单中所有文件的覆盖范围 .
如果白名单中有大量文件,则可能会增加很多时间来生成代码覆盖率 .
通过将 addUncoveredFilesFromWhitelist 属性设置为 false ,可以通过将PHPUnit配置为仅为已编写/执行测试的文件生成代码覆盖率来加快速度 .
addUncoveredFilesFromWhitelist
false
<phpunit> <!-- ... --> <filter> <whitelist addUncoveredFilesFromWhitelist="false"> <!-- ... --> </whitelist> </filter> </phpunit>
禁用此设置后,您应该看到生成的代码覆盖率文件仅描述您运行测试的文件 .
请注意,默认情况下,PHPUnit documentation建议 addUncoveredFilesFromWhitelist 为 false ,但在版本5.5上,默认情况下为 true .
true
只是为了增加最后的答案 . 通常,它发生是因为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分钟,所以尽情享受:)
当运行具有代码覆盖率的phpunit时,影响速度最大的事情是,对于每个测试方法,phpunit使用带有 XDEBUG_CC_UNUSED 和 XDEBUG_CC_DEAD_CODE 的xdebug,它检查在特定测试执行期间触摸的每个文件中的死和未使用的代码 . 这包括供应商类,测试类,phpunit框架类以及白名单之外的任何其他类 . phpunit实际上只关心被测试的主题(或白名单中的类) . 我正在调整代码覆盖率,以便更聪明地运行带有2个提到的标志的xdebug,所以它只是困扰检查phpunit关心的文件的死和未使用的代码 . 您可以在此查看进度 . https://github.com/sebastianbergmann/php-code-coverage/pull/387
XDEBUG_CC_UNUSED
XDEBUG_CC_DEAD_CODE
这是正常行为 .
想想PHPUnit在做什么:
它正在运行您的测试,跟踪 every 执行 every 代码行,然后获取所有原始数据(每行执行的次数)并通过读取代码并将其重新格式化为HTML来构建报告,并补充所有执行数据 .
这需要很长时间,这并不奇怪 .
4 回答
默认情况下,即使您为单个测试运行PHPUnit,PHPUnit也会评估配置白名单中所有文件的覆盖范围 .
如果白名单中有大量文件,则可能会增加很多时间来生成代码覆盖率 .
通过将
addUncoveredFilesFromWhitelist
属性设置为false
,可以通过将PHPUnit配置为仅为已编写/执行测试的文件生成代码覆盖率来加快速度 .禁用此设置后,您应该看到生成的代码覆盖率文件仅描述您运行测试的文件 .
请注意,默认情况下,PHPUnit documentation建议
addUncoveredFilesFromWhitelist
为false
,但在版本5.5上,默认情况下为true
.只是为了增加最后的答案 . 通常,它发生是因为PHPunit看到所有文件,你需要告诉他们不要这样做,如下面的示例:
看看我的过滤器节点到这样的phpunit.xml
我需要添加等于false的addUncoveredFilesFromWhitelist并添加我需要排除的所有文件,如下所示:
注意我的排除列表,其中我排除了所有模块的“Fixture”目录和Bootstrap.php文件
完成这个简单的更改后,我的单元测试从10分钟变为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这是正常行为 .
想想PHPUnit在做什么:
它正在运行您的测试,跟踪 every 执行 every 代码行,然后获取所有原始数据(每行执行的次数)并通过读取代码并将其重新格式化为HTML来构建报告,并补充所有执行数据 .
这需要很长时间,这并不奇怪 .