Laravel中如何进行单元测试_Laravel使用PHPUnit编写测试用例【实战】

发布时间 - 2026-01-24 00:00:00    点击率:
PHPUnit 是 Laravel 默认测试框架,测试类须继承 Tests\TestCase 才能使用 refreshDatabase() 等方法;测试文件放 tests/Feature/,命名以 test 开头,可用 php artisan test --filter 运行指定测试。

PHPUnit 是 Laravel 默认集成的测试框架,所有测试用例都必须继承 Illuminate\Foundation\Testing\TestCase 或其子类(如 Tests\TestCase),否则 refreshDatabase()actingAs() 等辅助方法不可用。

如何创建并运行一个基础功能测试

Laravel 的测试文件默认放在 tests/Feature/ 目录下,使用 php artisan make:test UserRegistrationTest 生成后,需确保类继承自 Tests\TestCase。测试方法名必须以 test 开头,否则 PHPUnit 不会识别为测试用例。

  • 运行单个测试: php artisan test --filter=UserRegistrationTest
  • 运行某个测试方法: php artisan test --filter=test_user_can_register
  • 不加 --filter 时,php artisan test 会自动扫描 tests/ 下所有 *Test.php 文件
  • 若测试中调用 $this->get('/') 报错 “Target class [App\Http\Controllers\HomeController] does not exist”,说明路由未启用或控制器命名空间错误——检查 routes/web.php 是否注册了该路由,且控制器路径与 app/Http/Controllers/ 下实际位置一致

数据库迁移与测试数据隔离的关键配置

功能测试常依赖真实数据库行为,但又不能污染开发环境数据。Laravel 提供两种主流方式:RefreshDatabaseDatabaseMigrations,二者均通过 Trait 注入,但底层行为不同。

  • RefreshDatabase:每次测试前清空所有表(truncate),再重建迁移(up),适合大多数场景;它不执行 seeders,除非显式调用 $this->seed()
  • DatabaseMigrations:每次测试前执行 migrate:fresh,即先 downup,速度略慢,但能确保外键约束和初始状态完全一致
  • 若测试中使用了 factory()->create(),注意 Laravel 8+ 已弃用全局 factory() 函数,应改用 User::factory()->create()
  • phpunit.xml 中确认 DB_CONNECTION 环境变量指向 testing 数据库(如 SQLite 内存库 :memory:),避免误操作本地 MySQL

模拟 HTTP 请求与断言响应的常见写法

Laravel 测试中发起请求不是直接调用控制器方法,而是走完整 HTTP 生命周期(中间件、路由、控制器),因此可真实验证权限、重定向、JSON 结构等。

  • GET 请求并断言状态码: $response = $this->get('/users'); $response->assertStatus(200);
  • POST 表单提交并验证重定向: $this->post('/register', ['name' => 'Alice', 'email' => 'a@example.com'])->assertRedirect('/dashboard');
  • 发送 JSON 请求: $this->json('POST', '/api/posts', ['title' => 'Test'])->assertJson(['message' => 'Created']);
  • 断言视图渲染内容: $response->assertViewIs('users.index')->assertViewHas('users', function ($collection) { return $collection->count() === 3; });
  • 若断言失败提示 “Expected status code 200, got 500”,优先检查日志:storage/logs/test.log,常见原因是模型事件监听器抛异常、未配置 APP_KEY 导致加密失败,或队列驱动设为 sync 以外却未启动 Redis
use Tests\TestCase;
use App\Models\User;

class UserRegistrationTest extends TestCase
{
    use RefreshDatabase;

    public function test_user_can_register()
    {
        $response = $this->post('/register', [
            'name' => 'John Doe',
            'email' => 'john@example.com',
            'password' => 'password',
 

'password_confirmation' => 'password', ]); $response->assertRedirect('/dashboard'); $this->assertDatabaseHas('users', [ 'email' => 'john@example.com', ]); } }

真正容易被忽略的是测试环境的配置一致性——比如 config/cache.phpdefault 值在 testing 环境下是否强制设为 array,否则 Redis 缓存未就绪会导致测试随机失败;还有 APP_URL 必须设为有效 URL(如 http://localhost),否则生成的签名 URL 或邮件链接会出错。


# mysql  # php  # word  # laravel  # redis  # js  # json  # go  # app  # ai  # 路由  # 环境变量  # 状态码  # 中间件  # Array  # count  # 命名空间  # 子类  # xml  # Filter  # register  # 继承  # class  # Collection  # function  # 事件  # default  # this  # sqlite  # 数据库  # http  # Foundation  # 设为  # 测试中  # 的是  # 重定向  # 放在  # 两种  # 但又  # 报错  # 表单 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在万网主机上快速搭建网站?  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  制作企业网站建设方案,怎样建设一个公司网站?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  Laravel如何编写单元测试和功能测试?(PHPUnit示例)  jQuery 常见小例汇总  Laravel如何实现一对一模型关联?(Eloquent示例)  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  如何用好域名打造高点击率的自主建站?  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  python中快速进行多个字符替换的方法小结  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  html5的keygen标签为什么废弃_替代方案说明【解答】  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  Laravel怎么使用artisan命令缓存配置和视图  Firefox Developer Edition开发者版本入口  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  JavaScript数据类型有哪些_如何准确判断一个变量的类型  Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程  Laravel观察者模式如何使用_Laravel Model Observer配置  Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程  电商网站制作价格怎么算,网上拍卖流程以及规则?  Android仿QQ列表左滑删除操作  Linux系统命令中tree命令详解  如何做网站制作流程,*游戏网站怎么搭建?  深圳网站制作培训,深圳哪些招聘网站比较好?  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践  Laravel怎么清理缓存_Laravel optimize clear命令详解  作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  微信推文制作网站有哪些,怎么做微信推文,急?  PythonWeb开发入门教程_Flask快速构建Web应用  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程  网站制作大概多少钱一个,做一个平台网站大概多少钱?  BootStrap整体框架之基础布局组件  如何快速选择适合个人网站的云服务器配置?  常州企业网站制作公司,全国继续教育网怎么登录?  如何基于云服务器快速搭建个人网站?  Java类加载基本过程详细介绍  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能