PAYATHON 2026

Laravel 10 执行 php artisan test 提示命令未定义

数据阿明

结论

Laravel 10 没有取消 php artisan test。该命令通常由开发依赖 nunomaduro/collision 注册,并非由 laravel/framework 单独提供。

项目中可能没有安装开发依赖,例如执行过 composer install --no-dev,或者升级 Laravel 后没有同步更新测试依赖。这种情况下,make:test 仍然可用,但 test 命令不会出现在 Artisan 命令列表中。

恢复 php artisan test

先在项目根目录安装完整依赖:

composer install

如果 composer.json 缺少测试相关依赖,Laravel 10 项目通常可以安装:

composer require --dev "nunomaduro/collision:^7.0" "phpunit/phpunit:^10.0"

Laravel 10 支持 PHP 8.1,PHPUnit 10 也要求 PHP 8.1 或更高版本,因此这组版本与题目中的环境匹配。如果项目是从旧版本升级而来,还需要检查其他 Composer 依赖是否允许使用这些版本。

安装完成后,重新生成自动加载文件和包清单:

composer dump-autoload
php artisan package:discover
php artisan optimize:clear

然后检查命令是否已经注册:

php artisan list | grep test

正常情况下会看到类似内容:

test  Run the application tests

此时可以运行:

php artisan test

不依赖 Artisan 直接运行测试

php artisan test 是 Laravel 对测试运行器的包装入口。即使该命令没有注册,只要 PHPUnit 已经安装,仍可直接执行:

./vendor/bin/phpunit

Windows 上可以使用:

vendor\bin\phpunit

运行指定测试文件:

php artisan test tests/Unit/ExampleTest.php

也可以直接使用 PHPUnit:

./vendor/bin/phpunit tests/Unit/ExampleTest.php

按测试方法过滤:

php artisan test --filter=test_example

仍然没有命令时的检查项

1. 确认依赖是否存在

composer show nunomaduro/collision
composer show phpunit/phpunit

如果 Composer 提示找不到包,说明相应的开发依赖尚未安装。

2. 检查是否使用了 --no-dev

生产部署中经常执行:

composer install --no-dev

这条命令不会安装 require-dev 中的 Collision 和 PHPUnit,所以生产环境里没有 php artisan test 通常是正常的。需要运行测试时,应在开发环境或 CI 测试阶段执行:

composer install

3. 检查包发现配置

查看 composer.json 是否禁止自动发现 Collision:

{
  "extra": {
    "laravel": {
      "dont-discover": [
        "nunomaduro/collision"
      ]
    }
  }
}

如果有这项配置且没有特殊用途,请从 dont-discover 中移除 nunomaduro/collision,然后执行:

composer dump-autoload
php artisan package:discover

通常不用手动将 Collision 的 Service Provider 写入 config/app.php,Laravel 会通过 Composer 包发现机制自动注册。

4. 检查升级后的依赖组合

如果项目是从 Laravel 8 或 Laravel 9 升级到 Laravel 10,而不是全新创建,composer.json 中可能仍保留旧版 Collision 或 PHPUnit 的版本约束。可以通过以下命令查看冲突原因:

composer why-not nunomaduro/collision 7
composer why-not phpunit/phpunit 10

修正版本约束后,再更新相关开发依赖:

composer update nunomaduro/collision phpunit/phpunit --with-all-dependencies

这个问题通常不是 PHP 8.1 或 Laravel 10 本身造成的,而是 Collision、PHPUnit 等 require-dev 依赖缺失、未安装或未被自动发现。恢复开发依赖后,php artisan test 会重新出现在 Artisan 命令列表中。

备注:内容仅供参考。