巴青农资商城

商品分类测试用例.md 25KB

商品分类 — 测试用例(C 端)

依据: 《商品分类功能需求.md》v1.0.1、《商品分类技术方案.md》v1.0
关联: 平台《商品分类测试用例.md》CAT-UT-013/014(同源 isCategoryVisible)、C 端《商城首页测试用例.md》MHP-UI-008/009(HM7 入口)、《关联需求分析.md》§11
范围: C 端 /api/category/tree/api/category/{level1Id}/level2-tabs/api/category/goodsCategoryAppServiceImpl / CategoryAppController
代码落位: baqing-shop/src/main/java/com/ruoyi/web/modules/home/
排除: 搜索执行与结果页、商品详情可购四条件校验、平台/店铺分类 CRUD、店铺商品分类 C 端导航、聚合 /api/category/index
环境: RuoYi v3.9.2-springboot2;MySQL 5.7.39;C 端 无需 Token@Anonymous);UI 使用 Playwright channel: 'chrome'


用例编号说明

前缀 类型 工具
CGC-UT-xxx 单元测试 JUnit 5 + Mockito
CGC-API-xxx 接口测试 MockMvc / Apifox
CGC-UI-xxx 界面测试 Playwright(Google Chrome)

命名: CGC = Consumer Goods Category(C 端商品分类);与平台 CAT- 区分。


测试数据约定

实体 说明
平台一级 L1-A「兽药」show=1 sort=0;L1-B「饲料」show=1 sort=1;L1-H 隐藏 show=0;L1-E 空壳(无可见二级);L1-S 店铺101一级(不应出现
平台二级 L1-A 下 L2-A1「抗生素」、L2-A2「驱虫药」show=1;L2-H 隐藏 show=0;L2-P 父级 L1-H(不可见
店铺 S101 开业;S102 停业;S103 已删
出售中商品 G-A1@L2-A1 销量100 价88;G-A2 销量100 价99(同销量测排序);G-A3 销量50;G-B1@S102 停业;G-Z1 stock=0;G-O1 已下架/待审核(不进列表
会员 M1 正常;M2 禁用(分类仍可读)

一、单元测试

CGC-UT-001 分类树委托平台 Facade

要素 内容
用例编号 CGC-UT-001
测试模块 C 端商品分类
测试项 listCategoryTree
测试类型 单元测试
测试工具 JUnit 5 + Mockito
测试目的 验证 GC1、GC6
前置条件 Mock ICategoryFacade.listVisibleByShopId(null) 返回含 L1-A 树
测试步骤 调用 listCategoryTree()
预期结果 调用 listVisibleByShopId(null);返回与 Facade 一致

CGC-UT-002 分类树空列表

要素 内容
用例编号 CGC-UT-002
测试模块 C 端商品分类
测试项 listCategoryTree 空态
测试类型 单元测试
测试工具 JUnit 5 + Mockito
测试目的 验证 §5.3 边界
前置条件 Facade 返回 empty
测试步骤 listCategoryTree()
预期结果 空 List; 抛异常

CGC-UT-003 二级 Tab 一级可见时返回

要素 内容
用例编号 CGC-UT-003
测试模块 C 端商品分类
测试项 listLevel2Tabs
测试类型 单元测试
测试工具 JUnit 5 + Mockito
测试目的 验证 GC5、GC7
前置条件 L1-A 一级 show=1;Mapper 返回 L2-A1、L2-A2
测试步骤 listLevel2Tabs(L1-A.id)
预期结果 返回 2 条二级;顺序与 Mapper 一致

CGC-UT-004 二级 Tab 一级隐藏拒绝

要素 内容
用例编号 CGC-UT-004
测试模块 C 端商品分类
测试项 listLevel2Tabs 校验
测试类型 单元测试
测试工具 JUnit 5 + Mockito
测试目的 验证 GC6
前置条件 L1-H show=0
测试步骤 listLevel2Tabs(L1-H.id)
预期结果 ServiceException;msg 含「不可见」或「不存在」

CGC-UT-005 商品列表缺 categoryId

要素 内容
用例编号 CGC-UT-005
测试模块 C 端商品分类
测试项 listCategoryGoods 必填
测试类型 单元测试
测试工具 JUnit 5 + Mockito
测试目的 验证 §3.4 校验
前置条件 query.categoryId 为空
测试步骤 listCategoryGoods(query)
预期结果 ServiceException;「请选择商品分类」类提示

CGC-UT-006 商品列表分类不可见拒绝

要素 内容
用例编号 CGC-UT-006
测试模块 C 端商品分类
测试项 isCategoryVisible
测试类型 单元测试
测试工具 JUnit 5 + Mockito
测试目的 验证 GC6
前置条件 isCategoryVisible(L2-H)=false
测试步骤 listCategoryGoods({categoryId:L2-H})
预期结果 ServiceException;「分类不存在或不可见」

CGC-UT-007 商品列表默认销量降序

要素 内容
用例编号 CGC-UT-007
测试模块 C 端商品分类
测试项 sortBy 默认
测试类型 单元测试
测试工具 JUnit 5 + Mockito
测试目的 验证 GC9
前置条件 L2-A1 可见;sortBy 未传
测试步骤 listCategoryGoods(query)
预期结果 Mapper 调用 sortBy=sales_desc

CGC-UT-008 商品列表价格升序排序

要素 内容
用例编号 CGC-UT-008
测试模块 C 端商品分类
测试项 sortBy price_asc
测试类型 单元测试
测试工具 JUnit 5 + Mockito
测试目的 验证 GC9
前置条件 query.sortBy=price_asc
测试步骤 listCategoryGoods(query)
预期结果 Mapper 入参 price_asc

CGC-UT-009 非法 sortBy 拒绝

要素 内容
用例编号 CGC-UT-009
测试模块 C 端商品分类
测试项 sortBy 校验
测试类型 单元测试
测试工具 JUnit 5 + Mockito
测试目的 验证 §3.4
前置条件 sortBy=invalid;分类可见
测试步骤 listCategoryGoods(query)
预期结果 ServiceException;「排序参数无效」

CGC-UT-010 商品列表透传 Mapper 顺序

要素 内容
用例编号 CGC-UT-010
测试模块 C 端商品分类
测试项 列表顺序
测试类型 单元测试
测试工具 JUnit 5 + Mockito
测试目的 验证 GC8
前置条件 Mapper 返回 G-A1 在 G-A3 前
测试步骤 listCategoryGoods(query)
预期结果 结果顺序与 Mapper 一致

CGC-UT-011 商品列表零条

要素 内容
用例编号 CGC-UT-011
测试模块 C 端商品分类
测试项 列表空态
测试类型 单元测试
测试工具 JUnit 5 + Mockito
测试目的 验证 §7.4
前置条件 Mapper 返回 empty
测试步骤 listCategoryGoods(query)
预期结果 空 List

CGC-UT-012 Facade null 树返回空

要素 内容
用例编号 CGC-UT-012
测试模块 C 端商品分类
测试项 listCategoryTree null
测试类型 单元测试
测试工具 JUnit 5 + Mockito
测试目的 验证健壮性
前置条件 Facade 返回 null
测试步骤 listCategoryTree()
预期结果 空 List; NPE

二、接口测试

CGC-API-001 分类树无需 Token

要素 内容
用例编号 CGC-API-001
测试模块 C 端商品分类
测试项 GET /tree 匿名
测试类型 接口测试
测试工具 MockMvc / Apifox
测试目的 验证 GC2
前置条件 不传 Authorization
测试步骤 GET /api/category/tree
预期结果 code=200data 为数组

CGC-API-002 分类树含 children 契约

要素 内容
用例编号 CGC-API-002
测试模块 C 端商品分类
测试项 tree VO
测试类型 接口测试
测试工具 MockMvc
测试目的 验证 §3.2
前置条件 存在 L1-A 含 L2-A1
测试步骤 GET /tree
预期结果 categoryId/categoryName/children;child 含 categoryId/categoryName

CGC-API-003 分类树不含 show=0 一级

要素 内容
用例编号 CGC-API-003
测试模块 C 端商品分类
测试项 tree 过滤
测试类型 接口测试
测试工具 Apifox
测试目的 验证 GC6
前置条件 库中 L1-H show=0
测试步骤 GET /tree
预期结果 不含 L1-H

CGC-API-004 分类树不含空壳一级

要素 内容
用例编号 CGC-API-004
测试模块 C 端商品分类
测试项 空壳一级
测试类型 接口测试
测试工具 Apifox
测试目的 验证 GC6、§4.2
前置条件 L1-E show=1 但无可见二级
测试步骤 GET /tree
预期结果 不含 L1-E

CGC-API-005 分类树不含店铺分类

要素 内容
用例编号 CGC-API-005
测试模块 C 端商品分类
测试项 平台隔离
测试类型 接口测试
测试工具 Apifox
测试目的 验证 GC1
前置条件 存在 L1-S(shop_id=101)
测试步骤 GET /tree
预期结果 不含 L1-S

CGC-API-006 二级 Tab 正常返回

要素 内容
用例编号 CGC-API-006
测试模块 C 端商品分类
测试项 GET level2-tabs
测试类型 接口测试
测试工具 MockMvc
测试目的 验证 GC5
前置条件 L1-A 可见;下有 L2-A1、L2-A2
测试步骤 GET /api/category/{L1-A}/level2-tabs
预期结果 code=200data.length=2

CGC-API-007 二级 Tab 排序升序

要素 内容
用例编号 CGC-API-007
测试模块 C 端商品分类
测试项 Tab sort_no
测试类型 接口测试
测试工具 Apifox
测试目的 验证 GC7
前置条件 L2-A1 sort=0;L2-A2 sort=1
测试步骤 GET level2-tabs
预期结果 第一条 categoryId=L2-A1

CGC-API-008 二级 Tab 一级不存在

要素 内容
用例编号 CGC-API-008
测试模块 C 端商品分类
测试项 level1 校验
测试类型 接口测试
测试工具 MockMvc
测试目的 验证 §3.3
前置条件 level1Id=99999
测试步骤 GET /api/category/99999/level2-tabs
预期结果 业务失败;提示分类不存在/不可见

CGC-API-009 二级 Tab 一级隐藏

要素 内容
用例编号 CGC-API-009
测试模块 C 端商品分类
测试项 level1 show=0
测试类型 接口测试
测试工具 Apifox
测试目的 验证 GC6
前置条件 L1-H show=0
测试步骤 GET /api/category/{L1-H}/level2-tabs
预期结果 业务失败

CGC-API-010 商品列表分页成功

要素 内容
用例编号 CGC-API-010
测试模块 C 端商品分类
测试项 GET /goods
测试类型 接口测试
测试工具 MockMvc
测试目的 验证 §3.4
前置条件 L2-A1 可见;≥1 出售中商品
测试步骤 GET /api/category/goods?categoryId=&pageNum=1&pageSize=10
预期结果 code=200;含 rowstotal

CGC-API-011 商品列表字段契约

要素 内容
用例编号 CGC-API-011
测试模块 C 端商品分类
测试项 goods VO
测试类型 接口测试
测试工具 MockMvc
测试目的 验证 GC10
前置条件 G-A1 出售中
测试步骤 GET /goods?categoryId=L2-A1
预期结果 row 含 goodsId/goodsName/mainPic/salePrice/shopId/shopName

CGC-API-012 商品列表缺 categoryId

要素 内容
用例编号 CGC-API-012
测试模块 C 端商品分类
测试项 categoryId 必填
测试类型 接口测试
测试工具 MockMvc
测试目的 验证 §3.4
前置条件
测试步骤 GET /api/category/goods
预期结果 业务失败

CGC-API-013 商品列表分类不可见

要素 内容
用例编号 CGC-API-013
测试模块 C 端商品分类
测试项 隐藏二级
测试类型 接口测试
测试工具 Apifox
测试目的 验证 GC6
前置条件 L2-H show=0
测试步骤 GET /goods?categoryId=L2-H
预期结果 业务失败;「分类不存在或不可见」

CGC-API-014 商品列表默认销量降序

要素 内容
用例编号 CGC-API-014
测试模块 C 端商品分类
测试项 默认排序
测试类型 接口测试
测试工具 Apifox
测试目的 验证 GC9
前置条件 G-A1 销量100;G-A3 销量50
测试步骤 GET /goods?categoryId=L2-A1(无 sortBy)
预期结果 首条 goodsId=G-A1

CGC-API-015 商品列表价格升序

要素 内容
用例编号 CGC-API-015
测试模块 C 端商品分类
测试项 sortBy price_asc
测试类型 接口测试
测试工具 Apifox
测试目的 验证 GC9
前置条件 G-A1 价88;G-A2 价99
测试步骤 GET /goods?categoryId=L2-A1&sortBy=price_asc
预期结果 首条价 更低 的商品

CGC-API-016 商品列表非法 sortBy

要素 内容
用例编号 CGC-API-016
测试模块 C 端商品分类
测试项 sortBy 校验
测试类型 接口测试
测试工具 MockMvc
测试目的 验证 §3.4
前置条件 L2-A1 可见
测试步骤 GET /goods?categoryId=L2-A1&sortBy=foo
预期结果 业务失败;「排序参数无效」

CGC-API-017 商品列表仅出售中

要素 内容
用例编号 CGC-API-017
测试模块 C 端商品分类
测试项 goods_status
测试类型 接口测试
测试工具 Apifox
测试目的 验证 GC8
前置条件 G-O1 已下架同分类
测试步骤 GET /goods?categoryId=L2-A1
预期结果 不含 G-O1

CGC-API-018 商品列表含停业店商品

要素 内容
用例编号 CGC-API-018
测试模块 C 端商品分类
测试项 浏览层店态
测试类型 接口测试
测试工具 Apifox
测试目的 验证 GC13
前置条件 G-B1@S102 停业、出售中
测试步骤 GET /goods?categoryId=对应二级
预期结果 G-B1

CGC-API-019 禁用会员仍可读

要素 内容
用例编号 CGC-API-019
测试模块 C 端商品分类
测试项 会员禁用
测试类型 接口测试
测试工具 Apifox
测试目的 验证 GC2
前置条件 M2 禁用 Token
测试步骤 带 Token 调 /tree/goods
预期结果 code=200

CGC-API-020 平台改 show 后 goods 拒绝

要素 内容
用例编号 CGC-API-020
测试模块 C 端商品分类
测试项 分类联动
测试类型 接口测试
测试工具 Apifox
测试目的 验证 §10
前置条件 平台将 L2-A1 show 改为 0
测试步骤 GET /goods?categoryId=L2-A1
预期结果 业务失败

三、界面测试(Playwright · Chrome)

路由建议: A /#/mall/category/all;B /#/mall/category/l1/{id};C /#/mall/category/goods?categoryId=(以实际为准)

CGC-UI-001 首页点一级进 B 页

要素 内容
用例编号 CGC-UI-001
测试模块 C 端商品分类
测试项 HM7 入口 B
测试类型 界面测试
测试工具 Playwright(Chrome)
测试目的 验证 GC5、HM7
前置条件 首页已加载;存在 L1-A
测试步骤 点击首页一级「兽药」
预期结果 进入 B 页;可见二级 Tab 与商品列表区

CGC-UI-002 首页点更多进 A 页

要素 内容
用例编号 CGC-UI-002
测试模块 C 端商品分类
测试项 HM7 入口 A
测试类型 界面测试
测试工具 Playwright(Chrome)
测试目的 验证 GC4
前置条件 首页已加载
测试步骤 点击类目区「更多」
预期结果 进入 A 全部分类页;左右分栏可见

CGC-UI-003 A 页左切一级联动右侧

要素 内容
用例编号 CGC-UI-003
测试模块 C 端商品分类
测试项 A 页联动
测试类型 界面测试
测试工具 Playwright(Chrome)
测试目的 验证 GC4、§5.1
前置条件 A 页已打开;有 L1-A、L1-B
测试步骤 点击左侧 L1-B
预期结果 右侧刷新为 L1-B 下二级列表;不跳转 新页

CGC-UI-004 A 页点二级进 C 独立页

要素 内容
用例编号 CGC-UI-004
测试模块 C 端商品分类
测试项 A1 跳转
测试类型 界面测试
测试工具 Playwright(Chrome)
测试目的 验证 GC4、GC5a
前置条件 A 页右侧有 L2-A1
测试步骤 点击「抗生素」
预期结果 进入 C 独立列表页 Tab;可见路径「兽药 > 抗生素」

CGC-UI-005 B 页默认选中首 Tab

要素 内容
用例编号 CGC-UI-005
测试模块 C 端商品分类
测试项 默认 Tab
测试类型 界面测试
测试工具 Playwright(Chrome)
测试目的 验证 §6.1
前置条件 从首页进入 L1-A
测试步骤 观察 Tab 与列表
预期结果 排序最靠前 的二级 Tab 高亮;列表对应该 Tab

CGC-UI-006 B 页切换 Tab 列表回顶

要素 内容
用例编号 CGC-UI-006
测试模块 C 端商品分类
测试项 C1 回顶
测试类型 界面测试
测试工具 Playwright(Chrome)
测试目的 验证 GC5、C1
前置条件 B 页列表已下滚
测试步骤 点击另一二级 Tab
预期结果 列表 回顶;展示新 Tab 商品

CGC-UI-007 搜索栏占位文案

要素 内容
用例编号 CGC-UI-007
测试模块 C 端商品分类
测试项 搜索占位
测试类型 界面测试
测试工具 Playwright(Chrome)
测试目的 验证 GC3
前置条件 打开 A 或 B 或 C 页
测试步骤 读取搜索框 placeholder
预期结果 「搜索兽药、饲料、店铺」

CGC-UI-008 点击搜索栏进搜索页

要素 内容
用例编号 CGC-UI-008
测试模块 C 端商品分类
测试项 搜索入口
测试类型 界面测试
测试工具 Playwright(Chrome)
测试目的 验证 GC-S1
前置条件 分类页已加载
测试步骤 点击搜索栏
预期结果 路由至搜索输入页

CGC-UI-009 C 页含搜索栏无 Tab

要素 内容
用例编号 CGC-UI-009
测试模块 C 端商品分类
测试项 C 页结构
测试类型 界面测试
测试工具 Playwright(Chrome)
测试目的 验证 GC5a
前置条件 从 A 进入 C 页
测试步骤 检查页顶结构
预期结果 有搜索栏+路径标题; 二级 Tab

CGC-UI-010 商品卡片字段展示

要素 内容
用例编号 CGC-UI-010
测试模块 C 端商品分类
测试项 列表卡片
测试类型 界面测试
测试工具 Playwright(Chrome)
测试目的 验证 GC10
前置条件 列表有 G-A1
测试步骤 检查首卡
预期结果 可见主图、名称、售价、店铺名; 展示销量数字

CGC-UI-011 切换销量价格排序

要素 内容
用例编号 CGC-UI-011
测试模块 C 端商品分类
测试项 排序 UI
测试类型 界面测试
测试工具 Playwright(Chrome)
测试目的 验证 GC9、§7.3
前置条件 列表 ≥2 条不同价/销量
测试步骤 ① 选「价格升序」② 选「销量降序」
预期结果 列表顺序 随之变化

CGC-UI-012 点击商品进详情

要素 内容
用例编号 CGC-UI-012
测试模块 C 端商品分类
测试项 进详情
测试类型 界面测试
测试工具 Playwright(Chrome)
测试目的 验证 GC11
前置条件 列表有商品
测试步骤 点击商品卡片
预期结果 进入商品详情;URL 含 goodsId

CGC-UI-013 访客与会员均可浏览

要素 内容
用例编号 CGC-UI-013
测试模块 C 端商品分类
测试项 访客/会员
测试类型 界面测试
测试工具 Playwright(Chrome)
测试目的 验证 GC2
前置条件 ① 未登录 ② M1 登录
测试步骤 分别打开 A/B 页
预期结果 均可见分类与列表

CGC-UI-014 零商品空态

要素 内容
用例编号 CGC-UI-014
测试模块 C 端商品分类
测试项 列表空态
测试类型 界面测试
测试工具 Playwright(Chrome)
测试目的 验证 §7.4
前置条件 某二级无出售中商品
测试步骤 打开该二级列表
预期结果 空态文案(如「该分类下暂无商品」)

CGC-UI-015 分类树失败不白屏

要素 内容
用例编号 CGC-UI-015
测试模块 C 端商品分类
测试项 tree 失败
测试类型 界面测试
测试工具 Playwright(Chrome)
测试目的 验证 GC14
前置条件 Mock /tree 500
测试步骤 打开 A 页
预期结果 空态/错误提示; 整页白屏

CGC-UI-016 商品列表失败空态

要素 内容
用例编号 CGC-UI-016
测试模块 C 端商品分类
测试项 goods 失败
测试类型 界面测试
测试工具 Playwright(Chrome)
测试目的 验证 GC14、§7.6
前置条件 Mock /goods 失败;Tab 仍可见
测试步骤 打开 B 页
预期结果 列表区空态;Tab 区 仍展示

四、业务规则覆盖矩阵

规则 UT API UI
GC1 仅平台分类 API-005
GC2 匿名可读 API-001/019 UI-013
GC3 搜索占位 UI-007
GC4 A 页/A→C UT-003 API-002 UI-002/003/004
GC5 B Tab+列表 UT-003 API-006/007 UI-001/005/006
GC5a C 独立页 UI-004/009
GC6 可见性 UT-004/006 API-003/004/008/009/013/020
GC7 排序 API-007
GC8 出售中 UT-010 API-017
GC9 四档排序 UT-007/008/009 API-014/015/016 UI-011
GC10 卡片字段 API-011 UI-010
GC11 进详情 UI-012
GC12 展示≠可购
GC13 停业/零库存 API-018
GC14 模块空态 UT-011/012 UI-015/016
GC15 无写接口

五、自动化映射

用例 建议代码位置
CGC-UT-001~012 CategoryAppServiceImplTest.java
CGC-API-001~020 CategoryAppControllerTest.java
CGC-UI-001~016 e2e/consumer/category.spec.ts(Playwright channel: 'chrome'

六、用例统计

类型 数量
单元测试 CGC-UT 12
接口测试 CGC-API 20
界面测试 CGC-UI 16
合计 48

七、修订记录

版本 说明
v1.0 首版;48 用例;覆盖 GC1~GC15、A/B/C 三页、四档排序、HM7 入口

文档版本:v1.0 · 关联《商品分类功能需求.md》v1.0.1、《商品分类技术方案.md》v1.0