讲师中心 微信公众号
AI工具推荐 视频效率加速

从 Laravel 9 升级 11 的完整测试用例编写指南【质量保障】

千伟同学_4926

千伟同学_4926

发布时间:2026-08-07 18:55:36

|

474人浏览过

|

来源于php中文网

原创

Laravel 11升级后测试失效主因是中间件解析、路由安全、响应机制变更;需检查SQLite内存库配置、RefreshDatabase加载、TestCase基类完整性,并改用actingAs($user, 'sanctum')、withSession()、assertStatus()、assertJson()等新契约。

从 laravel 9 升级 11 的完整测试用例编写指南【质量保障】

从 Laravel 9 升级到 11 后,原有功能测试用例可能因中间件解析路径变更、路由类型安全增强、响应构造机制重构而失效——比如 @authenticated 标签在文档中消失、$this->actingAs() 模拟登录后仍返回 401、或 assertJsonPath() 断言突然报错“Property not found”,这些都不是代码逻辑问题,而是框架底层测试契约已变。

确认测试环境兼容性

第一步:检查 phpunit.xml 中数据库配置是否仍指向 SQLite 内存库。【DB_CONNECTION 必须为 sqlite,DB_DATABASE 必须为 :memory:】 若误设为 mysql 或 pgsql,所有 RefreshDatabase 行为将操作真实开发库,导致数据污染甚至删除。

第二步:运行 php artisan test --dry-run,观察输出是否包含 Illuminate\Foundation\Testing\RefreshDatabase Trait 的加载提示。若无提示,说明测试基类未正确继承 Tests\TestCase,需打开每个 *Test.php 文件,确认 class XxxTest extends TestCase 声明存在且未被注释。

第三步:执行 php artisan make:test DummyTest --feature 并删掉生成文件中全部内容,仅保留最简结构:public function test_true_is_true() { $this->assertTrue(true); }。运行 php artisan test --filter=DummyTest,若报错 Class 'Tests\TestCase' not found,说明 tests/TestCase.php 被意外删除或命名错误,必须从 Laravel 11 官方仓库重新复制该文件。

重写认证相关功能测试

方法一:替换 Auth::attempt() 模拟逻辑为 actingAs() + Sanctum 显式绑定

旧写法(Laravel 9):$response = $this->post('/login', ['email' => $user->email, 'password' => 'password']); → 在 Laravel 11 中会跳过 Session 认证中间件,导致后续请求始终未登录。

新写法(Laravel 11):$user = User::factory()->create(); $this->actingAs($user, 'sanctum')->get('/dashboard');。这一步必须显式指定 guard 名称,否则 Laravel 11 默认使用 web guard,但 actingAs() 在无中间件上下文时不会自动写入 session。

方法二:对 Web 路由测试,改用 withSession() 注入认证态

$user = User::factory()->create(); $this->withSession(['login_id' => $user->id])->get('/dashboard');。注意:Laravel 11 的 Session 驱动默认为 array,不支持持久化,因此不能依赖 session()->put() 后再发起请求,必须在请求前一次性注入完整 session 数组。

修复中间件元数据断言失效

第一步:打开 app/Http/Kernel.php,删除 $middlewareGroups$middleware 属性的全部定义——Laravel 11 已弃用该文件中的中间件声明,所有中间件注册必须移至 bootstrap/app.php 的闭包中。

Laravel
Laravel

避免常见的Laravel错误:N+1查询、批量赋值、缓存陷阱及队列序列化陷阱。

下载

第二步:在 config/apidoc.php(如使用 Scribe)中设置 'use_kernel_for_middleware' => false,否则文档生成器仍将尝试反射空 Kernel 文件,导致 @middleware 注释无法关联到实际中间件链。

第三步:验证中间件是否生效,运行 php artisan apidoc:generate --dry-run,检查输出中是否列出 auth:sanctumthrottle:api 等预期中间件。若未出现,说明 bootstrap/app.php 中未正确调用 $middleware->api(...)$middleware->web(...) 方法。

第四步:在功能测试中,不再依赖 assertRedirect() 隐式判断中间件拦截,改为显式断言状态码:$this->get('/api/user')->assertStatus(401);。因为 Laravel 11 的中间件跳转逻辑已从重定向改为直接返回 JSON 错误响应。

更新响应断言写法

旧版 assertSee('Welcome') 在 Laravel 11 中对 API 路由失效——它只作用于 HTML 响应体,而 Laravel 11 默认将 api 中间件组的响应强制设为 JSON 格式,即使控制器返回字符串也会被包装成 {"message":"Welcome"}

正确做法是:对 API 测试统一使用 assertJson()assertJsonPath()。例如 $this->get('/api/status')->assertJson(['status' => 'ok']);。若控制器返回纯文本,需在路由定义中显式添加 ->withoutMiddleware() 或在测试中加 ->withHeaders(['Accept' => 'text/plain']) 才能触发原始响应。

关键点:【Laravel 11 的 ResponseFactory 强制约束响应结构,任何未通过 ResponseFactory 构造的返回值(如直接 return 'ok')将被自动封装为 JSON,且无法用 assertSee 断言原始字符串】

迁移 RefreshDatabase 使用方式

① 删除所有测试类中手动调用的 Artisan::call('migrate:fresh') —— Laravel 11 的 RefreshDatabase Trait 已优化为在 setUpBeforeClass() 阶段一次性重建迁移,不再每次测试方法执行前重复运行,性能提升 3 倍以上。

② 若测试中使用了 DatabaseMigrations Trait,必须替换为 RefreshDatabase。因为 Laravel 11 移除了 DatabaseMigrationssqlite:memory: 的兼容层,继续使用会导致 SQLSTATE[HY000]: General error: 1 no such table 错误。

③ 对含外键约束的表,无需额外处理。Laravel 11 的 RefreshDatabase 默认启用 foreign_key_constraints: true,只要迁移文件中正确定义了 $table->foreignId('user_id')->constrained();,truncate 操作将自动按依赖顺序清空表。

热门AI工具

更多
立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

9064

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

5501

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2015

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

3408

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

4074

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

3191

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4537

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

3542

2023.11.13

Conan私有仓库搭建教程
Conan私有仓库搭建教程

本专题系统的讲解Conan私有仓库的搭建流程,涵盖仓库服务部署、存储目录配置、用户认证、权限划分和远程地址添加,并介绍内部C++依赖包的上传、下载及版本维护方法。

0

2026.09.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
如何安装 Composer
如何安装 Composer

共1课时 | 179人学习

Composer手册
Composer手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn