Laravel 不生成代码覆盖率报告

Posted

技术标签:

【中文标题】Laravel 不生成代码覆盖率报告【英文标题】:Laravel not generating code coverage report 【发布时间】:2021-06-26 18:53:29 【问题描述】:

我正在使用 Laravel 8 来测试我的应用,我正在运行

php artisan test --coverage-html reports

测试运行成功。问题是没有生成覆盖率报告。我已经在这里完成了关于 SO 的答案,据说解决方案将以下内容添加到我的 phpunit.xml

 <logging>
    <log type="coverage-html" target="tests/coverage" showUncoveredFiles="true"/>
    <log type="coverage-clover" target="build/logs/clover.xml"/>
  </logging>

这行不通。我也试过了

    <coverage processUncoveredFiles="true">
      <include>
        <directory suffix=".php">./app</directory>
      </include>
      <report>
        <html outputDirectory="tests/reports/coverage"/>
      </report>
    </coverage>

还是什么都没有;以下是我的phpunit.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         bootstrap="vendor/autoload.php"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false">
  <testsuites>
    <testsuite name="Unit">
      <directory suffix="Test.php">./tests/Unit</directory>
      <directory suffix="Test.php">./packages/okotieno</directory>
    </testsuite>

    <testsuite name="Feature">
      <directory suffix="Test.php">./tests/Feature</directory>
    </testsuite>
  </testsuites>
  <filter>
    <whitelist processUncoveredFilesFromWhitelist="true">
      <directory suffix=".php">./app</directory>
    </whitelist>
  </filter>
  <logging>
    <log type="coverage-html" target="tests/coverage" showUncoveredFiles="true"/>
    <log type="coverage-clover" target="build/logs/clover.xml"/>
  </logging>
  <php>
    <server name="APP_ENV" value="testing"/>
    <server name="BCRYPT_ROUNDS" value="4"/>
    <server name="CACHE_DRIVER" value="array"/>
    <server name="MAIL_DRIVER" value="array"/>
    <server name="QUEUE_CONNECTION" value="sync"/>
    <server name="SESSION_DRIVER" value="array"/>
    <env name="DB_DATABASE" value="testing_db"/>
  </php>

</phpunit>

我还运行php artisan test --help 来查看有效标志,--coverage-html 不在列表中,但它运行。我该如何解决这个问题?

【问题讨论】:

很抱歉现在可以给你一个明确的答案,但我不确定你是否需要xdebug 或不这样做。几年前我在尝试生成覆盖率报告时也遇到了问题,所以我最终使用了xDebug 覆盖率(使用 PHPStorm)。 【参考方案1】:

我遇到了同样的问题。它是由 php.ini 文件中的 xdebug 配置引起的。 就我而言,我有 xdebug 3.0.4。可以用 php -v 查看。

您必须在 php.ini 文件中包含下一行:

[XDebug]
zend_extension = "c:\xampp8\php\ext\php_xdebug-3.0.4-7.4-vc15-x86_64.dll"
xdebug.mode=debug,coverage
xdebug.client_host=127.0.0.1
xdebug.client_port=9000

【讨论】:

【参考方案2】:

首先,您需要确保安装了 Xdebug, 那么你需要确保这个 Xdebug 处于覆盖模式, 您可以通过以下命令运行它(在运行过程中使其开启)

php -dxdebug.mode=coverage vendor/bin/phpunit --coverage-clover='reports/coverage/coverage.xml' --coverage-html='reports/coverage'

请注意 Xdebug 不是为生成报告而设计的,所以如果您想为大量测试生成报告,您将面临来自操作系统的进程终止问题,在这种情况下,您应该寻找其他软件包

【讨论】:

【参考方案3】:

确保在 php ini 中安装并配置了 xdebug

如果安装了 php -v 将显示下面的结果和 xdebug 详细信息

PHP 8.0.15 (cli) (built: Jan 21 2022 04:49:41) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.15, Copyright (c) Zend Technologies
   with Xdebug v3.1.3, Copyright (c) 2002-2022, by Derick Rethans
   with Zend OPcache v8.0.15, Copyright (c), by Zend Technologies

确保在php ini文件中启用xdebug的covergae模式

[debug]
zend_extension=/usr/local/Cellar/php@8.0/8.0.15/pecl/20200930/xdebug.so
xdebug.mode=coverage,debug
xdebug.start_with_request=yes
xdebug.client_port=9003
xdebug.log_level=7
xdebug.idekey=VSCODE
xdebug.client_host=127.0.0.1

在 phpunint.xml 文件中添加不带 作为 的直接子级

<coverage processUncoveredFiles="true">
   <include>
     <directory suffix=".php">./app</directory>
   </include>
</coverage>

使用工匠传递路径运行测试以获取代码覆盖率报告

php artisan test --coverage-html tests/reports/coverage

【讨论】:

以上是关于Laravel 不生成代码覆盖率报告的主要内容,如果未能解决你的问题,请参考以下文章

使用Maven生成JaCoCo代码覆盖率报告

如何用PHPUnit生成代码覆盖率报告

使用命令行 android studio 运行 testSuite 并生成代码覆盖率报告

如何使用来自 Hudson 的 Maven 生成 Cobertura 代码覆盖率报告

如何在 vs 代码中使用 mocha 生成覆盖率报告?

如何使用 jest 和 detox 生成代码覆盖率报告?