# 店铺管理 — 测试用例 > **依据:** 《店铺管理功能需求.md》v1.3.4、《店铺管理技术方案.md》v1.2.3 > **范围:** 平台管理端 **店铺管理**(列表、添加、编辑、店铺账号管理、删除)及 `IShopFacade` 对外契约;商家端 **`/agri/seller/shop`** 资料维护(§8.4) > **排除:** **店铺设置**(见《店铺设置测试用例.md》)、商家端完整登录与 `shop_id` 切换、子管理员 CRUD、会员体系;商品上架/审核、分类维护的独立用例(删店仅验证商品 Facade 阻断条件);C 端下单 E2E 仅通过 `isShopOpenForOrder` 单元/接口契约验证,不展开用户商城页面 > **环境:** RuoYi v3.9.2;接口基路径 `/agri/shop`;选商户复用 `/agri/merchant/selectList`、`openShopCheck` --- ## 用例编号说明 | 前缀 | 类型 | 工具 | |------|------|------| | SHP-UT-xxx | 单元测试 | JUnit 5 + Mockito | | SHP-API-xxx | 接口测试 | Apifox / REST Assured + 平台 Token | | SHP-UI-xxx | 界面测试 | Playwright(Chromium/Chrome) | --- ## 一、单元测试 ### SHP-UT-001 首家店创建 insert 账号与店铺同事务 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | createShop | | **测试类型** | 单元测试 | | **测试工具** | JUnit + Mockito | | **测试目的** | 验证首家店新建 `biz_merchant_account` + `biz_shop` | | **前置条件** | 商户无账号行;`checkOpenShop` 通过 | | **测试步骤** | `createShop(dto)` 含 password | | **预期结果** | 插入 account 与 shop;`shop_status=0` | ### SHP-UT-002 创建店铺同事务 incrementShopCount | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | createShop 事务 | | **测试类型** | 单元测试 | | **测试工具** | JUnit | | **测试目的** | 验证 §7.5 与商户 shop_count 回写 | | **前置条件** | Mock `IMerchantShopFacade` | | **测试步骤** | 创建成功 | | **预期结果** | 同一 `@Transactional` 内调用 `incrementShopCount(merchantId)` 一次 | ### SHP-UT-003 非首家店不新建账号行 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | createShop | | **测试类型** | 单元测试 | | **测试工具** | JUnit | | **测试目的** | 验证同商户多店共用账号 | | **前置条件** | 商户已有 account 与 1 家店 | | **测试步骤** | 第 2 家店 `loginName` 与现有一致,`password=null` | | **预期结果** | 仅 insert `biz_shop`;account 表行数不变 | ### SHP-UT-004 非首家店登录名不一致阻断 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | createShop | | **测试类型** | 单元测试 | | **测试工具** | JUnit | | **测试目的** | 验证 S4/S5 | | **前置条件** | 已有账号 login=A | | **测试步骤** | 第 2 家店传 login=B | | **预期结果** | 抛错;msg「同一商户下店铺须使用相同经营账号」 | ### SHP-UT-005 登录名全平台唯一校验 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | 账号校验 | | **测试类型** | 单元测试 | | **测试工具** | JUnit | | **测试目的** | 验证 login_name 唯一 | | **前置条件** | 其他商户已占用手机号 X | | **测试步骤** | 首家店使用 X 作为 loginName | | **预期结果** | 失败;「登录名已存在」 | ### SHP-UT-006 店名未删除范围内唯一 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | 店名校验 | | **测试类型** | 单元测试 | | **测试工具** | JUnit | | **测试目的** | 验证 S8 | | **前置条件** | 未删除店名「测试店」已存在 | | **测试步骤** | 新增同名店 | | **预期结果** | 失败;「店铺名称已存在」 | ### SHP-UT-007 checkOpenShop 经营未完善阻断 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | IMerchantFacade | | **测试类型** | 单元测试 | | **测试工具** | JUnit + Mockito | | **测试目的** | 验证 S1 开店前置 | | **前置条件** | `biz_complete=0` | | **测试步骤** | `createShop` 前调 `checkOpenShop` | | **预期结果** | 不创建;reason 经营信息未完善 | ### SHP-UT-008 不设单商户开店数量上限 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | createShop | | **测试类型** | 单元测试 | | **测试工具** | JUnit | | **测试目的** | 验证 S2 | | **前置条件** | 商户已有 10 家店;经营完整、认证正常 | | **测试步骤** | 继续 `createShop` | | **预期结果** | 成功;不因 `shop_count` 拒绝 | ### SHP-UT-009 编辑 UPDATE 排除 merchant_id | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | updateShop | | **测试类型** | 单元测试 | | **测试工具** | JUnit | | **测试目的** | 验证 S7 | | **前置条件** | shop 绑定 merchantId=1 | | **测试步骤** | PUT 体传 `merchantId=2` | | **预期结果** | 库中仍为 1 | ### SHP-UT-010 开业→停业 confirm=false 不落库 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | updateShop | | **测试类型** | 单元测试 | | **测试工具** | JUnit | | **测试目的** | 验证 S12 两步确认 | | **前置条件** | `shop_status=0` | | **测试步骤** | `shopStatus=1, confirm=false` | | **预期结果** | `needConfirm=true`;DB 仍为开业 | ### SHP-UT-011 开业→停业 confirm=true 持久化 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | updateShop | | **测试类型** | 单元测试 | | **测试工具** | JUnit | | **测试目的** | 验证停业保存 | | **前置条件** | 开业店铺 | | **测试步骤** | `shopStatus=1, confirm=true` | | **预期结果** | `shop_status=1`;不触发商品状态 UPDATE | ### SHP-UT-012 停业→开业无需 confirm | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | updateShop | | **测试类型** | 单元测试 | | **测试工具** | JUnit | | **测试目的** | 验证 §3.5 | | **前置条件** | `shop_status=1` | | **测试步骤** | `shopStatus=0` 无 confirm | | **预期结果** | 直接成功为开业 | ### SHP-UT-013 isShopOpenForOrder 停业返回 false | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | IShopFacade | | **测试类型** | 单元测试 | | **测试工具** | JUnit | | **测试目的** | 验证 S13 契约 | | **前置条件** | `shop_status=1`,`del_flag=0` | | **测试步骤** | `isShopOpenForOrder(shopId)` | | **预期结果** | `false` | ### SHP-UT-014 isShopOpenForOrder 逻辑删除返回 false | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | IShopFacade | | **测试类型** | 单元测试 | | **测试工具** | JUnit | | **测试目的** | 验证删店后不可下单 | | **前置条件** | `del_flag=2` | | **测试步骤** | `isShopOpenForOrder` | | **预期结果** | `false` | ### SHP-UT-015 删店预检-存在出售中商品 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | deleteCheck | | **测试类型** | 单元测试 | | **测试工具** | JUnit + Mockito | | **测试目的** | 验证 §11.2 商品条件 | | **前置条件** | `IGoodsFacade.hasBlockingGoods=true` | | **测试步骤** | `deleteCheck(shopId)` | | **预期结果** | `canDelete=false`;含下架商品提示 | ### SHP-UT-016 删店预检-仅已下架商品可删 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | deleteCheck | | **测试类型** | 单元测试 | | **测试工具** | JUnit | | **测试目的** | 验证不要求零商品 | | **前置条件** | 仅有 status=4 商品;无订单 | | **测试步骤** | `deleteCheck` | | **预期结果** | `canDelete=true` | ### SHP-UT-017 删店成功 decrementShopCount 且保留账号 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | deleteShop | | **测试类型** | 单元测试 | | **测试工具** | JUnit | | **测试目的** | 验证 §11.5 末店删账号保留 | | **前置条件** | 商户仅 1 店;预检通过 | | **测试步骤** | `deleteShop` | | **预期结果** | shop `del_flag=2`;`decrementShopCount`;`biz_merchant_account` 仍 `del_flag=0` | ### SHP-UT-018 批量删除任一条失败整批不删 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | 批量删除 | | **测试类型** | 单元测试 | | **测试工具** | JUnit | | **测试目的** | 验证 §3.8 | | **前置条件** | ID1 可删;ID2 有阻塞商品 | | **测试步骤** | `DELETE` 两 ID | | **预期结果** | 失败;两条 shop 均未逻辑删除 | ### SHP-UT-019 改登录名 confirm=false 返回 needConfirm | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | updateAccount | | **测试类型** | 单元测试 | | **测试工具** | JUnit | | **测试目的** | 验证 §7.3 | | **前置条件** | 有账号 | | **测试步骤** | 新 loginName,`confirm=false` | | **预期结果** | `needConfirm=true`;confirmMessage 含「同步至该商户下全部店铺」 | ### SHP-UT-020 改登录名后同商户多店展示一致 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | updateAccount | | **测试类型** | 单元测试 | | **测试工具** | JUnit | | **测试目的** | 验证 S5 同步 | | **前置条件** | 同商户 2 店;`confirm=true` | | **测试步骤** | 更新 account.login_name | | **预期结果** | account 表 1 行更新;列表 JOIN 两店展示新登录名 | ### SHP-UT-021 重置密码 BCrypt 存储 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | updateAccount | | **测试类型** | 单元测试 | | **测试工具** | JUnit | | **测试目的** | 验证密码加密 | | **前置条件** | — | | **测试步骤** | `password=新密码` 保存 | | **预期结果** | 库中 password 为 BCrypt;非明文 | ### SHP-UT-022 ~ SHP-UT-024 店铺设置(已迁出) > **废止:** 逐店 settings 及 `biz_shop` 策略字段已删除。相关用例见 **《店铺设置测试用例.md》**(SSS-UT-* / SSS-API-*)。 ### SHP-UT-025 首家店 password 必填 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | createShop | | **测试类型** | 单元测试 | | **测试工具** | JUnit | | **测试目的** | 验证 §7.6 | | **前置条件** | 无账号 | | **测试步骤** | `password=null` | | **预期结果** | 校验失败 | ### SHP-UT-026 冻结商户 checkOpenShop 失败 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | IMerchantFacade | | **测试类型** | 单元测试 | | **测试工具** | JUnit | | **测试目的** | 验证 §13.2 不可新开店 | | **前置条件** | `cert_status=1` | | **测试步骤** | `checkOpenShop` | | **预期结果** | `allowed=false`;商户已冻结 | ### SHP-UT-027 编辑店名排除自身唯一 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | updateShop | | **测试类型** | 单元测试 | | **测试工具** | JUnit | | **测试目的** | 验证编辑店名规则 | | **前置条件** | 店 A 名称「店1」 | | **测试步骤** | A 编辑仍用「店1」 | | **预期结果** | 保存成功 | --- ## 二、接口测试 ### SHP-API-001 列表分页与默认排序 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | GET /list | | **测试类型** | 接口测试 | | **测试工具** | Apifox | | **测试目的** | 验证列表基础 | | **前置条件** | `agri:shop:list`;≥2 未删店铺 | | **测试步骤** | `GET /agri/shop/list?pageNum=1&pageSize=10` | | **预期结果** | `code=200`;`create_time` 倒序;无 `del_flag=2` | ### SHP-API-002 关键词模糊检索 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | GET /list | | **测试类型** | 接口测试 | | **测试工具** | Apifox | | **测试目的** | 验证 §5 关键词 | | **前置条件** | 店名含「农资」 | | **测试步骤** | `GET /list?keyword=农资` | | **预期结果** | 命中店名/商户名/账号相关记录 | ### SHP-API-003 按店铺状态筛选 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | GET /list | | **测试类型** | 接口测试 | | **测试工具** | Apifox | | **测试目的** | 验证状态筛选 | | **前置条件** | 停业店存在 | | **测试步骤** | `GET /list?shopStatus=1` | | **预期结果** | 全部 `shopStatus=1` | ### SHP-API-004 按商户名称筛选(详情跳转) | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | GET /list | | **测试类型** | 接口测试 | | **测试工具** | Apifox | | **测试目的** | 验证 §4.2 merchantName | | **前置条件** | 某商户下有多店 | | **测试步骤** | `GET /list?merchantName=张三农资` | | **预期结果** | 均为该商户店铺 | ### SHP-API-005 首家店添加成功 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | POST / | | **测试类型** | 接口测试 | | **测试工具** | Apifox | | **测试目的** | 验证开店主流程 S3/S4 | | **前置条件** | 经营完整正常商户;`agri:shop:add`;未占用店名/登录名 | | **测试步骤** | `POST /` 提交完整 body(含 password) | | **预期结果** | `code=200`;`shopStatus=0`;商户 `shop_count+1`;account 已建 | ### SHP-API-006 同商户第二家店添加成功 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | POST / | | **测试类型** | 接口测试 | | **测试工具** | Apifox | | **测试目的** | 验证 §7.2 第二家店 | | **前置条件** | 商户已有 1 店及账号 | | **测试步骤** | `POST /` 同 loginName,`password=null`(§7.2 样例) | | **预期结果** | 成功;account 行数不变;`shop_count` 再 +1 | ### SHP-API-007 添加缺少必填字段失败 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | POST / | | **测试类型** | 接口测试 | | **测试工具** | Apifox | | **测试目的** | 验证必填 | | **前置条件** | — | | **测试步骤** | 缺 `shopPhone` 或头像 | | **预期结果** | 失败;无新店铺 | ### SHP-API-008 店名重复失败 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | POST / | | **测试类型** | 接口测试 | | **测试工具** | Apifox | | **测试目的** | 验证 S8 | | **前置条件** | 店名已存在 | | **测试步骤** | 重复 `shopName` 提交 | | **预期结果** | 「店铺名称已存在」 | ### SHP-API-009 同商户登录名不一致失败 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | POST / | | **测试类型** | 接口测试 | | **测试工具** | Apifox | | **测试目的** | 验证 S4 | | **前置条件** | 已有 login=13800138000 | | **测试步骤** | 第 2 店传 13900139000 | | **预期结果** | 「同一商户下店铺须使用相同经营账号」 | ### SHP-API-010 商户经营未完善不可开店 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | POST / | | **测试类型** | 接口测试 | | **测试工具** | Apifox | | **测试目的** | 验证 S1 | | **前置条件** | `biz_complete=0` 商户 | | **测试步骤** | `POST /` | | **预期结果** | 失败;「请先完善该商户的经营与结算信息」 | ### SHP-API-011 冻结商户不可开店 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | POST / | | **测试类型** | 接口测试 | | **测试工具** | Apifox | | **测试目的** | 验证商户状态阻断 | | **前置条件** | `cert_status=1` | | **测试步骤** | `POST /` | | **预期结果** | 失败;与 `openShopCheck` reason 一致 | ### SHP-API-012 高 shop_count 商户仍可连续开店 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | POST / | | **测试类型** | 接口测试 | | **测试工具** | Apifox | | **测试目的** | 验证 S2 无上限 | | **前置条件** | 商户 `shop_count≥5` 且均可开店 | | **测试步骤** | 再 `POST /` 新店 | | **预期结果** | 成功 | ### SHP-API-013 获取店铺详情 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | GET /{shopId} | | **测试类型** | 接口测试 | | **测试工具** | Apifox | | **测试目的** | 验证详情契约 | | **前置条件** | `agri:shop:query` | | **测试步骤** | `GET /agri/shop/{id}` | | **预期结果** | 含店铺字段、`merchantId`/`merchantName` 只读、账号摘要、`canDelete` | ### SHP-API-014 编辑店铺基础信息成功 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | PUT / | | **测试类型** | 接口测试 | | **测试工具** | Apifox | | **测试目的** | 验证编辑主流程 | | **前置条件** | 开业店;`agri:shop:edit` | | **测试步骤** | 修改 `shopDesc`、`shopPhone`;`shopStatus` 不变 | | **预期结果** | `code=200`;字段更新;商户认证不变 | ### SHP-API-015 编辑传 merchantId 无效 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | PUT / | | **测试类型** | 接口测试 | | **测试工具** | Apifox | | **测试目的** | 验证 S7 | | **前置条件** | shop 属 merchant 1 | | **测试步骤** | body 改 `merchantId=2` | | **预期结果** | 仍为 merchant 1 | ### SHP-API-016 开业→停业两步确认 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | PUT / | | **测试类型** | 接口测试 | | **测试工具** | Apifox | | **测试目的** | 验证 S12 | | **前置条件** | 开业店 | | **测试步骤** | 1. `shopStatus=1, confirm=false` 2. `confirm=true` | | **预期结果** | 步骤1 `needConfirm`;步骤2 `shop_status=1` | ### SHP-API-017 停业→开业直接成功 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | PUT / | | **测试类型** | 接口测试 | | **测试工具** | Apifox | | **测试目的** | 验证停业恢复无需 confirm | | **前置条件** | 停业店 | | **测试步骤** | `shopStatus=0` 保存 | | **预期结果** | 直接开业 | ### SHP-API-018 查询商户经营账号 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | GET /merchant/{id}/account | | **测试类型** | 接口测试 | | **测试工具** | Apifox | | **测试目的** | 验证账号管理查询 | | **前置条件** | 同商户 2 店;`agri:shop:account` | | **测试步骤** | `GET .../account` | | **预期结果** | `adminName`、`loginName` 脱敏;`shops` 数组 2 条 | ### SHP-API-019 修改管理员姓名与重置密码 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | PUT /merchant/{id}/account | | **测试类型** | 接口测试 | | **测试工具** | Apifox | | **测试目的** | 验证账号维护 | | **前置条件** | 有账号 | | **测试步骤** | `PUT` 改 `adminName`、传新 `password` | | **预期结果** | 成功;登录可用新密码(若商家端已实现) | ### SHP-API-020 修改登录名两步确认 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | PUT /merchant/{id}/account | | **测试类型** | 接口测试 | | **测试工具** | Apifox | | **测试目的** | 验证 §7.3 | | **前置条件** | 新登录名未占用 | | **测试步骤** | `confirm=false` 再 `confirm=true` | | **预期结果** | 预检含同步文案;确认后 login 更新;两店列表展示一致 | ### SHP-API-021 登录名重复失败 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | PUT /merchant/{id}/account | | **测试类型** | 接口测试 | | **测试工具** | Apifox | | **测试目的** | 验证平台唯一 | | **前置条件** | 其他商户已用号码 X | | **测试步骤** | 改为 X | | **预期结果** | 「登录名已存在」 | ### SHP-API-022 ~ SHP-API-024 店铺设置(已迁出) > **废止:** `GET/PUT /{id}/settings` 已移除。见 **《店铺设置测试用例.md》** SSS-API-001~004。 ### SHP-API-025 删除预检通过 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | GET /{id}/deleteCheck | | **测试类型** | 接口测试 | | **测试工具** | Apifox | | **测试目的** | 验证删店正向 | | **前置条件** | 无出售中/待审核;无未完成订单 | | **测试步骤** | `GET .../deleteCheck` | | **预期结果** | `canDelete=true` | ### SHP-API-026 删除预检-阻塞商品 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | GET /{id}/deleteCheck | | **测试类型** | 接口测试 | | **测试工具** | Apifox | | **测试目的** | 验证 §11.2 | | **前置条件** | 存在 `goods_status` 为 1 或 2 的商品 | | **测试步骤** | `deleteCheck` | | **预期结果** | `canDelete=false`;含商品处理提示 | ### SHP-API-027 逻辑删除成功 shop_count 减 1 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | DELETE /{ids} | | **测试类型** | 接口测试 | | **测试工具** | Apifox | | **测试目的** | 验证删店主流程 S10 | | **前置条件** | SHP-API-025 通过;`agri:shop:remove` | | **测试步骤** | `DELETE /agri/shop/{id}` | | **预期结果** | 列表不可见;`del_flag=2`;商户 `shop_count-1` | ### SHP-API-028 批量删除部分失败整批取消 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | DELETE /{ids} | | **测试类型** | 接口测试 | | **测试工具** | Apifox | | **测试目的** | 验证批量策略 | | **前置条件** | 一可删一不可删 | | **测试步骤** | `DELETE id1,id2` | | **预期结果** | 「部分店铺不满足删除条件」;均未删除 | ### SHP-API-029 列表经营账号脱敏 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | GET /list | | **测试类型** | 接口测试 | | **测试工具** | Apifox | | **测试目的** | 验证 §7.4 | | **前置条件** | login=13800138000 | | **测试步骤** | 查列表 `accountLoginName` | | **预期结果** | 形如 `138****8000` | ### SHP-API-030 无 add 权限新增 403 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | 权限 | | **测试类型** | 接口测试 | | **测试工具** | Apifox | | **测试目的** | 验证 `@PreAuthorize` | | **前置条件** | Token 无 `agri:shop:add` | | **测试步骤** | `POST /` | | **预期结果** | 403;无新数据 | ### SHP-API-031 GET merchant account 供添加第 2 店带出 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | GET /merchant/{id}/account | | **测试类型** | 接口测试 | | **测试工具** | Apifox | | **测试目的** | 验证添加页带出账号 | | **前置条件** | 商户已有店 | | **测试步骤** | 添加前调用 account 接口 | | **预期结果** | 返回现有 loginName、adminName 供表单默认 | ### SHP-API-032 复用 merchant selectList 仅完整商户 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | GET /agri/merchant/selectList | | **测试类型** | 接口测试 | | **测试工具** | Apifox | | **测试目的** | 验证添加页选商户 S1 | | **前置条件** | 完整/不完整/冻结商户各一 | | **测试步骤** | `GET /agri/merchant/selectList` | | **预期结果** | 仅含经营完整且认证正常商户 | --- ## 三、界面测试(Playwright) > **通用前置:** 平台管理员已登录;Chromium;菜单「农资管理 → 店铺管理」(路由以实现为准)。 ### SHP-UI-001 进入店铺列表页 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | 列表加载 | | **测试类型** | 界面测试 | | **测试工具** | Playwright (Chrome) | | **测试目的** | 验证菜单与列表列 | | **前置条件** | `agri:shop:list` | | **测试步骤** | 登录 → 打开店铺管理 | | **预期结果** | 展示店名、头像、商户名、状态、经营账号、操作;分页默认 | ### SHP-UI-002 关键词检索店铺 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | 高级检索 | | **测试类型** | 界面测试 | | **测试工具** | Playwright | | **测试目的** | 验证 §5 关键词 | | **前置条件** | 存在店名含「测试店」 | | **测试步骤** | 输入关键词 → 查询 | | **预期结果** | 列表仅匹配店铺/商户/账号相关行 | ### SHP-UI-003 按开业/停业筛选 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | 高级检索 | | **测试类型** | 界面测试 | | **测试工具** | Playwright | | **测试目的** | 验证状态筛选 | | **前置条件** | 有停业店 | | **测试步骤** | 选「停业」→ 查询 | | **预期结果** | 列表均为停业状态 | ### SHP-UI-004 清空检索恢复默认列表 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | 高级检索 | | **测试类型** | 界面测试 | | **测试工具** | Playwright | | **测试目的** | 验证清空条件 | | **前置条件** | 已筛选缩小结果 | | **测试步骤** | 点重置/清空 → 查询 | | **预期结果** | 恢复全量未删店铺列表 | ### SHP-UI-005 添加首家店-完整表单提交 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | 添加店铺 | | **测试类型** | 界面测试 | | **测试工具** | Playwright | | **测试目的** | 验证开店 UI 主流程 | | **前置条件** | 可选完整商户;有 add 权限 | | **测试步骤** | 新增 → 选商户 → 填店名/头像/电话/账号密码 → 提交 | | **预期结果** | 成功;列表新店状态=开业;商户店铺数+1 | ### SHP-UI-006 添加第二家店默认带出经营账号 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | 添加店铺 | | **测试类型** | 界面测试 | | **测试工具** | Playwright | | **测试目的** | 验证 §6.3 带出 | | **前置条件** | 商户已有 1 店 | | **测试步骤** | 选同商户 → 观察账号区 | | **预期结果** | 登录名、管理员姓名自动填充;密码可空或可选重置 | ### SHP-UI-007 添加必填项为空校验 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | 添加店铺 | | **测试类型** | 界面测试 | | **测试工具** | Playwright | | **测试目的** | 验证前端校验 | | **前置条件** | 打开新增 | | **测试步骤** | 不填商家电话直接提交 | | **预期结果** | 表单项错误提示;不提交成功 | ### SHP-UI-008 选经营未完善商户不可选或提交失败 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | 添加店铺 | | **测试类型** | 界面测试 | | **测试工具** | Playwright | | **测试目的** | 验证 S1 UI | | **前置条件** | 存在待完善商户 | | **测试步骤** | 打开商户下拉/搜索 | | **预期结果** | 不出现该商户;或选后提交提示完善经营信息 | ### SHP-UI-009 编辑页商户与经营账号只读 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | 编辑店铺 | | **测试类型** | 界面测试 | | **测试工具** | Playwright | | **测试目的** | 验证 §8.2 | | **前置条件** | 有店铺 | | **测试步骤** | 点编辑 | | **预期结果** | 所属商户、经营账号不可改 | ### SHP-UI-010 编辑开业→停业二次确认 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | 编辑店铺 | | **测试类型** | 界面测试 | | **测试工具** | Playwright | | **测试目的** | 验证 S12 UI | | **前置条件** | 开业店 | | **测试步骤** | 状态改停业 → 保存 | | **预期结果** | 弹窗含「用户端将无法下单」;确认后列表为停业 | ### SHP-UI-011 停业店仍可编辑/账号管理 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | 列表操作 | | **测试类型** | 界面测试 | | **测试工具** | Playwright | | **测试目的** | 验证 §7.2 | | **前置条件** | 停业店 | | **测试步骤** | 检查操作列按钮 | | **预期结果** | 编辑、店铺账号管理可用;**无** 逐店「店铺设置」 | ### SHP-UI-012 店铺账号管理-展示下属店铺 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | 店铺账号管理 | | **测试类型** | 界面测试 | | **测试工具** | Playwright | | **测试目的** | 验证 §9.2 | | **前置条件** | 同商户 2 店 | | **测试步骤** | 任一家店点「店铺账号管理」 | | **预期结果** | 展示管理员、脱敏登录名、下属 2 店名称与状态 | ### SHP-UI-013 改登录名二次确认同步文案 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | 店铺账号管理 | | **测试类型** | 界面测试 | | **测试工具** | Playwright | | **测试目的** | 验证 §9.4 | | **前置条件** | 有 account 权限 | | **测试步骤** | 改登录名 → 保存 | | **预期结果** | 确认框含「同步至该商户下全部店铺」;成功后两店列表账号一致 | ### SHP-UI-014 ~ SHP-UI-015 店铺设置(已迁出) > 见 **《店铺设置测试用例.md》** SSS-UI-*(独立菜单「店铺设置」)。 ### SHP-UI-016 删除店铺二次确认 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | 删除店铺 | | **测试类型** | 界面测试 | | **测试工具** | Playwright | | **测试目的** | 验证 §11.3 | | **前置条件** | 满足删店条件 | | **测试步骤** | 删除 → 确认「不可恢复经营」 | | **预期结果** | 列表消失;成功提示 | ### SHP-UI-017 有出售中商品时删除失败提示 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | 删除店铺 | | **测试类型** | 界面测试 | | **测试工具** | Playwright | | **测试目的** | 验证删店商品约束 | | **前置条件** | 店内有出售中商品 | | **测试步骤** | 点删除 | | **预期结果** | 提示「请先下架或处理完商品后再删除店铺」 | ### SHP-UI-018 无 add 权限隐藏新增按钮 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | 权限 | | **测试类型** | 界面测试 | | **测试工具** | Playwright | | **测试目的** | 验证按钮权限 | | **前置条件** | 角色仅 list+query | | **测试步骤** | 进入列表 | | **预期结果** | 无「新增」按钮 | ### SHP-UI-019 列表无会员相关字段 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | 列表展示 | | **测试类型** | 界面测试 | | **测试工具** | Playwright | | **测试目的** | 验证 S6 | | **前置条件** | 打开列表 | | **测试步骤** | 检查表头 | | **预期结果** | 无会员名称/会员绑定列;为经营账号展示 | ### SHP-UI-020 从商户详情跳转带 merchantName 筛选 | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | 协作跳转 | | **测试类型** | 界面测试 | | **测试工具** | Playwright | | **测试目的** | 验证 §13.3 | | **前置条件** | 商户详情有「查看店铺」;该商户有多店 | | **测试步骤** | 商户详情点击跳转 | | **预期结果** | 打开店铺列表且检索框带商户名;仅显示该商户店铺 | ### SHP-UI-021 生成随机密码(若 UI 提供) | 要素 | 内容 | |------|------| | **测试模块** | 店铺管理 | | **测试项** | 添加店铺 | | **测试类型** | 界面测试 | | **测试工具** | Playwright | | **测试目的** | 验证 §6.3 随机密码 | | **前置条件** | 首家店新增页有「生成随机密码」 | | **测试步骤** | 点击生成 | | **预期结果** | 密码框填入符合长度要求的随机串 | ### SHP-UI-022 子管理员上限输入非法值(已迁出) > 见 **《店铺设置测试用例.md》** SSS-API-004 / SSS-UI-*。 ### SHP-UT-027 商家端改店名更新 biz_shop | 要素 | 内容 | |------|------| | **用例编号** | SHP-UT-027 | | **测试项** | `updateSellerShopProfile` | | **测试目的** | 验证草稿第 7 条、§8.4 同源 | | **步骤** | `updateSellerShopProfile(shopId, dto)` | | **预期结果** | `shopMapper.update` 写入新名称/头像/电话;平台 list SQL 读同一行 | ### SHP-API-033 GET /agri/seller/shop | 要素 | 内容 | |------|------| | **用例编号** | SHP-API-033 | | **测试项** | 商家端资料查询 | | **前置条件** | `X-Shop-Id`;`agri:seller:shop:query` | | **预期结果** | 200;返回当前店名称/头像/电话 | ### SHP-API-034 PUT /agri/seller/shop 成功后平台 list 一致 | 要素 | 内容 | |------|------| | **用例编号** | SHP-API-034 | | **测试项** | 商家端改资料 | | **步骤** | PUT 改 `shopName` → `GET /agri/shop/list` | | **预期结果** | 列表展示新名称 | --- ## 四、用例统计 | 类型 | 数量 | 编号段 | |------|------|--------| | 单元测试 | 27 | SHP-UT-001~027 | | 接口测试 | 32 | SHP-API-001~032 | | 界面测试 | 22 | SHP-UI-001~022 | | **合计** | **81** | — | --- ## 五、业务规则覆盖索引 | 规则 | 对应用例(示例) | |------|------------------| | S1 | SHP-UT-007, SHP-API-010, SHP-UI-008, SHP-API-032 | | S2 | SHP-UT-008, SHP-API-012 | | S3 | SHP-UT-001, SHP-API-005 | | S4/S5 | SHP-UT-003/004/019/020, SHP-API-006/009, SHP-UI-006/013 | | S6 | SHP-UI-019 | | S7 | SHP-UT-009, SHP-API-015, SHP-UI-009 | | S8 | SHP-UT-006, SHP-API-008 | | S9 | SHP-UT-011(无商品级联) | | S10 | SHP-UT-015~018, SHP-API-025~028, SHP-UI-016/017 | | S11 | SHP-UT-022/024, SHP-API-022/023, SHP-UI-014/015 | | S12 | SHP-UT-010/011, SHP-API-016, SHP-UI-010 | | S13 | SHP-UT-013/014(Facade 契约) | --- ## 六、测试数据建议 | 数据 | 用途 | |------|------| | 经营完整 + 认证正常商户 | 开店、selectList | | 经营未完善 / 冻结商户 | 开店阻断 | | 首家店 + 同商户第二店 | 账号一致、password null | | 多店商户(≥5) | S2 无上限 | | 开业/停业店各一 | 状态编辑、Facade | | 含出售中/待审核商品的店 | 删店阻断 | | 仅已下架商品的店 | 删店正向 | | 未占用店名、登录手机号 | 唯一性正向 | --- *文档版本:v1.0 · 关联《店铺管理功能需求.md》v1.3.2、《店铺管理技术方案.md》v1.2.1(`biz_merchant_account`)*