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 】
相关推荐:
夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化
如何快速搭建高效WAP手机网站吸引移动用户?
Laravel如何与Inertia.js和Vue/React构建现代单页应用
Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程
Linux后台任务运行方法_nohup与&使用技巧【技巧】
Java解压缩zip - 解压缩多个文件或文件夹实例
jQuery中的100个技巧汇总
Linux网络带宽限制_tc配置实践解析【教程】
Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】
大同网页,大同瑞慈医院官网?
node.js报错:Cannot find module 'ejs'的解决办法
Laravel如何使用Blade组件和插槽?(Component代码示例)
香港服务器租用每月最低只需15元?
Win11怎么开启自动HDR画质_Windows11显示设置HDR选项
Internet Explorer官网直接进入 IE浏览器在线体验版网址
Laravel如何创建自定义Artisan命令?(代码示例)
如何使用 jQuery 正确渲染 Instagram 风格的标签列表
如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】
专业商城网站制作公司有哪些,pi商城官网是哪个?
如何快速选择适合个人网站的云服务器配置?
jquery插件bootstrapValidator表单验证详解
Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置
Claude怎样写结构化提示词_Claude结构化提示词写法【教程】
Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】
中山网站推广排名,中山信息港登录入口?
Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲
如何在阿里云部署织梦网站?
如何确认建站备案号应放置的具体位置?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
如何用AWS免费套餐快速搭建高效网站?
轻松掌握MySQL函数中的last_insert_id()
iOS验证手机号的正则表达式
Android自定义listview布局实现上拉加载下拉刷新功能
三星网站视频制作教程下载,三星w23网页如何全屏?
Python制作简易注册登录系统
html文件怎么打开证书错误_https协议的html打开提示不安全【指南】
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
Laravel Fortify是什么,和Jetstream有什么关系
黑客如何通过漏洞一步步攻陷网站服务器?
网站建设要注意的标准 促进网站用户好感度!
EditPlus中的正则表达式 实战(4)
java ZXing生成二维码及条码实例分享
如何用花生壳三步快速搭建专属网站?
进行网站优化必须要坚持的四大原则
如何在阿里云完成域名注册与建站?
Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践
网站制作价目表怎么做,珍爱网婚介费用多少?
为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】
Laravel如何使用模型观察者?(Observer代码示例)

