Laravel测试默认使用SQLite内存数据库隔离环境,运行php artisan make:test生成测试类后,通过php artisan test执行;需确保CSRF禁用、迁移已执行,并按层级(Feature/Unit)合理断言。
直接用
生成测试类,然后在
或
目录里写断言——但多数人卡在「测什么」和「怎么模拟真实请求/数据库」上。
怎么生成并运行一个基础测试用例
Laravel 默认已集成 PHPUnit,无需额外安装(除非你删了
)。运行命令即可快速起步:
→ 生成到
,适合测 HTTP 流程
→ 生成到
,适合测模型、服务类等不依赖 HTTP 的逻辑
运行单个测试:
默认会读取
中的
和
配置,确保测试不污染本地数据库
为什么
返回 419 或 500 而不是预期响应
常见于未处理 CSRF 或数据库迁移未执行。Laravel 测试环境默认禁用 CSRF 验证,但如果你手动启用了中间件或用了自定义内核,就可能触发
。
检查
中
或
中间件组是否误加了
确保测试类继承
(它自动设置了
)
若需测试带 CSRF 的
表单提交
,改用
,但更推荐跳过验证
500 错误常因迁移未跑:
在测试前执行一次,或在
中调用
(注意性能)
如何安全地测试数据库操作而不清空生产数据
关键在隔离:Laravel 测试默认使用 SQLite 内存数据库,每次测试启动时重建,天然隔离。但如果你改了配置指向 MySQL,就容易出问题。
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
立即学习
“
PHP免费学习笔记(深入)
”;
确认
中
是
,且
是
避免在测试中写
—— 这会绕过测试连接
想验证 Eloquent 行为?直接 new 模型 +
,断言
即可,不用手写 SQL
如需预设数据,用工厂:
,比
更可靠
真正难的不是写
,而是判断哪一层该测、哪一层该 mock。比如测控制器时,别去 assert 数据库字段长度,那是模型的职责;测模型时,别用
模拟
路由
——那已经滑向 Feature 测试了。
php artisan make:testtests/Featuretests/Unitphpunit.xmlphp artisan make:test UserRegistrationTest --featuretests/Featurephp artisan make:test UserRepositoryTest --unittests/Unitphp artisan test --filter=UserRegistrationTestphpunit.xmlDB_CONNECTION=sqlite:memory:$this->postJson()TokenMismatchExceptionapp/Http/Kernel.phpapiwebVerifyCsrfTokenTests\TestCaseWithoutMiddleware$this->withSession(['_token' => 'xxx'])->post(...)php artisan migrate:fresh --seedTestCase::setUp(): voidArtisan::call('migrate:fresh')phpunit.xmlDB_CONNECTIONsqliteDB_DATABASE:memory:DB::connection('mysql')→table(...)save()$user->fresh()->nameUser::factory()->count(3)->create()DB::table()->insert()assertTrue()$this->get()