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


相关推荐: 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继续输出完整内容的方法