SOP-003:CRM 产品创建 E2E 测试
支持复制到 Excel 的标准 SOP 模板;每个
任务(Task ID)表示一个可打卡的子文档,便于人工/机器按照序号完成并记录进度。
文档元数据
- 文档类型:SOP / Checklist
- 适用场景:
http://localhost:3000/crm产品/服务管理界面 + 后端 API 验证 - 创建者:QA / 自动化工程
- 最近更新时间:{{YYYY-MM-DD}} (请生成时替换)
- 相关接口定义:
core/openapi/crm.swagger.json中ProductService模块(特别是POST /api/v1/products、GET /api/v1/products)
前置条件
| 条件 | 检查方式 |
|---|---|
本地或测试环境可访问 http://localhost:3000/crm |
浏览器打开,页面未返回 500/404 |
| 已使用有产品权限的用户登录 | 登录接口/前端登录流程成功,能加载左侧导航 |
| 测试数据准备就绪 | 记录将使用的产品名称/编号,不重复已有记录 |
| API Key 或 Session 可用于后端验证(可选) | ProductService 的 ApiKeyAuth 或登录 Token 可用于 GET/POST /api/v1/products |
任务矩阵(Excel Checklist 行模板)
每个任务独立一个表格,依次执行并记录状态;状态列可直接粘贴到 Excel 以打勾 [ ] → [x]。
任务 T1:环境与账号验证
入口:http://localhost:3000/crm
| Action Steps | Input / Payload | 预期结果 | 验证方式 | 证据 | 状态 | 下游任务 |
|---|---|---|---|---|---|---|
| 步骤1:打开浏览器 | — | 浏览器启动成功 | 浏览器窗口打开 | 屏幕截图 | [ ] |
步骤 2 |
| 步骤2:输入 URL | http://localhost:3000/crm |
页面开始加载 | 地址栏显示正确 URL | 屏幕截图 | [ ] |
步骤 3 |
| 步骤3:登录 | 账号/密码 | 登录成功,跳转到主页 | 左侧导航栏显示 | 屏幕截图、浏览器日志 | [ ] |
步骤 4 |
| 步骤4:导航到「产品/服务」 | 点击左侧「产品/服务」菜单 | 页面成功加载、显示产品列表表格、无 500 错误 | UI:存在标题、表格;Console:无错误 | 屏幕截图、浏览器日志 | [ ] |
T2 |
任务 T2:新建产品 UI 操作
前置条件:T1 成功且当前在产品列表
| Action Steps | Input / Payload | 预期结果 | 验证方式 | 证据 | 状态 | 下游任务 |
|---|---|---|---|---|---|---|
| 步骤1:点击右上「创建」按钮 | — | 弹出产品创建对话框 | 对话框显示,标题为「创建产品」 | 屏幕截图 | [ ] |
步骤 2 |
| 步骤2:保持「产品」标签选中 | — | 标签页停留在「产品」 | 标签页高亮显示 | 屏幕截图 | [ ] |
步骤 3 |
| 步骤3:填写必填字段 | 名称:QA-E2E-{{timestamp}} 价格:¥1.00 |
字段成功填写,无验证错误 | 输入框显示正确内容 | 屏幕截图 | [ ] |
步骤 4 |
| 步骤4:填写描述/上传图片(可选) | 描述:测试产品 图片:可选 | 可选字段成功填写 | 内容显示正确 | 屏幕截图 | [ ] |
步骤 5 |
| 步骤5:点击创建按钮 | — | 对话框关闭,新条目出现在列表,显示成功提示 | UI:新行出现;toast:创建成功 | 截图 + 系统提示 | [ ] |
T3 |
任务 T3:后端确认
前置条件:T2 成功
| Action Steps | Input / Payload | 预期结果 | 验证方式 | 证据 | 状态 | 下游任务 |
|---|---|---|---|---|---|---|
| 步骤1:记录产品名称/编号 | 从 UI 复制产品名称和 ID | 名称和 ID 已记录 | 笔记/剪贴板 | 文本记录 | [ ] |
步骤 2 |
| 步骤2:调用 GET /api/v1/products | filters=name:eq:QA-E2E-{{timestamp}} 携带有效 Token/API Key |
响应状态码 200,返回产品列表 | HTTP 状态码 | API Response | [ ] |
步骤 3 |
| 步骤3:校验返回数据 | 检查返回的第一项产品数据 | 产品名称、价格与创建时一致 | JSON 字段:name、price |
Response Body + curl command | [ ] |
T4 |
任务 T4:数据一致性 & 清理
前置条件:T3 返回预期
| Action Steps | Input / Payload | 预期结果 | 验证方式 | 证据 | 状态 | 下游任务 |
|---|---|---|---|---|---|---|
| 步骤1:比对 UI 与 API 数据 | UI 显示的价格/描述,API 返回的价格/描述 | 两者完全一致 | 人工/脚本比对 | 比对结果截图/日志 | [ ] |
步骤 2 |
| 步骤2:记录产品 ID | 从 API 响应中提取 productId |
ID 已记录 | 笔记/日志 | 产品 ID 记录 | [ ] |
步骤 3 |
| 步骤3:清理测试数据(可选) | 调用 DELETE /api/v1/products/{id} 或标记为待清理 |
删除成功(状态码 200)或标记完成 | API 响应或数据库标记 | 删除请求响应 + 记录日志 | [ ] |
— |
说明:每个
任务可视作独立文档,便于 API 或进度采集工具抓取Task ID+Status+Evidence等字段。
API 参考(必须遵循的接口)
| 接口 | 方法 | 说明 | 关键字段 & 数据格式 |
|---|---|---|---|
/api/v1/products |
POST |
创建产品 | body 需要 coreProduct 定义,最少提供 name(string)、price(string/decimal),可选 description、categories、imageUrl。也可以指定 parent 参数控制归属、productId 自定义 ID。 |
/api/v1/products |
GET |
列表/确认产品 | 可通过 filters=name:eq:<value>、pageSize=1 精确定位刚创建的记录;coreListProductsResponse 里的 products 数组含 coreProduct 结构,可比对 id、price。 |
/api/v1/products/assign |
POST(若需权限分配) |
赋予产品团队/代理人 | 请求体参考 coreAssignProductRequest,用于附加权限或工作流测试。 |
参见完整定义:
core/openapi/crm.swagger.json中definitions下coreProduct,coreListProductsResponse,以及securityDefinitions中ApiKeyAuth。
进度采集模板(机器辅助/人手填报)
| Task ID | Status | Evidence | Operator | Timestamp | Notes |
|---|---|---|---|---|---|
| T1 | [ ] / [x] |
screen-T1.png |
qa-bot |
2025-12-21T09:00:00 |
"登录成功" |
| T2 | [ ] / [x] |
screen-T2.png |
qa-zhang |
2025-12-21T09:03:00 |
"名称已填写" |
Tip:监控系统可定时读取
Task ID+Status列;每次status变更都写入对应Evidence和Timestamp以供追踪。
异常与恢复
- 页面未加载:确认后端服务运行
gateway+admin;查看浏览器Console、Network500/401;记录Request ID并换账号重试。 - 创建失败:记录 toast 错误、截图,使用
GET /api/v1/products检查是否已部分创建,再决定是否重试或清除。 - API 返回
default错误:拦截googlerpcStatus中code与message,附加curl命令传给开发。
附录:Checklist 导出格式
Task ID,Task Name,Status,Evidence,Operator,Notes
T1,环境与账号验证,[ ],screen-T1.png,qa-bot,"login ok"
T2,新建产品 UI 操作,[ ],screen-T2.png,qa-bot,"create dialog ok"
直接复制上述 CSV/Excel 内容可实现标准化追踪。