Class 'TestsTestCase' not found在生产环境出现,几乎总是因autoload-dev误入生产autoloader或composer install漏掉--no-dev;需确保composer.lock不含dev包、install时加--no-dev --optimize-autoloader,并验证class_exists('TestsTestCase')返回false。

直接原因不是“包不存在”,而是生产环境加载了不该加载的测试类路径,或漏掉了--no-dev导致依赖不一致。
为什么Class 'TestsTestCase' not found在生产环境出现
这个错误几乎总是因为两件事之一:要么autoload-dev配置被误打进生产 autoloader,要么composer install没加--no-dev,结果 PHPUnit、Pest 等 dev 包被装进vendor/,但它们的自动加载规则(如"Tests\": "tests/")又被跳过——于是类找不到,又删不干净。
-
autoload-dev不会注册进生产 autoloader,哪怕路径存在、文件也在,new TestsTestCase()照样报错 - 如果
composer.lock是本地开发时生成的(含 dev 包),线上只跑composer install --no-dev也无效——lock 文件本身已记录 dev 包,install 会照单全收 - Laravel + Pest 项目还多一层:没运行
php artisan pest:install,tests/Pest.php就不存在,PestTest根本无法解析,哪怕autoload-dev配对了也没用
composer install --no-dev到底要配哪些前置条件
它不是开关,而是一整套配合动作。单独加参数解决不了问题。
- CI/CD 流水线第一行必须是
composer update --no-dev --lock,生成不含 dev 包的composer.lock,再提交到仓库 - 部署脚本里
composer install必须带--no-dev --optimize-autoloader,后者还能避免 runtime 扫描未注册路径 - 确认
composer.json里autoload-dev只写测试路径,比如"Tests\": "tests/",别混进autoload里 - 检查是否有脚本(如
post-autoload-dump)偷偷调用了PHPUnitFrameworkTestCase这类类——它们在--no-dev下根本不可用
如何验证生产环境是否真的“干净”
不能只看vendor/有没有phpunit/phpunit目录,得验证实际加载行为。
- 执行
composer show --dev,输出应为空;若有内容,说明--no-dev没生效或 lock 文件污染 - 运行
php -r "var_dump(class_exists('TestsTestCase'));",应返回bool(false) - 检查
vendor/composer/autoload_psr4.php,确认里面没有"Tests\"开头的映射项 - 如果用了 Laravel,访问
php artisan tinker后输入class_exists('PHPUnitFrameworkTestCase'),也应为false
最常被忽略的是composer.lock的生成时机——它决定了install能装什么,而不是你传什么参数。部署前不重刷 lock,所有--no-dev都是纸面功夫。











