跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

Laravel怎么做单元测试_Laravel使用PHPUnit编写测试用例【指南】

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 8.5.5 PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。 下载 立即学习 “ 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 测试了。

相关文章