Laravel中如何进行单元测试_Laravel使用PHPUnit编写测试用例【实战】
发布时间 - 2026-01-24 00:00:00 点击率:次PHPUnit 是 Laravel 默认测试框架,测试类须继承 Tests\TestCase 才能使用 refreshDatabase() 等方法;测试文件放 tests/Feature/,命名以 test 开头,可用 php artisan test --filter 运行指定测试。
PHPUnit 是 Laravel 默认集成的测试框架,所有测试用例都必须继承 Illuminate\Foundation\Testing\TestCase 或其子类(如 Tests\TestCase),否则 refreshDatabase()、actingAs() 等辅助方法不可用。
如何创建并运行一个基础功能测试
Laravel 的测试文件默认放在 tests/Feature/ 目录下,使用 php artisan make:test UserRegistrationTest 生成后,需确保类继承自 Tests\TestCase。测试方法名必须以 test 开头,否则 PHPUnit 不会识别为测试用例。
- 运行单个测试:
php artisan test --filter=UserRegistrationTest - 运行某个测试方法:
php artisan test --filter=test_user_can_register - 不加
--filter时,php artisan test会自动扫描tests/下所有*Test.php文件 - 若测试中调用
$this->get('/')报错 “Target class [App\Http\Controllers\HomeController] does not exist”,说明路由未启用或控制器命名空间错误——检查routes/web.php是否注册了该路由,且控制器路径与app/Http/Controllers/下实际位置一致
数据库迁移与测试数据隔离的关键配置
功能测试常依赖真实数据库行为,但又不能污染开发环境数据。Laravel 提供两种主流方式:RefreshDatabase 和 DatabaseMigrations,二者均通过 Trait 注入,但底层行为不同。
-
RefreshDatabase:每次测试前清空所有表(truncate),再重建迁移(up),适合大多数场景;它不执行seeders,除非显式调用$this->seed() -
DatabaseMigrations:每次测试前执行migrate:fresh,即先down再up,速度略慢,但能确保外键约束和初始状态完全一致 - 若测试中使用了
factory()->create(),注意 Laravel 8+ 已弃用全局factory()函数,应改用User::factory()->create() - 在
phpunit.xml中确认DB_CONNECTION环境变量指向testing数据库(如 SQLite 内存库:memory:),避免误操作本地 MySQL
模拟 HTTP 请求与断言响应的常见写法
Laravel 测试中发起请求不是直接调用控制器方法,而是走完整 HTTP 生命周期(中间件、路由、控制器),因此可真实验证权限、重定向、JSON 结构等。
- GET 请求并断言状态码:
$response = $this->get('/users'); $response->assertStatus(200); - POST 表单提交并验证重定向:
$this->post('/register', ['name' => 'Alice', 'email' => 'a@example.com'])->assertRedirect('/dashboard'); - 发送 JSON 请求:
$this->json('POST', '/api/posts', ['title' => 'Test'])->assertJson(['message' => 'Created']); - 断言视图渲染内容:
$response->assertViewIs('users.index')->assertViewHas('users', function ($collection) { return $collection->count() === 3; }); - 若断言失败提示 “Expected status code 200, got 500”,优先检查日志:
storage/logs/test.log,常见原因是模型事件监听器抛异常、未配置APP_KEY导致加密失败,或队列驱动设为sync以外却未启动 Redis
use Tests\TestCase;
use App\Models\User;
class UserRegistrationTest extends TestCase
{
use RefreshDatabase;
public function test_user_can_register()
{
$response = $this->post('/register', [
'name' => 'John Doe',
'email' => 'john@example.com',
'password' => 'password',

'password_confirmation' => 'password',
]);
$response->assertRedirect('/dashboard');
$this->assertDatabaseHas('users', [
'email' => 'john@example.com',
]);
}
}
真正容易被忽略的是测试环境的配置一致性——比如 config/cache.php 中 default 值在 testing 环境下是否强制设为 array,否则 Redis 缓存未就绪会导致测试随机失败;还有 APP_URL 必须设为有效 URL(如 http://localhost),否则生成的签名 URL 或邮件链接会出错。
# mysql
# php
# word
# laravel
# redis
# js
# json
# go
# app
# ai
# 路由
# 环境变量
# 状态码
# 中间件
# Array
# count
# 命名空间
# 子类
# xml
# Filter
# register
# 继承
# class
# Collection
# function
# 事件
# default
# this
# sqlite
# 数据库
# http
# Foundation
# 设为
# 测试中
# 的是
# 重定向
# 放在
# 两种
# 但又
# 报错
# 表单
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在万网主机上快速搭建网站?
HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
制作企业网站建设方案,怎样建设一个公司网站?
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
Laravel如何编写单元测试和功能测试?(PHPUnit示例)
jQuery 常见小例汇总
Laravel如何实现一对一模型关联?(Eloquent示例)
什么是JavaScript解构赋值_解构赋值有哪些实用技巧
Laravel项目怎么部署到Linux_Laravel Nginx配置详解
Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)
如何用好域名打造高点击率的自主建站?
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
python中快速进行多个字符替换的方法小结
Laravel如何生成和使用数据填充?(Seeder和Factory示例)
百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧
html5的keygen标签为什么废弃_替代方案说明【解答】
php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】
Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】
Laravel怎么使用artisan命令缓存配置和视图
Firefox Developer Edition开发者版本入口
jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】
Laravel如何构建RESTful API_Laravel标准化API接口开发指南
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
JavaScript数据类型有哪些_如何准确判断一个变量的类型
Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程
Laravel观察者模式如何使用_Laravel Model Observer配置
Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程
电商网站制作价格怎么算,网上拍卖流程以及规则?
Android仿QQ列表左滑删除操作
Linux系统命令中tree命令详解
如何做网站制作流程,*游戏网站怎么搭建?
深圳网站制作培训,深圳哪些招聘网站比较好?
Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲
Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践
Laravel怎么清理缓存_Laravel optimize clear命令详解
作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】
Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】
微信推文制作网站有哪些,怎么做微信推文,急?
PythonWeb开发入门教程_Flask快速构建Web应用
Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程
网站制作大概多少钱一个,做一个平台网站大概多少钱?
BootStrap整体框架之基础布局组件
如何快速选择适合个人网站的云服务器配置?
常州企业网站制作公司,全国继续教育网怎么登录?
如何基于云服务器快速搭建个人网站?
Java类加载基本过程详细介绍
Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能


