首页 > 解决方案 > 如何使用 pcov 获得代码覆盖率报告?

问题描述

我使用 PHP 8.0.5、PHPUnit 9.5.4、PHPStorm 2021.1.2。当在我的 XML 配置文件中,我使用这个:

<coverage pathCoverage="true">
  <report>
    <clover outputFile="./coverage.xml"/>
  </report>
</coverage>

(这只是我文件的相关部分)

...并从 PHPStorm 启动命令“Run with coverage”,它不会生成覆盖率报告。

我已停用 XDebug。PHPStorm 向我展示:

警告:必须设置 XDEBUG_MODE=coverage 或 xdebug.mode=coverage

我不知道为什么它提到 XDebug,因为我想使用 pcov,因为我在“运行/调试配置”弹出窗口中设置了它。我尝试将报告放在另一个文件夹中,尝试生成 HTML 报告...通过终端启动命令...这些都不起作用。我在 Google 上没有找到任何关于我的问题的信息。

编辑

我尝试了根本没有加载 XDebug 和这个简化的配置(使用--generate-configuration参数创建)并添加了前面的代码(没有路径覆盖)。

<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.5/phpunit.xsd"
         bootstrap="TestBootstrap.php"
         cacheResultFile=".phpunit.cache/test-results"
         executionOrder="depends,defects"
         forceCoversAnnotation="true"
         beStrictAboutCoversAnnotation="true"
         beStrictAboutOutputDuringTests="true"
         beStrictAboutTodoAnnotatedTests="true"
         failOnRisky="true"
         failOnWarning="true"
         verbose="true">
    <testsuites>
        <testsuite name="default">
            <directory suffix="Test.php">./src/BlocksTest.php</directory>
        </testsuite>
    </testsuites>

    <coverage cacheDirectory=".phpunit.cache/code-coverage"
              processUncoveredFiles="true">
        <include>
            <directory suffix=".php">../src</directory>
        </include>
        <report>
            <clover outputFile="./coverage.xml"/>
        </report>
    </coverage>
</phpunit>

即使图书馆说它仍然不起作用:

生成 Clover XML 格式的代码覆盖率报告...

标签: phpunitpcov

解决方案


当然有很多方法可以回答这个问题,在我们寻找答案的同时,我留下了一些初稿。


您的 Phpunit XML 配置:

<coverage pathCoverage="true">
  <report>
    <clover outputFile="./coverage.xml"/>
  </report>
</coverage>

是与pathCoverage属性true值。

[在 Phpunit 9.5 中] pathCoverage 属性[...] 当设置为 true [..] 这需要支持路径覆盖的代码覆盖驱动程序。Path Coverage 目前仅由 Xdebug 实现。

所以你不能用 pcov 得到这个代码覆盖率报告。

您的 Phpunit 配置不兼容。


当 Phpunit(通过sebastianbergman/php-code-coverage)显示此警告时:

警告:必须设置 XDEBUG_MODE=coverage 或 xdebug.mode=coverage

这意味着它检测到 xdebug 扩展可用,但未配置为使用它,因此提示要更改哪些参数。

如果您在命令行 (CLI) 上使用 xdebug 模式环境参数重放最后一个命令,通常最容易进行测试运行:

$ XDEBUG_MODE=coverage !! # press enter

否则这两个选项中的任何一个都适用于 PHP,请适当地配置运行作业。

但是,如果您不关心 xdebug 而是关心 pcov

我不知道为什么它提到 XDebug,因为我想使用 pcov,因为我在 "Run/Debug Configurations" popin 中设置它 [in PhpStorm]。

关于 xdebug 配置的警告讲述了一个不同的故事:xdebug 和 pcov 是互斥的,并且

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

这意味着 - 正如原始警告显示 Xdebug加载 - 它必须首先被卸载。

PhpStorm无法卸载配置的 PHP 版本的扩展。它的作用是根据您的选择添加扩展和配置设置。

在与命令行 (CLI) 类似的 PhpStorm 中,您可以控制 PHP 可执行文件的环境参数和命令行参数。

如果系统上 php 可执行文件的现有配置已经加载太多,作为最后的手段,您可以先使用-n开关禁用所有扩展,然后根据需要添加扩展。

像 xdebug 这样的一些扩展需要作为 zend 扩展加载:

有关 PHP 命令行选项的描述,请参阅命令行选项[DOCS]

有关各种配置选项的说明,请参阅:

  • php.iniPHP 发行版附带的注释文件
  • PHP 手册中的相应页面(它还有一个php.ini 指令列表[DOCS]
  • 扩展作者的附加文档,例如Xdebug 主页通常有详细的配置说明并涵盖所有 ini 设置。

推荐阅读