我正在做一个laravel项目,该项目有8000多行代码和550个单元测试,覆盖率约为75%。运行代码覆盖率报告需要35分钟,这使得与持续集成环境的集成成为不可能。phpunit花这么长时间为这么大的项目生成覆盖率报告是正常的吗?有人知道有什么方法可以提高覆盖率报告的运行速度吗?我已经看了另一个问题和这篇文章,但都没有被证明是有用的。增加php脚本的最大内存限制也没有任何效果。
我的环境是:OSX 10.9.5,xDebug 2.2.7,PHP 5.6.5,PHPUnit 4.1.6
您可以通过phpunit.xml
中的一些配置来筛选将包含在覆盖率报告中的文件。例如,您不需要覆盖框架或其他第三方依赖关系。
你可以将你想要覆盖的文件列入(白名单),也可以将你不想要的文件排除(黑名单)。
开始只包含一些文件,看看是否有什么不同。
从PHPUnit文档复制:
<filter>
<whitelist processUncoveredFilesFromWhitelist="true">
<directory suffix=".php">/path/to/files</directory>
<file>/path/to/file</file>
<exclude>
<directory suffix=".php">/path/to/files</directory>
<file>/path/to/file</file>
</exclude>
</whitelist>
</filter>
当PHPUnit似乎花费了很长时间时,我通常会发现问题是它试图覆盖太多的代码。如果它真的完成了,你可能会发现你也得到了供应商目录中所有库的编号。
在phpunit.xml文件中,我倾向于使用一个完整的过滤器,以确保几乎只有我的主要源代码(在类中)在运行,并收集它们的代码覆盖率。这是我的一个基于Symfony2的项目,包含嵌入式资源。
<?xml version="1.0" encoding="UTF-8"?>
<phpunit
<filter>
<blacklist>
<directory>./vendor/</directory>
<!-- and other directories, -->
</blacklist>
<whitelist>
<directory>./app</directory>
<directory>./src</directory>
<exclude>
<directory>./app/cache/</directory>
<directory>./src/*/*Bundle/Resources</directory>
<directory>./src/*/*Bundle/Tests</directory>
<directory>./vendor/</directory>
</exclude>
</whitelist>
</filter>
在某种程度上,使用这种设置,针对125个src/文件和8800行非注释代码,我需要大约40秒来运行160个测试的子集——440个断言,并生成HTML输出。