You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel9配置modules目录代码覆盖率HTML报告为空如何解决

问题根因

modules目录覆盖率报告为空由两个配置错误导致:

  • 测试套件的suffix属性设置为空字符串,会让PHPUnit遍历目录下所有文件(包括非PHP文件)作为测试用例加载,干扰文件扫描逻辑
  • modules目录未加入Composer的PSR-4自动加载映射,Xdebug无法追踪该目录下PHP文件的执行轨迹,同时原配置未排除modules下的测试、路由、配置等非业务代码目录,导致统计逻辑异常
修复步骤

1. 调整phpunit.xml配置

替换原有配置为以下内容,修正测试文件后缀、覆盖率包含/排除规则:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="./vendor/phpunit/phpunit/phpunit.xsd"
         bootstrap="vendor/autoload.php"
         colors="true"
>
    <testsuites>
        <testsuite name="Unit">
            <directory suffix="Test.php">./modules/*/tests/Unit</directory>
        </testsuite>
        <testsuite name="Feature">
            <directory suffix="Test.php">./modules/*/tests/Feature</directory>
        </testsuite>
    </testsuites>
    <coverage processUncoveredFiles="true">
        <include>
            <!-- 若模块业务代码直接放在模块根目录,将下方路径改为./modules即可 -->
            <directory suffix=".php">./modules/*/src</directory>
        </include>
        <exclude>
            <directory suffix=".php">./modules/*/tests</directory>
            <directory suffix=".php">./modules/*/config</directory>
            <directory suffix=".php">./modules/*/database</directory>
            <directory suffix=".php">./modules/*/routes</directory>
        </exclude>
    </coverage>
    <php>
        <env name="APP_ENV" value="testing"/>
        <env name="BCRYPT_ROUNDS" value="4"/>
        <env name="CACHE_DRIVER" value="array"/>
        <env name="DB_CONNECTION" value="testing"/>
        <env name="DB_DATABASE" value=":memory:"/>
        <env name="QUEUE_CONNECTION" value="sync"/>
        <env name="SESSION_DRIVER" value="array"/>
        <env name="TELESCOPE_ENABLED" value="false"/>
    </php>
</phpunit>

2. 更新Composer自动加载映射

打开根目录composer.json,在autoload.psr-4节点下添加modules目录的命名空间映射(如果模块使用Modules作为根命名空间,按如下配置即可,可根据实际命名空间调整):

{
  "autoload": {
    "psr-4": {
      "App\\": "app/",
      "Modules\\": "modules/",
      "Database\\Factories\\": "database/factories/",
      "Database\\Seeders\\": "database/seeders/"
    }
  }
}

执行命令重新生成自动加载缓存:

composer dump-autoload

3. 重新生成覆盖率报告

先清理旧报告和缓存,再执行生成命令:

rm -rf reports
php artisan config:clear
php artisan test --coverage-html reports
注意事项
  • 所有测试文件必须以Test.php结尾(例如UserServiceTest.php),否则PHPUnit无法正常识别测试用例
  • 执行php -i | grep xdebug.mode确认Xdebug运行模式包含coverage,否则无法生成覆盖率数据
  • 如果模块没有单独的src目录存放业务代码,将覆盖率include路径改为./modules即可,确保exclude节点排除了所有不需要统计覆盖率的非业务目录

内容的提问来源于stack exchange,提问作者Iman Ghafoori

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 12:18:17