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如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】
常州企业网站制作公司,全国继续教育网怎么登录?
作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
Python文件异常处理策略_健壮性说明【指导】
制作电商网页,电商供应链怎么做?
Laravel如何实现一对一模型关联?(Eloquent示例)
Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】
linux写shell需要注意的问题(必看)
如何获取上海专业网站定制建站电话?
Win11怎样安装网易有道词典_Win11安装词典教程【步骤】
如何快速查询网址的建站时间与历史轨迹?
laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法
深圳网站制作平台,深圳市做网站好的公司有哪些?
Swift中swift中的switch 语句
Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】
浅析上传头像示例及其注意事项
如何正确选择百度移动适配建站域名?
香港服务器建站指南:免备案优势与SEO优化技巧全解析
手机网站制作与建设方案,手机网站如何建设?
魔毅自助建站系统:模板定制与SEO优化一键生成指南
如何用5美元大硬盘VPS安全高效搭建个人网站?
零服务器AI建站解决方案:快速部署与云端平台低成本实践
Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】
微信小程序 scroll-view组件实现列表页实例代码
怎么用AI帮你为初创公司进行市场定位分析?
如何快速重置建站主机并恢复默认配置?
javascript中闭包概念与用法深入理解
Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用
b2c电商网站制作流程,b2c水平综合的电商平台?
手机软键盘弹出时影响布局的解决方法
如何在万网主机上快速搭建网站?
Win11关机界面怎么改_Win11自定义关机画面设置【工具】
JS去除重复并统计数量的实现方法
Bootstrap整体框架之CSS12栅格系统
如何快速上传建站程序避免常见错误?
Laravel API资源类怎么用_Laravel API Resource数据转换
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
怎样使用JSON进行数据交换_它有什么限制
Laravel如何自定义错误页面(404, 500)?(代码示例)
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
如何快速选择适合个人网站的云服务器配置?
Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】
如何用PHP工具快速搭建高效网站?
Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】
微信小程序制作网站有哪些,微信小程序需要做网站吗?
电商网站制作价格怎么算,网上拍卖流程以及规则?
英语简历制作免费网站推荐,如何将简历翻译成英文?
Laravel怎么在Blade中安全地输出原始HTML内容
ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法

