为什么 Laravel 中自定义模块的代码覆盖率会失败?

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

我将 PHPUnit 设置为在非 Laravel 项目中使用两个不同的命名空间,并且它运行得很好。这是我的工作示例的文件夹结构:

├── docker-compose.yml
├── Dockerfile
├── composer.json
├── phpunit.xml
├── app/
│   └── Example.php
├── modules/
│   └── Example.php
└── tests/
    ├── AppTest.php
    └── ModulesTest.php

在此设置中,

phpunit.xml
看起来像这样:

<testsuites>
    <testsuite name="Tests">
        <directory>tests</directory>
    </testsuite>
</testsuites>
<source>
    <include>
        <directory>app</directory>
        <directory>modules</directory>
    </include>
</source>

命名空间在

composer.json
中定义如下:

"autoload": {
    "psr-4": {
        "App\\": "app/",
        "Modules\\": "modules/"
    }
}

我运行以下命令来生成覆盖率报告:

docker compose exec php ./vendor/bin/phpunit --coverage-html coverage-report

在这个非 Laravel 示例中,代码覆盖率报告正确显示了测试覆盖的

app
modules
命名空间。

Correct Code Coverage Report for Example App

您可以在 https://github.com/iwasherefirst2/poc-coverage

查看我的示例的完整存储库

Laravel 中的问题:

当我在具有相同结构和配置的新 Laravel 10.48.24 项目中复制此设置时,覆盖率报告无法包含模块文件夹,即使它的测试成功通过。

Failing Code Coverage Report for Laravel App

这是 Laravel 的特定信息:

  • Laravel 版本:24.10.48
  • PHP 版本:8.2.26
  • PHPUnit 版本:10.x(两个项目相同)

两个项目都使用相同的 PHPUnit 版本,Laravel 中的测试是普通的单元测试 (

use PHPUnit\Framework\TestCase
)。然而,我的 Laravel 应用程序的覆盖率报告仅包含应用程序命名空间,完全省略了模块。

这也是完整的存储库,请查看https://github.com/iwasherefirst2/poc-laravel-coverage-modules

我尝试过的:

  • 确保composer.json中的命名空间配置正确并运行composer dump-autoload。
  • 在两个项目中使用相同的 phpunit.xml 结构。
  • 验证模块文件夹的测试在 Laravel 中成功运行。

主要观察结果:

  • Laravel 项目与工作示例相同,除了额外的 Laravel 特定文件和依赖项。
  • 尽管如此,覆盖率报告不包括我的 Laravel 应用程序中的模块命名空间,但不包括我的简单 php 应用程序中的模块名称空间。

问题: 为什么 PHPUnit 代码覆盖率报告无法包含 Laravel 中的模块命名空间,即使测试正在运行并通过?这可能与 Laravel 的 PHPUnit 集成或自动加载配置有关吗?如何解决这个问题并确保 Laravel 中两个命名空间的完全覆盖?

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

经过彻底调查,我发现 Laravel 存储库和非 Laravel 存储库之间的区别在于 Laravel 设置中的代码覆盖期间使用了

PCOV
,而非 Laravel 存储库依赖于
Xdebug

enter image description here

enter image description here

PCOV 的问题

PCOV
处理根级别多个目录的代码覆盖率似乎存在问题。这导致
modules
目录被排除在 Laravel 存储库的覆盖率报告之外。

修复

要解决此问题,您可以禁用

PCOV
并使用
Xdebug

选项 1:删除 PCOV

修改您的 Dockerfile 以完全排除

PCOV
。只需从安装步骤中删除
php8.2-pcov
软件包即可:

RUN apt-get update && apt-get install -y \
    php8.2-cli \
    php8.2-xdebug \
    ...
    # Remove php8.2-pcov or don't include it at all

选项 2:手动禁用 PCOV

如果无法删除

PCOV
,您可以在覆盖运行期间通过传递
pcov.enabled=0
指令手动禁用它:

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

PHPUnit XML 配置

确保您的

phpunit.xml
文件包含适当的代码覆盖率配置,具体取决于您的 PHPUnit 版本。

对于 PHPUnit 9:

使用带有

<filter>
部分的
<whitelist>
标签:

<filter>
    <whitelist>
        <directory suffix=".php">app</directory>
        <directory suffix=".php">modules</directory>
    </whitelist>
</filter>

对于 PHPUnit 10:

使用

<source>
切换到
<include>
标签:

<source>
    <include>
        <directory suffix=".php">app</directory>
        <directory suffix=".php">modules</directory>
    </include>
</source>
© www.soinside.com 2019 - 2024. All rights reserved.