巴青农资商城

属性模版测试用例.md 35KB

属性模版 — 测试用例

依据: 《属性模版功能需求.md》v1.0、《属性模版技术方案.md》v1.0
关联: 《店铺商品列表测试用例.md》(商品选用模版协作)、《店铺商品分类测试用例.md》(店铺上下文/批量删模式)
范围: 商家端 /agri/seller/attrTemplateAttrTemplateServiceImpl / SellerAttrTemplateControllerIAttrTemplateFacadeIGoodsFacade.existsByAttrTemplateId
排除: 平台端模版 CRUD、C 端展示 E2E、模版导入导出、商品发品完整表单 E2E(v1.x 另册)
环境: RuoYi v3.9.2-springboot2;MySQL 5.7.39;请求头 X-Shop-Id 标识当前店铺


用例编号说明

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

测试数据约定

实体 说明
商户 A 店铺 101(张三农资店)、102(李四农资店);经营账号 13800001001
店铺 101 模版 1=宠物(属性:类型/品种;无规格);2=手机(属性:屏幕/生产日期/品牌;规格:颜色/内存);3=待删(属性:备注;无商品引用);4=引用中(属性:产地;有商品引用
店铺 102 模版 501=他店模版(属性:规格A)
商品协作 goodsId=9001shop_id=101attr_template_id=4goods_status=2(出售中),del_flag=0
Token 经营账号;X-Shop-Id=101;含 agri:seller:attrTemplate:*
员工 Token 子管理员;默认 属性模版菜单权限
已删店 店铺 103biz_shop.del_flag=2

名称列表期望(模版 2): 屏幕,生产日期,品牌,颜色,内存(先属性项、后规格项,逗号分隔)。


一、单元测试

SAT-UT-001 列表范围为当前店铺有效模版

要素 内容
用例编号 SAT-UT-001
测试模块 属性模版
测试项 selectList 数据范围
测试类型 单元测试
测试工具 JUnit 5 + Mockito
测试目的 验证 AT1:仅当前店铺未删除模版
前置条件 店铺 101 有模版 1~4;店铺 102 有 501;模版 1 del_flag=0
测试步骤 SellerShopContext 设 shopId=101,调用 selectTemplateList
预期结果 返回 4 条;不含 501 及 del_flag=2 记录

SAT-UT-002 列表按 create_time 降序

要素 内容
用例编号 SAT-UT-002
测试模块 属性模版
测试项 列表排序
测试类型 单元测试
测试工具 JUnit 5
测试目的 验证 §5.1 默认排序
前置条件 模版 1 创建时间早于模版 2
测试步骤 调用 selectList 无 keyword
预期结果 首行 templateId=2(较新者靠前)

SAT-UT-003 buildNameList 先属性后规格

要素 内容
用例编号 SAT-UT-003
测试模块 属性模版
测试项 buildNameList
测试类型 单元测试
测试工具 JUnit 5
测试目的 验证 AT6
前置条件 模版 2 含属性项 屏幕/生产日期/品牌,规格项 颜色/内存
测试步骤 调用 buildNameList(2)
预期结果 返回 屏幕,生产日期,品牌,颜色,内存

SAT-UT-004 keyword 模版名称模糊匹配

要素 内容
用例编号 SAT-UT-004
测试模块 属性模版
测试项 keyword 检索
测试类型 单元测试
测试工具 JUnit 5
测试目的 验证 §5.4
前置条件 存在「宠物」「手机」
测试步骤 keyword=「手」;再 keyword=「1」(按 ID)
预期结果 前者仅命中「手机」;后者 按 templateId 命中

SAT-UT-005 requireShopId 未选店铺失败

要素 内容
用例编号 SAT-UT-005
测试模块 属性模版
测试项 requireShopId
测试类型 单元测试
测试工具 JUnit 5
测试目的 验证 AT11、§6
前置条件 SellerShopContext.getShopId() 为 null
测试步骤 调用 list / insertTemplate
预期结果 ServiceException;msg 含「请先选择当前店铺」

SAT-UT-006 店铺已逻辑删除 assertShopMaintable 失败

要素 内容
用例编号 SAT-UT-006
测试模块 属性模版
测试项 assertShopMaintable
测试类型 单元测试
测试工具 JUnit 5 + Mockito
测试目的 验证删店后不可维护
前置条件 shopId=103,biz_shop.del_flag=2
测试步骤 调用 insertTemplate / selectList
预期结果 失败;msg 含「店铺已关闭,无法维护属性模版」

SAT-UT-007 新增模版名称本店唯一-成功

要素 内容
用例编号 SAT-UT-007
测试模块 属性模版
测试项 assertTemplateNameUnique
测试类型 单元测试
测试工具 JUnit 5
测试目的 验证 AT3 正常路径
前置条件 店铺 101 无「家电」
测试步骤 validateSaveDto templateName=家电
预期结果 校验通过

SAT-UT-008 新增模版名称重复失败

要素 内容
用例编号 SAT-UT-008
测试模块 属性模版
测试项 assertTemplateNameUnique
测试类型 单元测试
测试工具 JUnit 5
测试目的 验证 AT3
前置条件 已有 templateName=宠物
测试步骤 insertTemplate templateName=宠物
预期结果 失败;msg 含「属性模版名称已存在」

SAT-UT-009 编辑名称排除自身可保留

要素 内容
用例编号 SAT-UT-009
测试模块 属性模版
测试项 编辑名称唯一
测试类型 单元测试
测试工具 JUnit 5
测试目的 验证 §8.2 排除自身
前置条件 编辑 templateId=1,名称仍为「宠物」
测试步骤 updateTemplate 不改 templateName
预期结果 校验通过

SAT-UT-010 不同店铺同名允许

要素 内容
用例编号 SAT-UT-010
测试模块 属性模版
测试项 店间隔离
测试类型 单元测试
测试工具 JUnit 5
测试目的 验证 AT11
前置条件 店铺 101 有「宠物」;店铺 102 无「宠物」
测试步骤 shopId=102 创建 templateName=宠物
预期结果 成功;两店各一条「宠物」

SAT-UT-011 无属性项且无规格项失败

要素 内容
用例编号 SAT-UT-011
测试模块 属性模版
测试项 validateSaveDto 至少一项
测试类型 单元测试
测试工具 JUnit 5
测试目的 验证 AT4、AT-A2
前置条件 attributes=[],specs=[]
测试步骤 insertTemplate
预期结果 失败;msg 含「请至少添加一个属性项或规格项」

SAT-UT-012 模版名称为空失败

要素 内容
用例编号 SAT-UT-012
测试模块 属性模版
测试项 templateName 必填
测试类型 单元测试
测试工具 JUnit 5
测试目的 验证 AT3
前置条件 templateName="" 或 null
测试步骤 insertTemplate
预期结果 失败;msg 含「请输入属性模版名称」

SAT-UT-013 属性项段内名称重复失败

要素 内容
用例编号 SAT-UT-013
测试模块 属性模版
测试项 属性项重名
测试类型 单元测试
测试工具 JUnit 5
测试目的 验证 AT5
前置条件 attributes 含两项 itemName=品牌
测试步骤 validateSaveDto
预期结果 失败;msg 含「属性项/规格项名称不可重复」

SAT-UT-014 属性项与规格项跨段重名失败

要素 内容
用例编号 SAT-UT-014
测试模块 属性模版
测试项 跨段 itemName 唯一
测试类型 单元测试
测试工具 JUnit 5
测试目的 验证 §7.2.3、AT5
前置条件 attributes 含「颜色」;specs 含「颜色」
测试步骤 validateSaveDto
预期结果 失败;msg 含「属性项与规格项名称不可相同」

SAT-UT-015 属性项无值失败

要素 内容
用例编号 SAT-UT-015
测试模块 属性模版
测试项 每项至少一值
测试类型 单元测试
测试工具 JUnit 5
测试目的 验证 AT5、AT-A4
前置条件 attributes=[{itemName:品牌, values:[]}]
测试步骤 insertTemplate
预期结果 失败;msg 含「请为每项至少添加一个属性值/规格值」

SAT-UT-016 同项下属性值重复失败

要素 内容
用例编号 SAT-UT-016
测试模块 属性模版
测试项 值唯一
测试类型 单元测试
测试工具 JUnit 5
测试目的 验证 AT5
前置条件 品牌 values=[小米, 小米]
测试步骤 validateSaveDto
预期结果 失败;msg 含「同一项下属性值/规格值不可重复」

SAT-UT-017 仅属性段保存成功

要素 内容
用例编号 SAT-UT-017
测试模块 属性模版
测试项 insertTemplate 仅属性
测试类型 单元测试
测试工具 JUnit 5 + Mockito
测试目的 验证 AT4 属性段可独立成模
前置条件 specs=[];attributes=[{itemName:类型, values:[犬类]}]
测试步骤 insertTemplate
预期结果 成功;item_type=1 有记录;item_type=2 无记录

SAT-UT-018 仅规格段保存成功

要素 内容
用例编号 SAT-UT-018
测试模块 属性模版
测试项 insertTemplate 仅规格
测试类型 单元测试
测试工具 JUnit 5
测试目的 验证 AT4 规格段可独立成模
前置条件 attributes=[];specs=[{itemName:颜色, values:[红]}]
测试步骤 insertTemplate
预期结果 成功;item_type=2 有记录

SAT-UT-019 编辑全量替换项与值

要素 内容
用例编号 SAT-UT-019
测试模块 属性模版
测试项 updateTemplate replace
测试类型 单元测试
测试工具 JUnit 5 + DB 断言
测试目的 验证技术方案 §3.4 PUT 策略
前置条件 模版 1 原属性项=类型/品种
测试步骤 PUT 改为 attributes=[{itemName:体重, values:[小型]}]
预期结果 旧 item/value 物理删除;仅保留新结构;nameList=体重

SAT-UT-020 编辑模版不更新商品 attr 快照

要素 内容
用例编号 SAT-UT-020
测试模块 属性模版
测试项 AT8 不追溯
测试类型 单元测试
测试工具 JUnit 5 + Mockito
测试目的 验证 AT8、§10.2
前置条件 goodsId=9001 引用 templateId=4;biz_goods_attr 有历史行
测试步骤 updateTemplate(4) 修改属性项;verify 无 goodsMapper 更新
预期结果 模版更新成功;未调用 更新 biz_goods / biz_goods_attr

SAT-UT-021 编辑模版不改动商品状态

要素 内容
用例编号 SAT-UT-021
测试模块 属性模版
测试项 AT10
测试类型 单元测试
测试工具 JUnit 5 + DB 断言
测试目的 验证 AT10
前置条件 goods 9001 goods_status=2,attr_template_id=4
测试步骤 updateTemplate(4)
预期结果 模版成功;goods 9001 goods_status 仍为 2

SAT-UT-022 删除无引用模版成功

要素 内容
用例编号 SAT-UT-022
测试模块 属性模版
测试项 logicDelete
测试类型 单元测试
测试工具 JUnit 5
测试目的 验证 §9、AT12
前置条件 templateId=3;existsByAttrTemplateId=false
测试步骤 deleteTemplate(3)
预期结果 del_flag=2;selectList 不含 3

SAT-UT-023 删除有商品引用失败

要素 内容
用例编号 SAT-UT-023
测试模块 属性模版
测试项 existsByAttrTemplateId
测试类型 单元测试
测试工具 JUnit 5 + Mockito
测试目的 验证 AT7
前置条件 templateId=4;goodsFacade.existsByAttrTemplateId=true
测试步骤 deleteTemplate(4)
预期结果 失败;msg 含「该属性模版已被商品使用,无法删除」

SAT-UT-024 批量删除整批成功

要素 内容
用例编号 SAT-UT-024
测试模块 属性模版
测试项 批量删
测试类型 单元测试
测试工具 JUnit 5
测试目的 验证 §9.1 正常批量
前置条件 templateIds=[1,3] 均无商品引用(测试前解绑 goods 或 mock false)
测试步骤 deleteTemplateBatch([1,3])
预期结果 全部 del_flag=2

SAT-UT-025 批量删除含引用项整批失败

要素 内容
用例编号 SAT-UT-025
测试模块 属性模版
测试项 AttrTemplateBatchDeleteException
测试类型 单元测试
测试工具 JUnit 5
测试目的 验证 AT7 整批失败
前置条件 ids=[3,4];4 有商品引用
测试步骤 deleteTemplateBatch
预期结果 抛批量异常;3、4 均未删除;reasons 含模版 4

SAT-UT-026 跨店 templateId 操作失败

要素 内容
用例编号 SAT-UT-026
测试模块 属性模版
测试项 shop_id 校验
测试类型 单元测试
测试工具 JUnit 5
测试目的 验证 AT11
前置条件 shopId=101;templateId=501 属店铺 102
测试步骤 getDetail(501) / updateTemplate(501) / deleteTemplate(501)
预期结果 失败;msg 含「属性模版不存在」或等价无权限

SAT-UT-027 listOptionsByShopId 仅本店有效模版

要素 内容
用例编号 SAT-UT-027
测试模块 属性模版
测试项 IAttrTemplateFacade
测试类型 单元测试
测试工具 JUnit 5
测试目的 验证 AT9 下拉数据源
前置条件 店铺 101 有模版 1、2;店铺 102 有 501
测试步骤 listOptionsByShopId(101)
预期结果 返回 templateId 1、2;含 templateName、nameList;不含 501

SAT-UT-028 getDetailForGoods 结构完整

要素 内容
用例编号 SAT-UT-028
测试模块 属性模版
测试项 getDetailForGoods
测试类型 单元测试
测试工具 JUnit 5
测试目的 验证商品预填结构
前置条件 templateId=2 属 shop 101
测试步骤 getDetailForGoods(2, 101)
预期结果 attributes 3 项、specs 2 项;每项 values 非空数组

二、接口测试

SAT-API-001 GET /list 分页与字段

要素 内容
用例编号 SAT-API-001
测试模块 属性模版
测试项 GET /list
测试类型 接口测试
测试工具 MockMvc
测试目的 验证 §3.2、AT1
前置条件 Token + X-Shop-Id=101agri:seller:attrTemplate:list
测试步骤 GET /agri/seller/attrTemplate/list?pageNum=1&pageSize=15
预期结果 code=200;rows 含 templateName、nameList;total≥4

SAT-API-002 GET /list keyword 检索

要素 内容
用例编号 SAT-API-002
测试模块 属性模版
测试项 GET /list keyword
测试类型 接口测试
测试工具 Apifox
测试目的 验证 §5.4
前置条件 同上
测试步骤 GET .../list?keyword=手机
预期结果 仅返回 templateName 含「手机」的记录

SAT-API-003 GET /list 缺 X-Shop-Id 失败

要素 内容
用例编号 SAT-API-003
测试模块 属性模版
测试项 店铺上下文
测试类型 接口测试
测试工具 MockMvc
测试目的 验证 §6
前置条件 请求 不带 X-Shop-Id
测试步骤 GET /list
预期结果 失败;msg 含「请先选择当前店铺」

SAT-API-004 GET /{templateId} 详情回显

要素 内容
用例编号 SAT-API-004
测试模块 属性模版
测试项 GET /{id}
测试类型 接口测试
测试工具 MockMvc
测试目的 验证 §3.3
前置条件 agri:seller:attrTemplate:query
测试步骤 GET /agri/seller/attrTemplate/2
预期结果 code=200;data.attributes、data.specs 与测试数据一致

SAT-API-005 POST / 新增完整模版成功

要素 内容
用例编号 SAT-API-005
测试模块 属性模版
测试项 POST /
测试类型 接口测试
测试工具 Apifox
测试目的 验证 §7 主流程
前置条件 agri:seller:attrTemplate:add
测试步骤 POST body:{"templateName":"家电","attributes":[{"itemName":"功率","values":["1000W"]}],"specs":[{"itemName":"尺寸","values":["大号","小号"]}]}
预期结果 code=200;GET /list 可见「家电」;nameList=功率,尺寸

SAT-API-006 POST / 模版名称重复失败

要素 内容
用例编号 SAT-API-006
测试模块 属性模版
测试项 POST / 名称
测试类型 接口测试
测试工具 Apifox
测试目的 验证 AT3
前置条件 已有「宠物」
测试步骤 POST templateName=宠物 + 合法 attributes
预期结果 失败;msg 含「属性模版名称已存在」

SAT-API-007 POST / 无属性无规格失败

要素 内容
用例编号 SAT-API-007
测试模块 属性模版
测试项 POST / 结构
测试类型 接口测试
测试工具 MockMvc
测试目的 验证 AT4
前置条件 attributes=[],specs=[]
测试步骤 POST 创建
预期结果 失败;msg 含「请至少添加一个属性项或规格项」

SAT-API-008 POST / 属性规格跨段重名失败

要素 内容
用例编号 SAT-API-008
测试模块 属性模版
测试项 POST / 跨段重名
测试类型 接口测试
测试工具 Apifox
测试目的 验证 §12
前置条件 attributes 与 specs 均含 itemName=内存
测试步骤 POST 创建
预期结果 失败;msg 含「属性项与规格项名称不可相同」

SAT-API-009 PUT / 编辑成功且全量替换

要素 内容
用例编号 SAT-API-009
测试模块 属性模版
测试项 PUT /
测试类型 接口测试
测试工具 MockMvc
测试目的 验证 §8
前置条件 agri:seller:attrTemplate:edit
测试步骤 PUT templateId=1,改 templateName=宠物用品,attributes 改为单一项「适用对象」
预期结果 code=200;GET /1 同步;旧项「类型/品种」不存在

SAT-API-010 PUT / 编辑有引用模版允许且商品不变

要素 内容
用例编号 SAT-API-010
测试模块 属性模版
测试项 PUT / AT8
测试类型 接口测试
测试工具 Apifox + DB
测试目的 验证 AT8、§8.2
前置条件 templateId=4 被 goods 9001 引用
测试步骤 PUT 修改 attributes;查 goods 9001 与 biz_goods_attr
预期结果 模版更新成功;goods 9001 属性快照 不变;goods_status 不变

SAT-API-011 DELETE /{id} 无引用成功

要素 内容
用例编号 SAT-API-011
测试模块 属性模版
测试项 DELETE /{id}
测试类型 接口测试
测试工具 MockMvc
测试目的 验证 §9 正常删除
前置条件 agri:seller:attrTemplate:remove;templateId=3 无引用
测试步骤 DELETE /agri/seller/attrTemplate/3
预期结果 code=200;/list、/options 不含 3

SAT-API-012 DELETE /{id} 有商品引用失败

要素 内容
用例编号 SAT-API-012
测试模块 属性模版
测试项 DELETE 商品阻断
测试类型 接口测试
测试工具 Apifox
测试目的 验证 AT7
前置条件 templateId=4 关联 goods 9001
测试步骤 DELETE /4
预期结果 失败;msg 含「已被商品使用」;模版仍存在

SAT-API-013 DELETE 批量含引用整批失败

要素 内容
用例编号 SAT-API-013
测试模块 属性模版
测试项 DELETE 批量
测试类型 接口测试
测试工具 MockMvc
测试目的 验证 §9.1 整批失败
前置条件 ids=3,4;4 有引用
测试步骤 DELETE /agri/seller/attrTemplate/3,4
预期结果 失败;msg 含「整批操作已取消」;3、4 均未删

SAT-API-014 GET /options 发品下拉

要素 内容
用例编号 SAT-API-014
测试模块 属性模版
测试项 GET /options
测试类型 接口测试
测试工具 Apifox
测试目的 验证 §3.6、AT9
前置条件 shop 101 有效模版 1、2、4
测试步骤 GET /agri/seller/attrTemplate/options
预期结果 code=200;data 数组含 templateId、templateName、nameList;不分页

SAT-API-015 跨店访问他店模版 ID 失败

要素 内容
用例编号 SAT-API-015
测试模块 属性模版
测试项 跨店越权
测试类型 接口测试
测试工具 MockMvc
测试目的 验证 AT11
前置条件 X-Shop-Id=101
测试步骤 GET /501;PUT /501;DELETE /501
预期结果 均失败;不泄露 102 店数据

SAT-API-016 切换店铺后列表数据隔离

要素 内容
用例编号 SAT-API-016
测试模块 属性模版
测试项 多店切换
测试类型 接口测试
测试工具 Apifox
测试目的 验证 §6、AT11
前置条件 同一 Token
测试步骤 GET /list,X-Shop-Id=101;再 X-Shop-Id=102
预期结果 101 含「宠物」;102 含「他店模版」;互不含对方数据

SAT-API-017 已删店 103 维护失败

要素 内容
用例编号 SAT-API-017
测试模块 属性模版
测试项 删店阻断
测试类型 接口测试
测试工具 Apifox
测试目的 验证 §2.2
前置条件 X-Shop-Id=103
测试步骤 GET /list;POST /
预期结果 失败;msg 含「店铺已关闭,无法维护属性模版」

SAT-API-018 无 list 权限 403

要素 内容
用例编号 SAT-API-018
测试模块 属性模版
测试项 @PreAuthorize
测试类型 接口测试
测试工具 MockMvc
测试目的 验证 §2.7 权限
前置条件 员工 Token;角色 分配 attrTemplate 菜单
测试步骤 GET /list
预期结果 HTTP 403

SAT-API-019 GET /goods/attrTemplateOptions 协作(已实现)

要素 内容
用例编号 SAT-API-019
测试模块 属性模版
测试项 商品侧下拉 + 预填
测试类型 接口测试
测试工具 Apifox / MockMvc
测试目的 验证 AT9:商品发品下拉与预填 API
前置条件 shop 101 有模版;X-Shop-Id=101
测试步骤 GET /agri/seller/goods/attrTemplateOptions;GET /agri/seller/goods/attrTemplate/4
预期结果 options 与 /attrTemplate/options 一致;预填含 attributes/specs

三、界面测试(Playwright)

通用前置: Playwright 启动 Chromium(Chrome 通道);商家端 URL 以环境为准(如 http://localhost:80);经营账号 13800001001 / 密码见测试环境;登录后页头展示当前店铺;菜单 商品管理 → 属性模版(路由 /agri/seller/attrTemplate)。

SAT-UI-001 进入列表展示模版与名称列表

要素 内容
用例编号 SAT-UI-001
测试模块 属性模版
测试项 列表页
测试类型 界面测试
测试工具 Playwright (Chrome)
测试目的 验证 AT1、§5.2
前置条件 已登录;当前店铺=张三农资店;101 有模版 1~4
测试步骤 1. page.goto 登录页并登录 2. 进入「属性模版」菜单
预期结果 页头展示「张三农资店」;表格含 属性模版名称、名称列表、操作(编辑/删除);「手机」行 nameList 含 屏幕,品牌,颜色,内存

SAT-UI-002 按模版名称检索与重置

要素 内容
用例编号 SAT-UI-002
测试模块 属性模版
测试项 名称检索
测试类型 界面测试
测试工具 Playwright
测试目的 验证 §5.4
前置条件 存在「宠物」「手机」
测试步骤 检索框输入「宠」→ 搜索 → 重置
预期结果 搜索后仅「宠物」;重置后恢复全量

SAT-UI-003 添加属性模版完整流程

要素 内容
用例编号 SAT-UI-003
测试模块 属性模版
测试项 添加模版
测试类型 界面测试
测试工具 Playwright
测试目的 验证 §7 主流程
前置条件 有 add 权限
测试步骤 1. 点「添加属性模版」2. 名称=「家电」3. 添加属性项「功率」值「1000W」4. 添加规格项「尺寸」值「大」「小」5. 确认
预期结果 成功提示;列表出现「家电」;nameList=功率,尺寸

SAT-UI-004 动态添加属性项与属性值

要素 内容
用例编号 SAT-UI-004
测试模块 属性模版
测试项 +添加属性项 / +增加属性值
测试类型 界面测试
测试工具 Playwright
测试目的 验证 §7.3
前置条件 打开添加弹窗
测试步骤 点「+添加属性项」新增第二项;点「+增加属性值」为第一项追加值
预期结果 表单出现新行;可多值标签/输入框;可删除已加项/值

SAT-UI-005 动态添加规格项与规格值

要素 内容
用例编号 SAT-UI-005
测试模块 属性模版
测试项 +添加规格项 / +增加规格值
测试类型 界面测试
测试工具 Playwright
测试目的 验证 §7.3 规格段
前置条件 打开添加/编辑弹窗
测试步骤 在「规格」区点「+添加规格项」;为规格项点「+增加规格值」
预期结果 规格区独立展示;交互与属性段一致

SAT-UI-006 模版名称为空拦截

要素 内容
用例编号 SAT-UI-006
测试模块 属性模版
测试项 名称必填
测试类型 界面测试
测试工具 Playwright
测试目的 验证 §12
前置条件 打开添加弹窗
测试步骤 名称留空;填合法属性项 → 确认
预期结果 前端校验或提示「请输入属性模版名称」

SAT-UI-007 无属性无规格拦截

要素 内容
用例编号 SAT-UI-007
测试模块 属性模版
测试项 至少一项
测试类型 界面测试
测试工具 Playwright
测试目的 验证 AT4
前置条件 打开添加弹窗
测试步骤 仅填名称「空结构」;不添加任何属性/规格项 → 确认
预期结果 提示「请至少添加一个属性项或规格项」

SAT-UI-008 模版名称重复提示

要素 内容
用例编号 SAT-UI-008
测试模块 属性模版
测试项 名称唯一
测试类型 界面测试
测试工具 Playwright
测试目的 验证 AT3
前置条件 已有「宠物」
测试步骤 添加模版名称=「宠物」+ 合法属性 → 确认
预期结果 提示「属性模版名称已存在」

SAT-UI-009 编辑模版回显并保存

要素 内容
用例编号 SAT-UI-009
测试模块 属性模版
测试项 编辑
测试类型 界面测试
测试工具 Playwright
测试目的 验证 §8
前置条件 模版「手机」存在
测试步骤 点行「编辑」→ 修改品牌增加「三星」→ 确认
预期结果 弹窗回显原属性/规格结构;保存后 GET 详情含「三星」;列表 nameList 更新

SAT-UI-010 删除无引用模版二次确认

要素 内容
用例编号 SAT-UI-010
测试模块 属性模版
测试项 单独删除
测试类型 界面测试
测试工具 Playwright
测试目的 验证 §9、AT12
前置条件 模版「待删」无商品引用
测试步骤 点「删除」→ 确认框点确定
预期结果 成功提示;列表 不含「待删」

SAT-UI-011 删除有引用模版阻断

要素 内容
用例编号 SAT-UI-011
测试模块 属性模版
测试项 删除阻断
测试类型 界面测试
测试工具 Playwright
测试目的 验证 AT7
前置条件 模版「引用中」被 goods 9001 使用
测试步骤 点「删除」→ 确认
预期结果 提示「已被商品使用,无法删除」;行仍在列表

SAT-UI-012 批量删除勾选与整批失败

要素 内容
用例编号 SAT-UI-012
测试模块 属性模版
测试项 批量删除
测试类型 界面测试
测试工具 Playwright
测试目的 验证 §9.1
前置条件 勾选「待删」与「引用中」
测试步骤 点「批量删除」→ 确认
预期结果 提示整批失败;两条 均仍在 列表

SAT-UI-013 批量删除全部可删成功

要素 内容
用例编号 SAT-UI-013
测试模块 属性模版
测试项 批量删除成功
测试类型 界面测试
测试工具 Playwright
测试目的 验证 §9 正常批量
前置条件 仅勾选无引用模版(测试数据「待删」)
测试步骤 批量删除 → 确认
预期结果 成功;选中行从列表消失

SAT-UI-014 切换店铺后列表刷新

要素 内容
用例编号 SAT-UI-014
测试模块 属性模版
测试项 多店上下文
测试类型 界面测试
测试工具 Playwright
测试目的 验证 §6、AT11
前置条件 商户 A 有店 101、102
测试步骤 当前店 101 见「宠物」→ 页头切换店铺为 102 → 回到属性模版
预期结果 页头店名变为李四农资店;列表 不含「宠物」;含「他店模版」

SAT-UI-015 无权限账号不可见菜单

要素 内容
用例编号 SAT-UI-015
测试模块 属性模版
测试项 菜单权限
测试类型 界面测试
测试工具 Playwright
测试目的 验证 §2.7
前置条件 子管理员 Token;角色无 attrTemplate
测试步骤 登录 → 查看商品管理菜单;直接 goto /agri/seller/attrTemplate
预期结果 菜单 「属性模版」;直链 403 或跳转无权限页

SAT-UI-016 列表分页切换

要素 内容
用例编号 SAT-UI-016
测试模块 属性模版
测试项 分页
测试类型 界面测试
测试工具 Playwright
测试目的 验证 §5.1
前置条件 店铺 101 模版数 > 15(或 mock 分页)
测试步骤 进入列表 → 切换每页 15 条 → 点第 2 页
预期结果 底部分页显示「第 x-y 条/总共 z 条」;翻页数据变化

SAT-UI-017 取消添加不保存

要素 内容
用例编号 SAT-UI-017
测试模块 属性模版
测试项 取消操作
测试类型 界面测试
测试工具 Playwright
测试目的 验证 §7.3 取消
前置条件 打开添加弹窗
测试步骤 填写名称与属性 → 点「取消」
预期结果 弹窗关闭;列表 新增行

四、规则覆盖矩阵

规则 单元 接口 UI
AT1 当前店铺有效模版 UT-001 API-001 UI-001
AT2 仅商家端 API-018 UI-015
AT3 名称本店唯一 UT-007/008 API-006 UI-008
AT4 至少一项 UT-011/17/18 API-007 UI-007
AT5 项/值校验 UT-013~016 API-008 UI-006
AT6 nameList UT-003 API-001 UI-001
AT7 删引用/整批失败 UT-023/025 API-012/013 UI-011/012
AT8 不追溯商品 UT-020 API-010
AT9 下拉协作 UT-027/028 API-014/019
AT10 不改商品状态 UT-021 API-010
AT11 店铺上下文 UT-005/010/026 API-003/015/016 UI-014
AT12 逻辑删除 UT-022 API-011 UI-010

五、修订记录

版本 说明
v1.0 首版:28 单元 + 19 接口 + 17 UI;覆盖 AT1~AT12 及正常/异常/协作流程
v1.1 商品协作:attr_template_id 保存/回显已实现
v1.2 biz_goods_attr 与商品侧预填 API 已实现;SAT-API-019 标已实现

文档版本:v1.2 · 关联《属性模版功能需求.md》v1.1、《属性模版技术方案.md》v1.3