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

3次阅读

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

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

直接用 php artisan make:test 生成测试类,然后在 tests/Featuretests/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.phpapiweb 中间件组是否误加了 VerifyCsrfToken
  • 确保测试类继承 TestsTestCase(它自动设置了 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.xmlDB_CONNECTIONsqlite,且 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 测试了。

text=ZqhQzanResources