laravel 9+ 自带 phpunit,运行 php artisan test 即可;需确保 php ≥ 8.0、存在 phpunit.xml 和 tests/testcase.php;测试分 feature/unit 目录,继承 testcase,方法以 test_ 开头;推荐 sqlite 内存数据库;登录测试用 actingas() 模拟用户,避免手动 truncate。

直接用 Laravel 自带的 PHPUnit 就行,不用额外装——9.x 起已默认内置,只要项目能跑 php artisan,php artisan test 就能立刻执行测试。
确认基础环境是否就绪
先检查三件事:
- PHP 版本 ≥ 8.0(Laravel 9+ 强制要求)
- 项目根目录存在
phpunit.xml(Laravel 安装时自动生成,别删) -
tests/TestCase.php文件存在(它是所有测试类的父类,提供$this->get()、actingAs()等关键方法)
如果运行 php artisan test 报错 Class 'Tests\TestCase' not found,大概率是 composer autoload 没刷新,执行 composer dump-autoload 即可修复。
生成并组织测试文件
Laravel 推荐按职责分目录:
-
功能测试(Feature):模拟真实请求,测路由、控制器、认证、数据库交互。用
php artisan make:test UserLoginTest --feature,生成到tests/Feature/ -
单元测试(Unit):测模型、服务类、工具函数等独立逻辑,不走 HTTP 层。用
php artisan make:test UserServiceTest --unit,生成到tests/Unit/
测试类必须继承 Tests\TestCase;方法名以 test_ 开头或加 @test 注释;文件名以 Test.php 结尾。
配置隔离的测试数据库
避免误操作开发库,关键在 phpunit.xml 中设置:
- 推荐轻量方案:
<env name="DB_CONNECTION" value="sqlite"></env><env name="DB_DATABASE" value=":memory:"></env>
每次测试启动新内存库,秒级重建,天然干净 - 若需外键支持(如用了
foreignId()->constrained()),改用文件 SQLite:<env name="DB_DATABASE" value="database/testing.sqlite"></env>,并提前touch database/testing.sqlite - 用 MySQL 测试库?必须单独建库(如
laravel_test),并在.env.testing和phpunit.xml中显式指向它,不能依赖.env
切记:别在测试里手动写 DB::table('users')->truncate(),会绕过 RefreshDatabase 的事务机制,导致状态污染。
写一个可用的登录接口测试
以 Sanctum API 登录为例,重点不是“怎么发 token”,而是“怎么跳过中间件却保留用户身份”:
- 用
$user = User::factory()->create()快速造数据 - 调
$this->actingAs($user)模拟已登录状态(自动注入 session 或 token) - 再发请求:
$response = $this->postJson('/api/posts', ['title' => 'Test']) - 断言:
$response->assertStatus(201)->assertJsonStructure(['id', 'title'])
如果坚持要测带 CSRF 的表单提交,别用 postJson(),改用:$this->withSession(['_token' => 'fake-token'])->post('/register', [...]),但更推荐在测试中禁用 CSRF(WithoutMiddleware trait 或移除中间件组)。
运行与调试技巧
日常高频命令:
- 跑全部测试:
php artisan test - 只跑某个类:
php artisan test --filter=UserLoginTest - 只跑某个方法:
php artisan test --filter=test_user_can_login_with_valid_credentials - 查看详细错误和 SQL:
php artisan test --verbose
遇到 419(CSRF)或 500(迁移失败),优先检查:
– app/Http/Kernel.php 是否在 api 或 web 组误加了 VerifyCsrfToken
– 是否漏了 php artisan migrate:fresh --seed(或确认 RefreshDatabase trait 已启用)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











