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 】
相关推荐:
Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】
google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?
php在windows下怎么调试_phpwindows环境调试操作说明【操作】
如何快速搭建高效WAP手机网站?
nodejs redis 发布订阅机制封装实现方法及实例代码
香港服务器租用每月最低只需15元?
Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】
Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】
如何快速辨别茅台真假?关键步骤解析
北京的网站制作公司有哪些,哪个视频网站最好?
Laravel如何发送系统通知?(Notification渠道示例)
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
JavaScript如何实现类型判断_typeof和instanceof有什么区别
网站制作软件有哪些,制图软件有哪些?
开心动漫网站制作软件下载,十分开心动画为何停播?
如何在Ubuntu系统下快速搭建WordPress个人网站?
python中快速进行多个字符替换的方法小结
如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
在线制作视频的网站有哪些,电脑如何制作视频短片?
js代码实现下拉菜单【推荐】
Laravel如何实现API版本控制_Laravel API版本化路由设计策略
HTML 中动态设置元素 name 属性的正确语法详解
浅谈Javascript中的Label语句
Laravel如何处理异常和错误?(Handler示例)
Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程
如何正确选择百度移动适配建站域名?
Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】
简历没回改:利用AI润色让你的文字更专业
教你用AI将一段旋律扩展成一首完整的曲子
javascript基本数据类型及类型检测常用方法小结
如何在IIS服务器上快速部署高效网站?
Android自定义控件实现温度旋转按钮效果
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法
如何利用DOS批处理实现定时关机操作详解
JavaScript如何操作视频_媒体API怎么控制播放
Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】
网站制作软件免费下载安装,有哪些免费下载的软件网站?
Swift中swift中的switch 语句
Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明
Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
Win11关机界面怎么改_Win11自定义关机画面设置【工具】
如何在云指建站中生成FTP站点?
Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全
如何在Tomcat中配置并部署网站项目?
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?

