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 注解或 RefreshDatabase trait
  • 常用断言:$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生成别名【方法】  制作企业网站建设方案,怎样建设一个公司网站?