Laravel如何编写单元测试和功能测试?(PHPUnit示例)
发布时间 - 2025-12-15 00:00:00 点击率:次Laravel单元测试专注单个类或方法逻辑,使用PHPUnit集成,测试文件置于tests/Unit/目录,类名以Test结尾、方法以test_开头,不依赖HTTP请求或数据库,可用Mockery模拟外部依赖。
在 Laravel 中编写单元测试和功能测试,核心是利用内置的 PHPUnit 集成和丰富的测试辅助方法。Laravel 默认已配置好 phpunit.xml,测试文件放在 tests/ 目录下,通过 php artisan test(或 vendor/bin/phpunit)运行。
单元测试:专注单个类或方法逻辑
单元测试验证模型、服务类、帮助函数等不依赖 HTTP 请求或数据库(或使用内存数据库/模拟)的独立逻辑。Laravel 提供 TestCase 基类,但单元测试通常继承更轻量的 \Tests\TestCase 或直接用 PHPUnit\Framework\TestCase。
- 将测试类放在
tests/Unit/目录下,类名以Test结尾(如CalculatorTest.php) - 方法名以
test_开头或用@test注释标记 - 避免使用
$this->get()、$this->actingAs()等 HTTP 相关方法 - 如需隔离外部依赖,用
Mockery模拟(Laravel 自带)或 PHP 的createMock()
示例(测试一个简单的服务类):
// tests/Unit/PriceCalculatorTest.php
withTax(100, 0.15);
$this->assertEquals(115, $total);
}
}
功能测试:模拟真实 HTTP 请求与用户交互
功能测试(也称“特性测试”)验证整个请求生命周期:路由 → 控制器 → 视图/响应,常涉及数据库、认证、会话等。Laravel 的 \Tests\TestCase 提供了开箱即用的测试工具链。
- 测试类放在
tests/Feature/目录下 - 默认启用数据库迁移(每次测试前重置
sqlite:memory),也可用@database注解或RefreshDatabasetrait - 常用断言:
$this->get()、$this->post()、$this->assertStatus(200)、$this->assertSee('Welcome')、$this->assertJson(...) - 登录用户可用
$this->actingAs($user),无需真实 session
示例(测试文章列表页):
// tests/Feature/ArticleIndexTest.php
count(3)->create();
$response = $this->get('/articles');
$response->assertStatus(200);
$response->assertSee('Articles');
$response->assertSeeText('Article Title 1');
$response->assertJsonCount(3, 'data');
}
}
数据库测试技巧:工厂、种子与事务控制
Laravel 测试中操作数据库最推荐的方式是模型工厂(Factories)+ RefreshDatabase trait,它自动在每个测试前后用事务回滚,速度快且隔离性好。
- 用
Article::factory()->create()创建测试数据,支持属性覆盖:['title' => 'Test'] - 批量创建:
Article::factory()->count(5)->create() - 关联数据可链式调用:
User::factory()->hasPosts(3)->create() - 避免在测试中手动写
DB::table(...)->insert(...),破坏可读性和维护性 - 如需完整迁移(比如测试迁移本身),用
UsesTransactions替换或禁用RefreshDatabase
运行与调试测试的实用建议
- 只运行某个测试类:
php artisan test --filter ArticleIndexTest - 只运行某个方法:
php artisan test --filter test_articles_page_returns_successful_response - 查看详细输出(含异常堆栈):
php artisan test -v - 生成覆盖率报告(需安装 Xdebug 或 PCOV):
php artisan test --coverage-html coverage - 失败时快速定位:检查是否忘记
use RefreshDatabase;,或模型未加$fillable导致工厂创建失败
基本上就这些。Laravel 的测试体验
流畅,关键在于分清单元与功能的边界,善用工厂和测试 trait,让测试既可靠又易维护。
# php
# laravel
# html
# count
# Session
# xml
# Filter
# 继承
# 栈
# 堆
# this
# table
# sqlite
# database
# 数据库
# http
# 放在
# 单元测试
# 链式
# 如需
# 目录下
# 不依赖
# 测试中
# 自带
# 速度快
# 既可
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】
JS中对数组元素进行增删改移的方法总结
浅析上传头像示例及其注意事项
如何在香港服务器上快速搭建免备案网站?
js实现点击每个li节点,都弹出其文本值及修改
Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
零基础网站服务器架设实战:轻量应用与域名解析配置指南
Laravel如何使用Gate和Policy进行授权?(权限控制)
利用python获取某年中每个月的第一天和最后一天
佛山网站制作系统,佛山企业变更地址网上办理步骤?
html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】
Laravel如何创建自定义Facades?(详细步骤)
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录
为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
如何用JavaScript实现文本编辑器_光标和选区怎么处理
网站制作企业,网站的banner和导航栏是指什么?
MySQL查询结果复制到新表的方法(更新、插入)
北京的网站制作公司有哪些,哪个视频网站最好?
C语言设计一个闪闪的圣诞树
JavaScript如何实现继承_有哪些常用方法
详解jQuery中基本的动画方法
制作旅游网站html,怎样注册旅游网站?
Android Socket接口实现即时通讯实例代码
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程
如何在Tomcat中配置并部署网站项目?
Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】
实例解析Array和String方法
如何确认建站备案号应放置的具体位置?
Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID
小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像
在线制作视频的网站有哪些,电脑如何制作视频短片?
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知
谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程
浅述节点的创建及常见功能的实现
Laravel模型关联查询教程_Laravel Eloquent一对多关联写法
如何在阿里云域名上完成建站全流程?
Laravel怎么导出Excel文件_Laravel Excel插件使用教程
如何确保FTP站点访问权限与数据传输安全?
javascript日期怎么处理_如何格式化输出
Laravel集合Collection怎么用_Laravel集合常用函数详解
Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】
Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】
制作企业网站建设方案,怎样建设一个公司网站?

