
Laravel 9 移除了默认的 Tests\TestCase 基类文件,升级后需手动创建或恢复该文件,否则测试用例会因类未定义而报错。
laravel 9 移除了默认生成的 `tests\testcase` 基类文件(此前由安装脚手架自动提供),导致从 laravel 8 升级后的项目在运行测试时抛出 fatal error: class 'tests\testcase' not found 错误。这不是命名空间或自动加载问题,而是该核心测试基类物理文件缺失所致。
为什么会出现这个问题?
Laravel 9 开始将测试基类视为“可选模板”,不再随框架默认内置于 tests/ 目录中。Laravel 8 及更早版本会在新项目初始化时自动生成 tests/TestCase.php,但升级过程不会自动补全此文件——它被视作用户自定义资产,因此升级脚本跳过了它的迁移或重建。
正确的修复方式
你需要手动创建或还原标准的 tests/TestCase.php 文件。推荐直接参考官方 Laravel 9 的标准实现(与 laravel/laravel 官方仓库保持一致):
<?php
namespace Tests;
use Illuminate\Foundation\Testing\TestCase as BaseTestCase;
abstract class TestCase extends BaseTestCase
{
use CreatesApplication;
}同时,请确保 tests/CreatesApplication.php 存在且内容正确(Laravel 9 中该 trait 仍保留):
<?php
namespace Tests;
use Illuminate\Foundation\Testing\CreatesApplication;
trait CreatesApplication
{
/**
* Creates the application.
*/
public function createApplication(): \Illuminate\Foundation\Application
{
$app = require __DIR__.'/../bootstrap/app.php';
$app->make(\Illuminate\Contracts\Console\Kernel::class)->bootstrap();
return $app;
}
}✅ 关键检查点:
- 文件路径必须为 tests/TestCase.php(注意大小写和位置);
- namespace Tests; 不可改为 Tests\TestCase 或其他嵌套命名空间;
- use Illuminate\Foundation\Testing\TestCase as BaseTestCase; 是必需的别名引用;
- CreatesApplication trait 必须存在且路径正确(位于 tests/CreatesApplication.php);
- 运行 composer dump-autoload 确保自动加载规则更新(虽然 PSR-4 通常能自动识别,但升级后建议执行)。
验证修复效果
创建或修复后,运行以下命令验证:
php artisan test # 或 ./vendor/bin/phpunit
若输出显示测试通过(如 OK (1 test, 1 assertion)),说明问题已解决。
⚠️ 注意:不要试图通过修改测试用例中的 use Tests\TestCase; 为 use Illuminate\Foundation\Testing\TestCase; 来绕过——这会破坏 Laravel 测试体系对数据库事务、HTTP 测试工具链等特性的封装支持。Tests\TestCase 是定制入口,必须存在且继承自框架基类。
总结:Laravel 9 并非“删除”了 TestCase,而是将其交由开发者显式维护。一次性的文件补全即可彻底解决该错误,这也是 Laravel 向更清晰、更可控的测试结构演进的体现。


















