衣目了然项目测试报告
项目名称:衣目了然(AIWEAR)
测试类型:接口测试(Apifox)+ 功能测试(手工)+ UI 自动化(Selenium)+ 性能测试(JMeter)
测试环境:
- 接口 / 功能:前端 http://localhost:5173;后端 http://localhost:8081/api
- UI 自动化 / 性能:http://8.134.217.89
测试日期:2026-08-08 ~ 2026-08-13
测试人员:Jonkin
用例总数:36 条(接口 20 + 功能 10 + UI 自动化 3 + 性能场景 3)
一、测试结论摘要
1.1 总体
| 测试类型 | 执行数 | 通过 | 不通过 | 功能通过* | 通过率 |
|---|
| 接口测试 | 20 | 13 | 3 | 2 | 75%(15/20) |
| 功能测试 | 10 | 10 | 0 | 0 | 100%(10/10) |
| UI 自动化 | 3 | 3 | 0 | 0 | 100%(3/3) |
| 性能测试 | 3 | 3 | 0 | 0 | 100%(3/3) |
| 合计 | 36 | 29 | 3 | 2 | 86%(31/36) |
*功能通过:接口层功能正确,但响应体非统一 Result 格式。
1.2 接口测试结论
核心业务流程符合预期。受缺少全局异常处理类影响的接口用例共 5 条:t002、t003、t005、t011、t013。上述用例在 Java 后端已能输出正确错误消息,问题在于未通过统一Result返回给 Apifox/前端。
1.3 功能测试结论
10 条核心功能用例全部通过。登录、路由守卫、编辑主流程、图片列表、退出登录、历史记录均正常。编辑页对「未选图」「未填指令」采用提交按钮禁用(disabled)的前置校验,与「提交后文字提示」等效,视为通过。
1.4 UI 自动化结论
3 条 Selenium 用例全部通过。覆盖密码登录成功、未登录访问受保护页拦截(含redirect)、退出登录后再次拦截,与手工用例 UI-01 / UI-02 / UI-09 对应。
1.5 性能测试结论
3 个 JMeter 场景均通过(数据以桌面性能测试/*/index.html为准)。覆盖登录鉴权尖峰、图片列表高并发读取、图片上传写路径。登录/上传错误率0%;列表错误率0.2%(500 样本中 1 条失败,整体仍达标)。上传平均约15.7s,为写路径性能关注点。
二、功能测试明细(浏览器手工)
| 用例编号 | 模块 | 用例标题 | 优先级 | 是否通过 | 实际结果摘要 |
|---|
| UI-01 | 登录/路由 | 未登录访问受保护页 | P0 | 通过 | 访问/edit正常跳转登录页 |
| UI-02 | 登录 | 密码登录成功 | P0 | 通过 | 登录后进入编辑页,页面正常 |
| UI-03 | 登录 | 密码登录失败提示 | P0 | 通过 | 密码错误有明确提示,无法进入系统 |
| UI-04 | 登录态 | 刷新保持登录 | P0 | 通过 | F5 刷新后仍保持登录状态 |
| UI-05 | 编辑 | 未选图时不可提交 | P1 | 通过 | 未选图时提交按钮为 disabled,无法点击 |
| UI-06 | 编辑 | 未填指令时不可提交 | P1 | 通过 | 未填指令时提交按钮为 disabled,无法点击 |
| UI-07 | 编辑 | 正常编辑流程 | P0 | 通过 | 选图+指令后 loading → 正常展示结果图 |
| UI-08 | 我的图片 | 列表展示 | P0 | 通过 | 已上传图片在列表中正常显示 |
| UI-09 | 登录/退出 | 退出登录 | P0 | 通过 | 退出后回到登录页,无法再访问受保护页 |
| UI-10 | 历史记录 | 编辑后有记录 | P1 | 通过 | 编辑成功后历史记录页有对应数据 |
说明:UI-05、UI-06 预期原为「提交后提示错误」;实测为「按钮前置禁用」,属合理交互设计,记通过。
三、接口测试 — 缺陷汇总
BUG-001 缺少全局异常类,错误未统一封装为 Result(影响 t002、t003、t005)
| 用例 | Apifox 响应 | 后端 Java 表现 |
|---|
| t002 密码错误 | HTTP 500,Spring 默认 JSON | 控制台有「用户名或密码错误」 |
| t003 账号为空 | HTTP 500,Spring 默认 JSON | 控制台有「账号不能为空」 |
| t005 邮箱格式错 | HTTP 400,Spring 校验 JSON | 校验已触发,未返回 Result |
BUG-002 必填 Authorization 缺失时 Spring 直接拦截(影响 t011、t013)
- 现象:Apifox 收到 Spring 默认 400 Bad Request
- 功能:未授权请求已拒绝(记通过(功能))
四、接口测试 — 受全局异常类影响用例(5 条)
| 用例编号 | 用例标题 | 是否通过 |
|---|
| t002 | 密码登录-密码错误 | 不通过 |
| t003 | 密码登录-账号为空 | 不通过 |
| t005 | 发送验证码-邮箱格式错误 | 不通过 |
| t011 | 上传图片-无Token | 通过(功能) |
| t013 | 我的图片列表-无Token | 通过(功能) |
五、接口测试用例明细
| 用例编号 | 所属模块 | 用例标题 | 优先级 | 是否通过 |
|---|
| t001 | 用户模块 | 密码登录-成功 | P0 | 通过 |
| t002 | 用户模块 | 密码登录-密码错误 | P0 | 不通过 |
| t003 | 用户模块 | 密码登录-账号为空 | P1 | 不通过 |
| t004 | 用户模块 | 发送验证码-成功 | P1 | 通过 |
| t005 | 用户模块 | 发送验证码-邮箱格式错误 | P1 | 不通过 |
| t006 | 用户模块 | 发送验证码-重复发送 | P1 | 通过 |
| t007 | 用户模块 | 退出登录-成功 | P0 | 通过 |
| t008 | 文件模块 | 上传图片-成功 | P0 | 通过 |
| t009 | 文件模块 | 上传图片-空文件 | P1 | 通过 |
| t010 | 文件模块 | 上传图片-非图片文件 | P1 | 通过 |
| t011 | 文件模块 | 上传图片-无Token | P0 | 通过(功能) |
| t012 | 文件模块 | 我的图片列表-成功 | P0 | 通过 |
| t013 | 文件模块 | 我的图片列表-无Token | P0 | 通过(功能) |
| t014 | 文件模块 | 图片编辑-成功 | P0 | 通过 |
| t015 | 文件模块 | 图片编辑-缺少指令 | P1 | 通过 |
| t016 | 文件模块 | 图片编辑-越权 | P0 | 通过 |
| t017 | 文件模块 | 图片合并-越权 | P0 | 通过 |
| t018 | 文件模块 | 文搜图-成功 | P1 | 通过 |
| t019 | 记录模块 | 历史记录-查询 | P1 | 通过 |
| t020 | 鉴权模块 | Token失效-退出后访问 | P0 | 通过 |
六、UI 自动化测试(Java + Selenium)
6.1 环境与工具
| 项 | 说明 |
|---|
| 被测地址 | http://8.134.217.89 |
| 技术栈 | Java、JUnit 5、Selenium、WebDriverManager、Chrome |
| 测试账号 | testa / 123456 |
| 脚本 | auto001(密码登录)、auto002(未登录拦截)、auto003(退出后再拦截) |
6.2 用例明细
| 用例编号 | 模块 | 用例标题 | 优先级 | 是否通过 | 实际结果摘要 |
|---|
| AUTO-01 | 登录 | 密码登录成功 | P0 | 通过 | 切换密码登录 Tab → 提交正确账号密码 → URL 含/edit,用户菜单可见 |
| AUTO-02 | 登录/路由 | 未登录访问受保护页 | P0 | 通过 | 清空登录态后访问/edit→ 跳转/login,且 URL 带redirect |
| AUTO-03 | 登录/退出 | 退出后再次拦截 | P0 | 通过 | 登录 → 退出 → 再访/edit→ 再次跳转/login |
6.3 用例步骤与预期
AUTO-01 密码登录成功(auto001)
| 步骤 | 操作 | 预期 |
|---|
| 1 | 打开 http://8.134.217.89 | 进入登录页 |
| 2 | 点击「密码登录」Tab | 出现用户名、密码输入框 |
| 3 | 输入 testa / 123456 并提交 | 登录成功 |
| 4 | 断言 | URL 包含/edit;右上角用户按钮存在 |
AUTO-02 未登录路由守卫(auto002)
| 步骤 | 操作 | 预期 |
|---|
| 1 | 打开站点并清空 cookie / localStorage / sessionStorage | 处于未登录状态 |
| 2 | 直接访问/edit | 被路由守卫拦截 |
| 3 | 断言 | URL 包含/login,且包含redirect参数(如?redirect=/edit) |
说明:前端路由在未登录访问需鉴权页时执行next({ name: 'login', query: { redirect: to.fullPath } }),用于登录成功后回跳原页面,故 AUTO-02 断言redirect。
AUTO-03 退出登录后未登录拦截(auto003)
| 步骤 | 操作 | 预期 |
|---|
| 1 | 密码登录成功进入/edit | 登录态有效 |
| 2 | 点击用户菜单 →「退出登录」 | 回到/login |
| 3 | 再次访问/edit | 再次被拦截到/login |
| 4 | 断言 | 当前 URL 包含/login(会话已失效) |
6.4 与手工功能测试对应关系
| UI 自动化 | 对应手工用例 | 说明 |
|---|
| AUTO-01 | UI-02 | 密码登录成功 |
| AUTO-02 | UI-01 | 未登录访问受保护页(自动化额外校验redirect) |
| AUTO-03 | UI-09 | 退出后无法再访问受保护页 |
七、性能测试(JMeter)
7.1 环境与工具
| 项 | 说明 |
|---|
| 被测地址 | http://8.134.217.89 |
| 工具 | Apache JMeter 5.5 |
| 压测机 | 本地 Windows(约 16 逻辑处理器) |
| 测试账号 | 登录尖峰:loadtest01~loadtest10(CSV 参数化);列表/上传(testa):登录取 JWT 后复用 |
| 通过标准 | 错误率 ≤ 1%;核心读接口 P95 < 500ms;写接口以稳定性(低错误率)为主 |
| 结果来源 | 桌面/性能测试/login-report、list-report、upload-report的 HTML / statistics.json(2026-08-13 生成) |
7.2 场景设计说明
从业务关键路径选取 3 类接口,避免只压单一 GET:
| 场景 | 接口 | 类型 | 设计意图 |
|---|
| PERF-01 | POST /api/user/auth | 鉴权入口 | 模拟多人同时登录尖峰 |
| PERF-02 | GET /api/file/my-images | 高频读 | 编辑页/我的图片常调用;使用有图片数据账号 |
| PERF-03 | POST /api/file/upload/image | 写路径 | 验证 multipart 上传 + OSS/存储并发稳定性 |
7.3 场景明细与结果(以 HTML 报告为准)
PERF-01 登录鉴权尖峰
| 项 | 配置 / 结果 |
|---|
| 方法 | 10 账号 CSV 参数化;多线程并发登录(含同步定时器尖峰) |
| Header | Content-Type: application/json(无需 Token) |
| Body | {"account":"${username}","password":"${password}"} |
| 样本数 | 500 |
| 平均 / 中位 | 702.5 ms / 701 ms |
| 最小 / 最大 | 125 ms / 1312 ms |
| P90 / P95 / P99 | 1105.9 / 1145.8 / 1253.9 ms |
| 错误率 | 0.00%(0/500) |
| 吞吐量 | 43.5/sec |
| HTML | 性能测试/login-report/index.html |
| 结论 | 通过— 鉴权入口稳定无错误;P90 约 1.1s |
![]() |
PERF-02 图片列表高并发读取(有图数据)
| 项 | 配置 / 结果 |
|---|
| 方法 | 前置登录提取 JWT → 全局属性传递 → 并发压列表 |
| Header | Authorization: Bearer ${__P(token)} |
| 样本数 | 登录 1 + 列表500(合计 501) |
| 登录耗时 | 163 ms(错误率 0%) |
| 列表平均 / 中位 | 125.9 ms / 83 ms |
| 列表最小 / 最大 | 29 ms / 21029 ms(存在个别长尾) |
| 列表 P90 / P95 / P99 | 111 / 113 / 123 ms |
| 列表错误率 | 0.20%(1/500) |
| 列表吞吐量 | 22.7/sec |
| HTML | 性能测试/list-report/index.html |
| 结论 | 通过— P95 远低于 500ms;错误率 0.2% ≤ 1%,读接口表现良好 |
![]() |
PERF-03 图片上传写路径
| 项 | 配置 / 结果 |
|---|
| 方法 | 前置登录取 Token;multipart 上传test.jpg;参数名file |
| Header | 仅Authorization: Bearer ${__P(token)}(Content-Type 由 JMeter 自动带 boundary) |
| 样本数 | 上传50 |
| 平均 / 中位 | 15711 ms / 15690 ms(≈15.7 s) |
| 最小 / 最大 | 11005 ms / 21128 ms |
| P90 / P95 / P99 | 19401 / 20391 / 21128 ms |
| 错误率 | 0.00%(0/50) |
| 吞吐量 | 0.26/sec |
| HTML | 性能测试/upload-report/index.html |
| 结论 | 通过(稳定性)— 全部成功;耗时长符合写 OSS/存储特征,为后续优化重点 |
![]() |
7.4 结果对比摘要
| 场景 | 样本(主接口) | 平均 RT | P95 | 错误率 | 吞吐量 | 结论 |
|---|
| PERF-01 登录 | 500 | 702.5 ms | 1145.8 ms | 0% | 43.5/s | 通过 |
| PERF-02 列表 | 500 | 125.9 ms | 113 ms | 0.2% | 22.7/s | 通过 |
| PERF-03 上传 | 50 | 15711 ms | 20391 ms | 0% | 0.26/s | 通过(稳定性) |
解读:列表读最快且 P95 很低;登录中等;上传最慢但零错误。三者形态差异符合「读轻、鉴权中、写重」预期。
7.5 与功能 / 接口测试对应关系
| 性能场景 | 对应已有验证 | 说明 |
|---|
| PERF-01 | t001 / UI-02 | 功能正确后,验证登录并发能力 |
| PERF-02 | t012 / UI-08 | 功能正确后,验证列表高并发读取 |
| PERF-03 | t008 | 功能正确后,验证上传写并发 |
八、改进建议
- 实现全局异常类,修复 t002、t003、t005、t011、t013 的响应封装
- 接口修复后对上述 5 条执行回归
- 功能 / UI 自动化 / 性能三类基线已建立,后续迭代可做对比回归
- 性能方面可选增强:排查列表 0.2% 失败与超长尾(max≈21s);优化上传耗时(P95≈20s);AI 编辑/合并仅做低并发基线