首页 文章

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

提问于
浏览
8

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

phpunit --log-junit output.xml

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

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

然后非常慢,phpunit发送“从* .xml读取配置”并挂起一分钟,然后开始执行测试

4 回答

  • 2

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

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

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

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

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

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

  • 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分钟,所以尽情享受:)

  • 3

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

  • 5

    这是正常行为 .

    想想PHPUnit在做什么:

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

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

相关问题