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

Joh*_*ith 8 php xml phpunit

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

phpunit --log-junit output.xml

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

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

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

Cou*_*les 5

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

如果您的白名单中有很多文件,这可能会增加很多时间来生成代码覆盖率。

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

<phpunit>
    <!-- ... -->
    <filter>
        <whitelist addUncoveredFilesFromWhitelist="false">
            <!-- ... -->
        </whitelist>
    </filter>
</phpunit>
Run Code Online (Sandbox Code Playgroud)

在禁用此设置的情况下,您应该看到生成的代码覆盖率文件仅描述了运行测试的文件。

请注意,PHPUnit文档建议默认addUncoveredFilesFromWhitelistfalse默认设置,但在5.5版上则true默认为。


Pau*_*tor 5

只是为了增加最后的答案.通常,它发生是因为PHPunit看到所有文件,你需要告诉他们不要这样做,如下面的示例:

看看我的过滤器节点到这样的phpunit.xml

<filter>
    <whitelist>
        <directory>../src</directory>
    </whitelist>
</filter>
Run Code Online (Sandbox Code Playgroud)

我需要添加等于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>
Run Code Online (Sandbox Code Playgroud)

注意我的排除列表,其中我排除了所有模块的"Fixture"目录和Bootstrap.php文件

完成这个简单的更改后,我的单元测试从10分钟变为3分钟,所以尽情享受:)


Kry*_*ten 2

这是正常行为。

想想 PHPUnit 在做什么:

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

需要很长时间并不奇怪。