Laravel 模块化项目上带有 Xdebug 的 PHPUnit 未显示模块的源代码覆盖率

问题描述 投票:0回答:1

我正在开发一个 Laravel 10(使用 PHPUnit 10 和 Xdebug 3)项目,其中业务逻辑已分为多个模块:在

app/
目录级别是
modules/
目录,其中驻留模块代码(即提供程序、迁移) 、模型等)。

.
├── app          <-
├── bin
├── bootstrap
├── config
├── database
├── docker
├── environments
├── lang
├── modules      <-
├── node_modules
├── public
├── resources
├── routes
├── storage
├── tests
└── vendor

phpunit.xml
中,我添加了新的目录源,如下所示:

<source>
    <include>
        <directory>app</directory>
        <directory>modules</directory>
    </include>
</source>

现在 HTML 代码覆盖率输出正确列出了它:

enter image description here

问题是:在对模块业务逻辑进行测试时,其覆盖率始终为0%。

我从未使用过 PHPUnit 代码覆盖率属性,因为我从不需要它们,我从事的每个其他项目在没有它们的情况下都会生成正确的代码覆盖率。

我需要为

app/
目录之外的源文件添加这些属性吗?

更新#1

在模块测试类中添加

CoversClass(TestedClass::class)]
属性并没有解决问题,
modules/
代码覆盖率仍然是 0。

更新 #2:Xdebug 未设置为
coverage

我正在检查 Xdebug 模式在测试期间是否正确设置为

coverage
,并在测试中使用简单的
dd(getenv())
显示
XDEBUG_MODE=off

应用程序在 docker 上运行,并且容器使用条目

99-php.ini
安装自定义
xdebug.mode=coverage
,因此我假设“99”使其在正在加载的 .ini 文件之间最不重要,因此其配置不会覆盖另一个文件中现有的
xdebug.mode=off

我将条目

<env name="XDEBUG_MODE" value="coverage" />
添加到
phpunix.xml
php
部分,但测试输出仍然显示
off
作为 xdebug 模式。

最后,我尝试使用

XDEBUG_MODE=coverage
在容器中手动设置 env 变量,它看起来工作正常(测试输出正确显示来自
XDEBUG_MODE=coverage
的条目
getenv()
),问题是
modules
目录仍然获得 0% 的代码覆盖率。

laravel testing phpunit code-coverage xdebug
1个回答
0
投票

我也遇到了同样的问题,根本原因与

PCOV
有关。它无法处理根级别有两个以上目录的情况。

您的

phpunit.xml
配置正确,因此无需更改。只需在代码覆盖率运行期间禁用
PCOV
即可解决该问题。您可以使用以下命令来完成此操作:

sail php -d pcov.enabled=0 ./vendor/bin/phpunit --coverage-html coverage-report

这可确保

PCOV
不会干扰您的代码覆盖率,并允许您的配置按预期工作。

更多详情,您可以查看为什么 Laravel 中自定义模块的代码覆盖率会失败?

© www.soinside.com 2019 - 2024. All rights reserved.