我正在开发一个 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 代码覆盖率输出正确列出了它:
问题是:在对模块业务逻辑进行测试时,其覆盖率始终为0%。
我从未使用过 PHPUnit 代码覆盖率属性,因为我从不需要它们,我从事的每个其他项目在没有它们的情况下都会生成正确的代码覆盖率。
我需要为
app/
目录之外的源文件添加这些属性吗?
在模块测试类中添加
CoversClass(TestedClass::class)]
属性并没有解决问题,modules/
代码覆盖率仍然是 0。
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% 的代码覆盖率。
我也遇到了同样的问题,根本原因与
PCOV
有关。它无法处理根级别有两个以上目录的情况。
您的
phpunit.xml
配置正确,因此无需更改。只需在代码覆盖率运行期间禁用 PCOV
即可解决该问题。您可以使用以下命令来完成此操作:
sail php -d pcov.enabled=0 ./vendor/bin/phpunit --coverage-html coverage-report
这可确保
PCOV
不会干扰您的代码覆盖率,并允许您的配置按预期工作。
更多详情,您可以查看为什么 Laravel 中自定义模块的代码覆盖率会失败?