Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Phpunit在--coverage html时非常慢_Php_Xml_Phpunit - Fatal编程技术网

Phpunit在--coverage html时非常慢

Phpunit在--coverage html时非常慢,php,xml,phpunit,Php,Xml,Phpunit,我正在使用Phpunit。如果我只是使用以下工具运行测试: phpunit—日志junit output.xml 这将在一秒钟内完成。但如果我想要代码覆盖率: phpunit--coverage html./report--log junit output.xml 然后它非常慢,phpunit发送“从*.xml读取配置”并挂起一分钟,然后开始执行测试,这是正常行为 想想PHPUnit在做什么: 它运行您的测试,跟踪每行代码的执行,然后获取所有原始数据(每行执行的次数),并通过读取您的代码并将其重

我正在使用Phpunit。如果我只是使用以下工具运行测试:

phpunit—日志junit output.xml

这将在一秒钟内完成。但如果我想要代码覆盖率:

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


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

想想PHPUnit在做什么:

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


这并不奇怪,它需要很长的时间。

在使用代码覆盖率运行phpunit时,对速度影响最大的是,对于每种测试方法,phpunit都使用xdebug和
xdebug\u CC\u UNUSED
xdebug\u CC\u DEAD\u code
,它检查在特定测试执行期间所接触的每个文件中是否存在死代码和未使用的代码。这包括供应商类、测试类、phpunit框架类和白名单之外的任何其他类。phpunit实际上只关心被测对象(或白名单中的类)。我正在调整代码覆盖率,以便更明智地使用上面提到的2个标志运行xdebug,因此它只需要检查phpunit关心的文件中的死代码和未使用的代码。你可以在这里查看进度

默认情况下,PHPUnit将评估配置的白名单中所有文件的覆盖率,即使您为单个测试运行PHPUnit也是如此

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

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

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

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


请注意,建议的
addUncoveredFilesFromWhitelist
默认为
false
,但在5.5版上,默认为
true

只是增加最后一个答案。通常,发生这种情况是因为PHPunit无法看到所有文件,您需要告诉他们不要这样做,如下示例:

像这样查看phpunit.xml中的过滤器节点

<filter>
    <whitelist>
        <directory>../src</directory>
    </whitelist>
</filter>

../src
我需要将addUncoveredFilesFromWhitelist添加为false,并添加我需要排除的所有文件,如下所示:

<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>

../src
../供应商
../另一条路
../src/Modules/*/Fixture
../src/Modules/*/Bootstrap.php
请注意我的排除列表,其中排除了所有模块的“Fixture”目录和Bootstrap.php文件


在做了这些简单的更改之后,我的单元测试从10分钟变为3分钟,所以请享受:)

phpdbg比xdebug快得多

欲了解更多信息,请查看下面的链接

linux的安装过程:

sudo apt-get update -y
sudo apt-get install -y php-phpdbg
欲了解更多信息,请查看下面的链接

生成代码覆盖率

phpdbg -qrr vendor/bin/phpunit --coverage-html ./var/log


我希望它对每个人都非常有用

构建代码覆盖率数据会比较慢,这有什么问题?只有在希望itI理解调试会使代码覆盖率报告变得更慢时,才能构建代码覆盖率报告。但它的速度要慢100000000000倍……我认为这可能是xDebug的速度慢的问题,而不是PHPUnit的问题。
xdebug\u start\u code\u coverage()
函数具有
xdebug\u CC\u DEAD\u code
xdebug\u CC\u UNUSED
选项,并@J.D.击中头部的钉子。我目前正在开发一个补丁,它可以使速度提高10倍。你可以在这里跟踪进度。这将被合并到php代码覆盖率的3.0版本中(支持php>=5.6)。我也可以使用fork这个版本,使它与php5.5兼容,但它甚至没有启动。它在开始后和发送点之前都会挂起,这就是我发现的奇怪之处,我不知道你的意思。在最初的问题中,您说它暂停一分钟,然后开始运行测试。假设你的字面意思是“一分钟”,我并不感到惊讶。当我运行测试时,我发现同样的事情——不是一分钟,但可能你的计算机比我慢,或者有更多的代码行,等等。虽然我对PHPunit的内部结构一无所知,但如果我知道它是从索引你的代码开始的,我也不会感到惊讶。但它每次都必须索引代码吗?在我看来,应该有某种智能缓存——但在这种情况下,这可能是不可能的,或者是没有帮助的。