Laravel测试默认使用SQLite内存数据库隔离环境,运行php artisan make:test生成测试类后,通过php artisan test执行;需确保CSRF禁用、迁移已执行,并按层级(Feature/Unit)合理断言。

直接用 php artisan make:test 生成测试类,然后在 tests/Feature 或 tests/Unit 目录里写断言——但多数人卡在「测什么」和「怎么模拟真实请求/数据库」上。
怎么生成并运行一个基础测试用例
Laravel 默认已集成 PHPUnit,无需额外安装(除非你删了 phpunit.xml)。运行命令即可快速起步:
-
php artisan make:test UserRegistrationTest --feature→ 生成到tests/Feature,适合测 HTTP 流程 -
php artisan make:test UserRepositoryTest --unit→ 生成到tests/Unit,适合测模型、服务类等不依赖 HTTP 的逻辑 - 运行单个测试:
php artisan test --filter=UserRegistrationTest - 默认会读取
phpunit.xml中的DB_CONNECTION=sqlite和:memory:配置,确保测试不污染本地数据库
为什么 $this->postJson() 返回 419 或 500 而不是预期响应
常见于未处理 CSRF 或数据库迁移未执行。Laravel 测试环境默认禁用 CSRF 验证,但如果你手动启用了中间件或用了自定义内核,就可能触发 TokenMismatchException。
- 检查
app/Http/Kernel.php中api或web中间件组是否误加了VerifyCsrfToken - 确保测试类继承
Tests\TestCase(它自动设置了WithoutMiddleware) - 若需测试带 CSRF 的表单提交,改用
$this->withSession(['_token' => 'xxx'])->post(...),但更推荐跳过验证 - 500 错误常因迁移未跑:
php artisan migrate:fresh --seed在测试前执行一次,或在TestCase::setUp(): void中调用Artisan::call('migrate:fresh')(注意性能)
如何安全地测试数据库操作而不清空生产数据
关键在隔离:Laravel 测试默认使用 SQLite 内存数据库,每次测试启动时重建,天然隔离。但如果你改了配置指向 MySQL,就容易出问题。
立即学习“PHP免费学习笔记(深入)”;
- 确认
phpunit.xml中DB_CONNECTION是sqlite,且DB_DATABASE是:memory: - 避免在测试中写
DB::connection('mysql')→table(...)—— 这会绕过测试连接 - 想验证 Eloquent 行为?直接 new 模型 +
save(),断言$user->fresh()->name即可,不用手写 SQL - 如需预设数据,用工厂:
User::factory()->count(3)->create(),比DB::table()->insert()更可靠
真正难的不是写 assertTrue(),而是判断哪一层该测、哪一层该 mock。比如测控制器时,别去 assert 数据库字段长度,那是模型的职责;测模型时,别用 $this->get() 模拟路由——那已经滑向 Feature 测试了。











