4

我想使用pcov而不是xdebug来生成代码覆盖率。

我正在使用 Docker,并且安装了 xdebug。

如果我运行以下命令,我可以确定 xdebug 不会影响测试执行吗?

php -d xdebug.default_enable=0 -d pcov.enabled=1 path/to/phpunit --coverage-text

我读到pcov 可能会更快,但据我所知,必须禁用 xdebug。

是否最好执行以下操作以实现最快的覆盖率而不是运行上述命令?

  1. 删除/截断 xdebug 配置
  2. 运行测试

    php -d pcov.enabled=1 path/to/phpunit --coverage-text
    
  3. 恢复 xdebug 配置

4

3 回答 3

10

Xdebug 和 PCOV 都重载了引擎的相同部分,因此它们是不兼容的,作者试图使它们兼容是没有意义的。

如果您想使用 PCOV 作为 php-code-coverage 的驱动程序,则不得加载Xdebug 。

资料来源:我写了 pcov ...

于 2019-08-30T17:10:43.203 回答
0

即使通过以下方式禁用 xdebug 也会降低性能:

xdebug.default_enable=0

影响不容忽视。

您最好xdebug在运行测试之前完全禁用扩展。

如果您pcov用于生成代码覆盖率,这将为您提供最佳性能。

于 2019-08-20T13:21:31.137 回答
0

是否最好执行以下操作以实现最快的覆盖率而不是运行上述命令?[禁用/启用 xdebug/pcov 而不是加载它们]

当您在命令行上运行 php 时,您不需要摆弄调用 phpunit 的 ini 文件。

相反,您可以使用命令行参数明确运行时配置,这通常会提供有趣的效果。

它与-n开关一起使用,即禁用所有配置文件(php --help有关使用信息,请参阅):

php -n [...]

where[...]代表专门针对用例的参数,一般来说,这里是针对 phpunit 的:

php -n <php-file> [<php-file-argument>...]

       `------------ [...] --------------´ 


php -n path/to/phpunit --coverage-text

       `--------- [...] -------------´

开关/选项使-n运行时真正赤裸裸,所以你从一个干净的石板开始。

首先,运行的 phpunit 可能根本无法工作,并且对于某些功能(例如读取配置文件)不起作用,因为 phpunit 需要一些 php 扩展并-n控制不加载任何 php 扩展(即 php 只有核心扩展或那些已编译且无法停用)。

因此,您必须添加它们,例如用于 XML 配置文件的 Dom 和用于生成 HTML 代码覆盖率报告的 Tokenizer(很快):

 php -n -d extension=dom -d extension=tokenizer [...]

然后,您的测试套件很可能还会测试需要扩展的代码路径。调用 phpunit 将在失败中突出显示这些。因此你必须添加它们(例如这里的 json):

 php -n -d extension=dom -d extension=tokenizer -d extension=json [...]

这可能是有趣的部分,因为您了解了代码所具有的扩展要求(至少对于单元测试而言)。

最后添加选择的覆盖范围扩展。我们以 pcov 为例:

php -n -d extension=dom -d extension=tokenizer -d extension=json \
    -d extension=pcov -d pcov.enabled=1 [...]

然后你得到你的结果:

PHPUnit 9.5.4 by Sebastian Bergmann and contributors.

Runtime:       PHP 7.4.20 with PCOV 1.0.8
Configuration: phpunit-cfg.xml

...............                                                   15 / 15 (100%)

Time: 00:00.191, Memory: 6.00 MB

OK (15 tests, 33 assertions)

Generating code coverage report in HTML format ... done [00:00.021]

与xdebug比较?为什么不:

hp -n -d extension=dom -d extension=tokenizer -d extension=json \
   -d zend_extension=xdebug -d xdebug.mode=coverage [...]
      ^^^^^

并得到结果:

PHPUnit 9.5.4 by Sebastian Bergmann and contributors.

Runtime:       PHP 7.4.20 with Xdebug 3.0.4
Configuration: phpunit-cfg.xml

...............                                                   15 / 15 (100%)

Time: 00:00.222, Memory: 8.00 MB

OK (15 tests, 33 assertions)

Generating code coverage report in HTML format ... done [00:00.024]

提示phpunit-cfg.xml文件是在phpunit --generate-configuration启用代码覆盖的情况下创建的。为清楚起见,已缩短输出示例。

于 2021-06-09T23:19:17.240 回答