Laravel代码覆盖非常慢


Laravel code coverage very slow

我正在做一个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输出。