【问题标题】:Use other code coverage driver than xdebug使用除 xdebug 之外的其他代码覆盖率驱动程序
【发布时间】:2019-12-24 15:22:36
【问题描述】:

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

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

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

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

我读到pcov might be faster,但据我了解,必须禁用 xdebug。

是否比运行上面的命令更好地实现最快的覆盖?

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

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

【问题讨论】:

  • reload php service 是什么意思?使用cli sapi 执行命令时,不使用fpm sapi 或php-fpm 服务。命令php <path-to>/phpunit 不使用任何服务,而只使用php 可执行文件。

标签: phpunit xdebug pcov


【解决方案1】:

即使禁用 xdebug 也会降低性能:

xdebug.default_enable=0

影响不容忽视。

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

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

【讨论】:

  • 这个答案是对的,但我想提供一个权威的答案,这样以后的读者就不会感到困惑了……如果我编辑你的答案,你愿意吗?
【解决方案2】:

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

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

来源:我写了 pcov ...

【讨论】:

    【解决方案3】:

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

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

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

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

    php -n [...]
    

    其中[...] 代表专门针对用例的参数,一般来说,这里针对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 和启用代码覆盖创建的。为清楚起见,已缩短输出示例。

    【讨论】:

      猜你喜欢
      • 2017-10-24
      • 2021-04-16
      • 2018-03-01
      • 2011-07-23
      • 1970-01-01
      • 2012-08-23
      • 1970-01-01
      • 2012-03-07
      • 2016-09-13
      相关资源
      最近更新 更多