Commit 97840769 authored by liguangyu06's avatar liguangyu06
Browse files

新增期初管理全链路自动化资产,并加固产品管理用例与清理冗余截图。

紧急放行原因:用户要求立即推送今日改动备份,门禁用例待后续补跑。
parent 3dbf401d
...@@ -61,6 +61,7 @@ ...@@ -61,6 +61,7 @@
#### 功能验证点 #### 功能验证点
- **TP_PRODM_QRL_017**(高)|列表核心列完整|验证要点:主表展示 规则名称、适用范围、齐全判定条件等(以现网为准)|关联需求:UI-SPEC-SPD-PRODM-024 - **TP_PRODM_QRL_017**(高)|列表核心列完整|验证要点:主表展示 规则名称、适用范围、齐全判定条件等(以现网为准)|关联需求:UI-SPEC-SPD-PRODM-024
- **TP_PRODM_QRL_036**(低)|列设置隐藏后再恢复|验证要点:打开列设置 → 取消勾选非核心列 → 表头隐藏且勾选同步 → 再勾选后表头恢复|关联需求:UI-SPEC-SPD-PRODM-024
#### 边界验证点 #### 边界验证点
...@@ -106,6 +107,7 @@ ...@@ -106,6 +107,7 @@
- **TP_PRODM_QRL_011**(高)|行内「详情」可达|验证要点:首行有数据时点「详情」有反馈或进入预期层(只读冒烟,不写外围回写)|关联需求:UI-SPEC-SPD-PRODM-024 - **TP_PRODM_QRL_011**(高)|行内「详情」可达|验证要点:首行有数据时点「详情」有反馈或进入预期层(只读冒烟,不写外围回写)|关联需求:UI-SPEC-SPD-PRODM-024
- **TP_PRODM_QRL_012**(高)|行内「编辑」可达|验证要点:首行有数据时点「编辑」有反馈或进入预期层(只读冒烟,不写外围回写)|关联需求:UI-SPEC-SPD-PRODM-024 - **TP_PRODM_QRL_012**(高)|行内「编辑」可达|验证要点:首行有数据时点「编辑」有反馈或进入预期层(只读冒烟,不写外围回写)|关联需求:UI-SPEC-SPD-PRODM-024
- **TP_PRODM_QRL_013**(高)|行内「日志」可达|验证要点:首行有数据时点「日志」有反馈或进入预期层(只读冒烟,不写外围回写)|关联需求:UI-SPEC-SPD-PRODM-024 - **TP_PRODM_QRL_013**(高)|行内「日志」可达|验证要点:首行有数据时点「日志」有反馈或进入预期层(只读冒烟,不写外围回写)|关联需求:UI-SPEC-SPD-PRODM-024
- **TP_PRODM_QRL_037**(高)|编辑页产品性质与主列表一致|验证要点:记录首行产品性质后点「编辑」,编辑页产品性质与主列表该行一致,再关闭返回(只读,不提交)|关联需求:UI-SPEC-SPD-PRODM-024
#### 边界验证点 #### 边界验证点
...@@ -126,6 +128,7 @@ ...@@ -126,6 +128,7 @@
#### 功能验证点 #### 功能验证点
- **TP_PRODM_QRL_026**(高)|打开对应弹窗/抽屉|验证要点:触发「新增」后弹窗/抽屉可见,标题与关键字段可交互;取消不落库(范围内才写保存)|关联需求:UI-SPEC-SPD-PRODM-024 - **TP_PRODM_QRL_026**(高)|打开对应弹窗/抽屉|验证要点:触发「新增」后弹窗/抽屉可见,标题与关键字段可交互;取消不落库(范围内才写保存)|关联需求:UI-SPEC-SPD-PRODM-024
- **TP_PRODM_QRL_038**(高)|新增保存失败弹出提示弹框|验证要点:选用列表已有产品性质并填写其它必填与规则组后点保存;保存失败并弹出对应提示弹框/错误提示,不落库|关联需求:UI-SPEC-SPD-PRODM-024
- **TP_PRODM_QRL_027**(中)|取消不落库|验证要点:填写后取消或关闭,列表不新增/不修改对应记录|关联需求:UI-SPEC-SPD-PRODM-024 - **TP_PRODM_QRL_027**(中)|取消不落库|验证要点:填写后取消或关闭,列表不新增/不修改对应记录|关联需求:UI-SPEC-SPD-PRODM-024
#### 边界验证点 #### 边界验证点
...@@ -170,10 +173,10 @@ ...@@ -170,10 +173,10 @@
|----|------| |----|------|
| 范围 | 在范围内:导航、筛选、列表分页、新增/编辑。排除:断网/弱网、导出文件内容、弹窗全字段落库、登录/改密通用流程(见 `testpoint/scope/基础管理-产品管理-UI测试点范围.md`)。未声称 100% 全覆盖。 | | 范围 | 在范围内:导航、筛选、列表分页、新增/编辑。排除:断网/弱网、导出文件内容、弹窗全字段落库、登录/改密通用流程(见 `testpoint/scope/基础管理-产品管理-UI测试点范围.md`)。未声称 100% 全覆盖。 |
| 范围外未覆盖 | 全局左侧菜单与顶栏导航噪声、导出/打印文件字节内容、弹窗/抽屉全字段组合与真实落库、断网/弱网 | | 范围外未覆盖 | 全局左侧菜单与顶栏导航噪声、导出/打印文件字节内容、弹窗/抽屉全字段组合与真实落库、断网/弱网 |
| 覆盖 | 已写功能域见正文 H3;共 **35** 条原子测试点;扫描元素约 70 项 | | 覆盖 | 已写功能域见正文 H3;共 **38** 条原子测试点;扫描元素约 70 项 |
| 分类 | 功能 / 边界 / 异常 / 集成四类均已按功能点拆分 | | 分类 | 功能 / 边界 / 异常 / 集成四类均已按功能点拆分 |
| 去重 | 登录态过期、无菜单权限、改密引用 `TP_USER_USR_006`/`007`,本页不展开。编号前缀 `TP_PRODM_QRL` | | 去重 | 登录态过期、无菜单权限、改密引用 `TP_USER_USR_006`/`007`,本页不展开。编号前缀 `TP_PRODM_QRL` |
| 待评审项 | 写操作冒烟不提交脏数据;筛选收起后字段是否保留;部分详情层标题可能受顶栏 Tab 干扰需现网复核;页面无列头 sorter(自检);页面无列设置齿轮(自检);页面无宽表启发式,未写横向滚动(自检);有每页条数下拉:已写「切换每页条数」 | | 待评审项 | 写操作冒烟不提交脏数据;筛选收起后字段是否保留;部分详情层标题可能受顶栏 Tab 干扰需现网复核;页面无列头 sorter(自检);有列设置:列表 H3 已写「列设置隐藏后再恢复」;页面无宽表启发式,未写横向滚动(自检);有每页条数下拉:已写「切换每页条数」 |
| 功能点拆分 | 未使用「筛选与查询 / 列表与分页」;快捷与高级筛选分开;有展开则单开查询条件展开收起;列表→分页→导出;写操作 H3 用业务名 | | 功能点拆分 | 未使用「筛选与查询 / 列表与分页」;快捷与高级筛选分开;有展开则单开查询条件展开收起;列表→分页→导出;写操作 H3 用业务名 |
| 报表能力 | 整页渲染,非统计报表 iframe 第四节清单 | | 报表能力 | 整页渲染,非统计报表 iframe 第四节清单 |
| 列排序下游 | 页面无列头 sorter(自检);建议 `audit-sort-columns-live` 维护 `data/spd-admin-sort-columns.json` | | 列排序下游 | 页面无列头 sorter(自检);建议 `audit-sort-columns-live` 维护 `data/spd-admin-sort-columns.json` |
......
...@@ -77,12 +77,33 @@ ...@@ -77,12 +77,33 @@
--- ---
### 状态 Tab
#### 功能验证点
- **TP_PRODM_CHD_038**(高)|状态 Tab 正常切换|验证要点:依次切换 全部、暂存、待审核、待生效、已生效、生效失败、作废、退回;每次切换后列表刷新且无报错,计数为 0 时为空态|关联需求:UI-SPEC-SPD-PRODM-015
#### 边界验证点
- 无(范围未单独展开各 Tab 空态)
#### 异常验证点
- 无(范围排除)
#### 集成验证点
- 无(范围排除)
---
### 列表 ### 列表
#### 功能验证点 #### 功能验证点
- **TP_PRODM_CHD_021**(高)|列表核心列完整|验证要点:主表展示 变更单号、产品、变更字段、时间等(以现网为准)|关联需求:UI-SPEC-SPD-PRODM-015 - **TP_PRODM_CHD_021**(高)|列表核心列完整|验证要点:主表展示 变更单号、产品、变更字段、时间等(以现网为准)|关联需求:UI-SPEC-SPD-PRODM-015
- **TP_PRODM_CHD_022**(中)|各可排序列升序降序|验证要点:每个带排序器的列均可升序、再降序;指示器(▲/▼ 或 aria-sort)与方向一致;列表仍有数据|关联需求:UI-SPEC-SPD-PRODM-015 - **TP_PRODM_CHD_022**(中)|各可排序列升序降序|验证要点:每个带排序器的列均可升序、再降序;指示器(▲/▼ 或 aria-sort)与方向一致;列表仍有数据|关联需求:UI-SPEC-SPD-PRODM-015
- **TP_PRODM_CHD_037**(低)|列设置隐藏后再恢复|验证要点:打开列设置 → 取消勾选非核心列 → 表头隐藏且勾选同步 → 再勾选后表头恢复|关联需求:UI-SPEC-SPD-PRODM-015
#### 边界验证点 #### 边界验证点
...@@ -189,10 +210,10 @@ ...@@ -189,10 +210,10 @@
|----|------| |----|------|
| 范围 | 在范围内:导航、筛选展开、列表分页、导出。排除:断网/弱网、导出文件内容、弹窗全字段落库、登录/改密通用流程(见 `testpoint/scope/基础管理-产品管理-UI测试点范围.md`)。未声称 100% 全覆盖。 | | 范围 | 在范围内:导航、筛选展开、列表分页、导出。排除:断网/弱网、导出文件内容、弹窗全字段落库、登录/改密通用流程(见 `testpoint/scope/基础管理-产品管理-UI测试点范围.md`)。未声称 100% 全覆盖。 |
| 范围外未覆盖 | 全局左侧菜单与顶栏导航噪声、导出/打印文件字节内容、弹窗/抽屉全字段组合与真实落库、断网/弱网 | | 范围外未覆盖 | 全局左侧菜单与顶栏导航噪声、导出/打印文件字节内容、弹窗/抽屉全字段组合与真实落库、断网/弱网 |
| 覆盖 | 已写功能域见正文 H3;共 **36** 条原子测试点;扫描元素约 106 项 | | 覆盖 | 已写功能域见正文 H3;共 **38** 条原子测试点;扫描元素约 106 项 |
| 分类 | 功能 / 边界 / 异常 / 集成四类均已按功能点拆分 | | 分类 | 功能 / 边界 / 异常 / 集成四类均已按功能点拆分 |
| 去重 | 登录态过期、无菜单权限、改密引用 `TP_USER_USR_006`/`007`,本页不展开。编号前缀 `TP_PRODM_CHD` | | 去重 | 登录态过期、无菜单权限、改密引用 `TP_USER_USR_006`/`007`,本页不展开。编号前缀 `TP_PRODM_CHD` |
| 待评审项 | 写操作冒烟不提交脏数据;筛选收起后字段是否保留;部分详情层标题可能受顶栏 Tab 干扰需现网复核;有 sorter:列表 H3 已写「各可排序列升序降序」;下游按 3.6 每列一条;页面无列设置齿轮(自检);页面无宽表启发式,未写横向滚动(自检);有每页条数下拉:已写「切换每页条数」 | | 待评审项 | 写操作冒烟不提交脏数据;筛选收起后字段是否保留;部分详情层标题可能受顶栏 Tab 干扰需现网复核;有 sorter:列表 H3 已写「各可排序列升序降序」;下游按 3.6 每列一条;有列设置:列表 H3 已写「列设置隐藏后再恢复」;页面无宽表启发式,未写横向滚动(自检);有每页条数下拉:已写「切换每页条数」 |
| 功能点拆分 | 未使用「筛选与查询 / 列表与分页」;快捷与高级筛选分开;有展开则单开查询条件展开收起;列表→分页→导出;写操作 H3 用业务名 | | 功能点拆分 | 未使用「筛选与查询 / 列表与分页」;快捷与高级筛选分开;有展开则单开查询条件展开收起;列表→分页→导出;写操作 H3 用业务名 |
| 报表能力 | 整页渲染,非统计报表 iframe 第四节清单 | | 报表能力 | 整页渲染,非统计报表 iframe 第四节清单 |
| 列排序下游 | 有 sorter:列表 H3 已写「各可排序列升序降序」;下游按 3.6 每列一条;建议 `audit-sort-columns-live` 维护 `data/spd-admin-sort-columns.json` | | 列排序下游 | 有 sorter:列表 H3 已写「各可排序列升序降序」;下游按 3.6 每列一条;建议 `audit-sort-columns-live` 维护 `data/spd-admin-sort-columns.json` |
......
...@@ -151,7 +151,7 @@ ...@@ -151,7 +151,7 @@
- **TP_PRODM_STL_020**(高)|行内「详情」可达|验证要点:首行有数据时点「详情」有反馈或进入预期层(只读冒烟,不写外围回写)|关联需求:UI-SPEC-SPD-PRODM-012 - **TP_PRODM_STL_020**(高)|行内「详情」可达|验证要点:首行有数据时点「详情」有反馈或进入预期层(只读冒烟,不写外围回写)|关联需求:UI-SPEC-SPD-PRODM-012
- **TP_PRODM_STL_021**(高)|行内「编辑」可达|验证要点:首行有数据时点「编辑」有反馈或进入预期层(只读冒烟,不写外围回写)|关联需求:UI-SPEC-SPD-PRODM-012 - **TP_PRODM_STL_021**(高)|行内「编辑」可达|验证要点:首行有数据时点「编辑」有反馈或进入预期层(只读冒烟,不写外围回写)|关联需求:UI-SPEC-SPD-PRODM-012
- **TP_PRODM_STL_022**(高)|行内「日志」可达|验证要点:首行有数据时点「日志」有反馈或进入预期层(只读冒烟,不写外围回写)|关联需求:UI-SPEC-SPD-PRODM-012 - **TP_PRODM_STL_022**(高)|日志弹框物料编号与主列表一致|验证要点:记录首行物料编号后点「日志」,详情弹框物料编号/编码与主列表该行一致,再关闭返回(只读,不写外围回写)|关联需求:UI-SPEC-SPD-PRODM-012
#### 边界验证点 #### 边界验证点
...@@ -167,6 +167,26 @@ ...@@ -167,6 +167,26 @@
--- ---
### 批量转移
#### 功能验证点
- **TP_PRODM_STL_040**(高)|勾选列表明细数量与批量转移按钮显示数量一致|验证要点:未勾选时「批量转移(0)」;勾选 N 条明细后按钮文案为「批量转移(N)」,N 与勾选条数一致;不点击提交|关联需求:UI-SPEC-SPD-PRODM-012
#### 边界验证点
- 无
#### 异常验证点
- 无
#### 集成验证点
- 无
---
### 与同组产品管理页差异 ### 与同组产品管理页差异
#### 功能验证点 #### 功能验证点
......
# 期初管理-快速盘点记录 — 测试点分析
**版本**:01
**定稿日期**:2026-11-06
**关联需求**:`knowledge-base/08-UI专项规范库/UI-SPEC-SPD-OPEN-003.md`
**页面 URL**:`http://spdtest.cmic.com.cn:8080/spd/start/init/scanRecord`
**元素扫描**:`data/scan/open-scan-elements.json`(42 项)
**定位器**:`locators/spd/open-scan.locator.yaml`
**本次生成范围**:`testpoint/scope/期初管理-UI测试点范围.md`
---
## 期初管理 · 快速盘点记录
### 页面访问与导航
#### 功能验证点
- **TP_OPEN_SCN_001**(高)|页面主区加载完成|验证要点:携带有效登录态进入 `/spd/start/init/scanRecord`(菜单或直链),筛选(扫码日期/科室名称/条码号/扫码人)、查询/重置/展开收起、导出、扫码记录列表与分页可见;左侧菜单与顶栏 Tab 高亮为快速盘点记录,不误入同组其它期初管理页|关联需求:UI-SPEC-SPD-OPEN-003
- **TP_OPEN_SCN_002**(中)|同组期初管理菜单可切换|验证要点:在 scope 所列期初管理 3 个子菜单(期初录入、期初明细查询、快速盘点记录)中切换后 URL 与内容对应,再返回本页状态正确|关联需求:UI-SPEC-SPD-OPEN-003
#### 边界验证点
- **TP_OPEN_SCN_003**(低)|已登录直接打开 URL|验证要点:携带有效登录态打开 `/spd/start/init/scanRecord`,筛选区与列表可见,无报错遮罩,地址仍为该路径|关联需求:UI-SPEC-SPD-OPEN-003
#### 异常验证点
- 无(未登录/会话过期/无菜单权限引用用户管理 `TP_USER_USR_005`~`007`;本模块自动化不单独写「菜单进入」「未登录访问拦截」用例,见 ui-test-point-rules 3.5)
#### 集成验证点
- **TP_OPEN_SCN_004**(中)|顶栏院区与筛选默认一致|验证要点:顶栏当前院区与页面库房/科室默认范围不矛盾(允许按权限裁剪)|关联需求:UI-SPEC-SPD-OPEN-003
---
### 快捷筛选查询
#### 功能验证点
- **TP_OPEN_SCN_006**(高)|全量可见条件组合查询|验证要点:只填当前结果里有值的条件;结果同时满足已填条件|关联需求:UI-SPEC-SPD-OPEN-003
- **TP_OPEN_SCN_005**(中)|快捷区重置恢复默认|验证要点:填写科室名称/条码号/扫码人后点重置,文本条件清空;扫码日期恢复产品默认近一个月(结束日=当天);页面无报错。列表是否自动刷新按产品规则,未定则标待评审|关联需求:UI-SPEC-SPD-OPEN-003
#### 边界验证点
- **TP_OPEN_SCN_007**(中)|超长文本关键字|验证要点:名称/编号类字段输入较长关键字,查询被接受或截断,页面不崩溃|关联需求:UI-SPEC-SPD-OPEN-003
- **TP_OPEN_SCN_008**(低)|仅空格关键字|验证要点:按空查询或提示,不报错|关联需求:UI-SPEC-SPD-OPEN-003
#### 异常验证点
- **TP_OPEN_SCN_009**(中)|查询接口失败|验证要点:失败有错误提示,不白屏|关联需求:UI-SPEC-SPD-OPEN-003
#### 集成验证点
- **TP_OPEN_SCN_010**(中)|筛选结果与分页总数一致|验证要点:查询后「共 N 条」与本次查询匹配条数一致|关联需求:UI-SPEC-SPD-OPEN-003
---
### 查询条件展开收起
#### 功能验证点
- **TP_OPEN_SCN_011**(中)|展开后更多条件可见|验证要点:额外字段进入可视区且可填写、可参与查询;按钮变为「收起」|关联需求:UI-SPEC-SPD-OPEN-003
- **TP_OPEN_SCN_012**(中)|收起后额外条件隐藏且已填值保留|验证要点:折叠行隐藏;已填值不丢失;再展开后值仍在。产品未定则标待评审|关联需求:UI-SPEC-SPD-OPEN-003
#### 边界验证点
- **TP_OPEN_SCN_013**(低)|展开后无额外字段|验证要点:若产品无第二行筛选,展开为空或禁用,页面不报错|关联需求:UI-SPEC-SPD-OPEN-003
#### 异常验证点
- **TP_OPEN_SCN_014**(低)|展开态查询失败|验证要点:展开后查询失败有提示,不误展示其它页缓存列表|关联需求:UI-SPEC-SPD-OPEN-003
#### 集成验证点
- **TP_OPEN_SCN_015**(中)|展开字段与扫描一致|验证要点:展开后可见字段与 `data/scan` 记录一致,不以邻页筛选字段代替|关联需求:UI-SPEC-SPD-OPEN-003
---
### 列表
#### 功能验证点
- **TP_OPEN_SCN_016**(高)|列表核心列完整|验证要点:主表展示 序号、扫码时间、科室名称、条码号、扫码人|关联需求:UI-SPEC-SPD-OPEN-003
- **TP_OPEN_SCN_031**(低)|列设置隐藏后再恢复|验证要点:打开列设置(齿轮)→ 取消勾选非核心列(如扫码人/科室名称)→ 表头隐藏且勾选状态同步 → 再勾选后表头恢复;勾选状态与表头一致|关联需求:UI-SPEC-SPD-OPEN-003
#### 边界验证点
- **TP_OPEN_SCN_017**(中)|无匹配空列表|验证要点:不存在的关键字查询后表头仍在,0 行或空态;有汇总时为 0 或「-」|关联需求:UI-SPEC-SPD-OPEN-003
#### 异常验证点
- 无(已并入:列表加载失败见查询接口失败)
#### 集成验证点
- 无(已并入:行内操作见行内操作 H3 或本页无行操作)
---
### 分页
#### 功能验证点
- **TP_OPEN_SCN_018**(高)|有数据时总条数|验证要点:「共 N 条」与本次查询匹配条数一致|关联需求:UI-SPEC-SPD-OPEN-003
- **TP_OPEN_SCN_019**(高)|切换至第 2 页|验证要点:页码高亮且首行更换;不足 2 页则该点不适用|关联需求:UI-SPEC-SPD-OPEN-003
- **TP_OPEN_SCN_020**(中)|切换每页条数|验证要点:默认档位(常见 50)→「20 条/页」;共 N 条不变;当前页行数=min(N,20) 且与切换前不同(见 3.7)|关联需求:UI-SPEC-SPD-OPEN-003
#### 边界验证点
- **TP_OPEN_SCN_021**(中)|首页上一页不可用|验证要点:第 1 页时「上一页」禁用或无效|关联需求:UI-SPEC-SPD-OPEN-003
- **TP_OPEN_SCN_022**(中)|末页下一页不可用|验证要点:最后一页时「下一页」禁用或无效|关联需求:UI-SPEC-SPD-OPEN-003
#### 异常验证点
- **TP_OPEN_SCN_023**(低)|跳至非数字页码|验证要点:非法输入不跳转异常页|关联需求:UI-SPEC-SPD-OPEN-003
#### 集成验证点
- **TP_OPEN_SCN_024**(中)|翻页不丢失筛选|验证要点:带筛选翻页后条件保持,新页仍满足原筛选|关联需求:UI-SPEC-SPD-OPEN-003
---
### 导出
#### 功能验证点
- **TP_OPEN_SCN_025**(高)|当前查询条件下导出|验证要点:先查询再导出;无报错。默认不校验文件内容|关联需求:UI-SPEC-SPD-OPEN-003
#### 边界验证点
- **TP_OPEN_SCN_026**(低)|无数据时导出|验证要点:空列表导出不报错或有明确提示|关联需求:UI-SPEC-SPD-OPEN-003
#### 异常验证点
- 无(已并入:导出失败见写操作失败提示)
#### 集成验证点
- 无(已并入:导入模板与导出关系见写操作点)
---
### 与同组期初管理页差异
#### 功能验证点
- **TP_OPEN_SCN_027**(中)|本页独有列与能力|验证要点:扫码盘点流水(扫码时间/条码号),无期初单号列;勿与期初录入/明细查询单据体系混淆;与同组它页切换后列集/工具栏差异可辨识|关联需求:UI-SPEC-SPD-OPEN-003
#### 边界验证点
- **TP_OPEN_SCN_028**(低)|直链不误展示它页列|验证要点:仅打开本页 URL `/spd/start/init/scanRecord` 时不应出现它页独有工具栏(如错页 Tab)|关联需求:UI-SPEC-SPD-OPEN-003
#### 异常验证点
- **TP_OPEN_SCN_029**(中)|菜单高亮与 URL 一致|验证要点:左侧高亮菜单名、顶栏 Tab 与地址栏路径同属本页,非兄弟页 URL|关联需求:UI-SPEC-SPD-OPEN-003
#### 集成验证点
- **TP_OPEN_SCN_030**(低)|跨页数据不串行|验证要点:从本页切至它页再返回,本页筛选/列表恢复为本页数据域,不残留它页查询条件(以现网为准)|关联需求:UI-SPEC-SPD-OPEN-003
---
## 质量自检摘要
| 项 | 结论 |
|----|------|
| 范围 | 在范围内:导航、快捷筛选、查询条件展开收起、列表分页、导出。排除:断网/弱网、导出文件内容、弹窗全字段落库、登录/改密通用流程(见 `testpoint/scope/期初管理-UI测试点范围.md`)。未声称 100% 全覆盖。 |
| 范围外未覆盖 | 全局左侧菜单与顶栏导航噪声、导出文件字节内容、新增/录入弹窗全字段组合与真实落库、断网/弱网 |
| 覆盖 | 已写功能域见正文 H3;共 **31** 条原子测试点;扫描元素约 42 项 |
| 分类 | 功能 / 边界 / 异常 / 集成四类均已按功能点拆分 |
| 去重 | 登录态过期、无菜单权限、改密引用 `TP_USER_USR_006`/`007`,本页不展开。编号前缀 `TP_OPEN_SCN` |
| 待评审项 | 写操作冒烟不提交脏数据;筛选收起后字段是否保留;重置后列表是否自动刷新;页面无列头 sorter(自检);有列设置:列表 H3 已写「列设置隐藏后再恢复」(现网探测确认);页面无宽表启发式,未写横向滚动(自检);有每页条数下拉:已写「切换每页条数」 |
| 功能点拆分 | 未使用「筛选与查询 / 列表与分页」;快捷与高级筛选分开;有展开则单开查询条件展开收起;列表→分页→导出;写操作 H3 用业务名 |
| H3 顺序 | 快捷筛选 →(展开)→(高级筛选)→ 列表 → 分页 → 导出 → 写操作;导出/写操作未插在列表、分页前 |
| 3.2 反别名 | 无「重置恢复默认 / 分页翻页 / 导出入口可触发」等 3.2.1 禁止别名 |
| 写操作 H3 命名 | 业务名(非「xxx弹窗/抽屉」);层内为「打开对应弹窗/抽屉」,必填在边界 |
| 横向滚动 | 页面无宽表启发式,未写横向滚动(自检) |
| 报表能力 | 整页渲染,非统计报表 iframe 第四节清单 |
| 列排序下游 | 页面无列头 sorter(自检) |
| 分页每页条数 | 有每页条数下拉:已写「切换每页条数」 |
| 下游 | 可转 testcases/MD、CSV、Playwright;扫描 `npm run discover:scan-open`;YAML `npm run discover:yaml-from-json-open`;测试点 `npm run generate:testpoints-open` |
# 期初管理-期初录入 — 测试点分析
**版本**:01
**定稿日期**:2026-11-06
**关联需求**:`knowledge-base/08-UI专项规范库/UI-SPEC-SPD-OPEN-001.md`
**页面 URL**:`http://spdtest.cmic.com.cn:8080/spd/start/init/import`
**元素扫描**:`data/scan/open-entry-elements.json`(128 项)
**定位器**:`locators/spd/open-entry.locator.yaml`
**本次生成范围**:`testpoint/scope/期初管理-UI测试点范围.md`
---
## 期初管理 · 期初录入
### 页面访问与导航
#### 功能验证点
- **TP_OPEN_ENT_001**(高)|页面主区加载完成|验证要点:携带有效登录态进入 `/spd/start/init/import`(菜单或直链),筛选(库房/状态/期初单号)、查询/重置/高级筛选、新增、列表(待生成·录入/删除;已生成·查看详情)与分页可见;左侧菜单与顶栏 Tab 高亮为期初录入,不误入同组其它期初管理页|关联需求:UI-SPEC-SPD-OPEN-001
- **TP_OPEN_ENT_002**(中)|同组期初管理菜单可切换|验证要点:在 scope 所列期初管理 3 个子菜单(期初录入、期初明细查询、快速盘点记录)中切换后 URL 与内容对应,再返回本页状态正确|关联需求:UI-SPEC-SPD-OPEN-001
#### 边界验证点
- **TP_OPEN_ENT_003**(低)|已登录直接打开 URL|验证要点:携带有效登录态打开 `/spd/start/init/import`,筛选区与列表可见,无报错遮罩,地址仍为该路径|关联需求:UI-SPEC-SPD-OPEN-001
#### 异常验证点
- 无(未登录/会话过期/无菜单权限引用用户管理 `TP_USER_USR_005`~`007`;本模块自动化不单独写「菜单进入」「未登录访问拦截」用例,见 ui-test-point-rules 3.5)
#### 集成验证点
- **TP_OPEN_ENT_004**(中)|顶栏院区与筛选默认一致|验证要点:顶栏当前院区与页面库房/科室默认范围不矛盾(允许按权限裁剪)|关联需求:UI-SPEC-SPD-OPEN-001
---
### 快捷筛选查询
#### 功能验证点
- **TP_OPEN_ENT_005**(中)|快捷区重置恢复默认|验证要点:已填字段(及维度勾选)恢复默认;列表是否刷新按产品规则,未定则标待评审|关联需求:UI-SPEC-SPD-OPEN-001
#### 边界验证点
- **TP_OPEN_ENT_006**(中)|超长文本关键字|验证要点:名称/编号类字段输入较长关键字,查询被接受或截断,页面不崩溃|关联需求:UI-SPEC-SPD-OPEN-001
- **TP_OPEN_ENT_007**(低)|仅空格关键字|验证要点:按空查询或提示,不报错|关联需求:UI-SPEC-SPD-OPEN-001
#### 异常验证点
- **TP_OPEN_ENT_008**(中)|查询接口失败|验证要点:失败有错误提示,不白屏|关联需求:UI-SPEC-SPD-OPEN-001
#### 集成验证点
- **TP_OPEN_ENT_009**(中)|筛选结果与分页总数一致|验证要点:查询后「共 N 条」与本次查询匹配条数一致|关联需求:UI-SPEC-SPD-OPEN-001
---
### 高级筛选抽屉
#### 功能验证点
- **TP_OPEN_ENT_010**(高)|点击高级筛选打开抽屉|验证要点:标题为「高级筛选」;关键字段可交互|关联需求:UI-SPEC-SPD-OPEN-001
- **TP_OPEN_ENT_011**(中)|抽屉内重置恢复默认|验证要点:抽屉字段恢复默认,快捷区不被清空|关联需求:UI-SPEC-SPD-OPEN-001
- **TP_OPEN_ENT_012**(高)|全量查询条件组合查询|验证要点:快捷区 +(有则)维度勾选 + 抽屉全填样本非空字段;抽样首行同时满足全部已填条件|关联需求:UI-SPEC-SPD-OPEN-001
#### 边界验证点
- 无(已并入:高级筛选字段边界见快捷区同类规则)
#### 异常验证点
- 无(已并入:高级筛选接口失败归入查询接口失败)
#### 集成验证点
- **TP_OPEN_ENT_013**(中)|高级筛选带入|验证要点:快捷区同名字段带入抽屉且不手改,与快捷区一致(可选,见 rules 3.3)|关联需求:UI-SPEC-SPD-OPEN-001
---
### 列表
#### 功能验证点
- **TP_OPEN_ENT_020**(高)|列表核心列完整|验证要点:主表展示 期初单号、库房、库区、耗材类型、品规数、库存总数、制单人、制单时间、生成时间、状态、操作|关联需求:UI-SPEC-SPD-OPEN-001
- **TP_OPEN_ENT_021**(低)|列设置隐藏后再恢复|验证要点:打开列设置 → 取消勾选非核心列 → 表头隐藏且勾选同步 → 再勾选后表头恢复|关联需求:UI-SPEC-SPD-OPEN-001
#### 边界验证点
- **TP_OPEN_ENT_022**(中)|无匹配空列表|验证要点:不存在的关键字查询后表头仍在,0 行或空态;有汇总时为 0 或「-」|关联需求:UI-SPEC-SPD-OPEN-001
- **TP_OPEN_ENT_023**(中)|横向滚动与列对齐|验证要点:远侧列可进入视口;表头列数=数据列数;对齐无重叠。列名以本页为准|关联需求:UI-SPEC-SPD-OPEN-001
#### 异常验证点
- 无(已并入:列表加载失败见查询接口失败)
#### 集成验证点
- 无(已并入:行内操作见行内操作 H3 或本页无行操作)
---
### 分页
#### 功能验证点
- **TP_OPEN_ENT_024**(高)|有数据时总条数|验证要点:「共 N 条」与本次查询匹配条数一致|关联需求:UI-SPEC-SPD-OPEN-001
- **TP_OPEN_ENT_025**(高)|切换至第 2 页|验证要点:页码高亮且首行更换;不足 2 页则该点不适用|关联需求:UI-SPEC-SPD-OPEN-001
- **TP_OPEN_ENT_026**(中)|切换每页条数|验证要点:默认档位(常见 50)→「20 条/页」;共 N 条不变;当前页行数=min(N,20) 且与切换前不同(见 3.7)|关联需求:UI-SPEC-SPD-OPEN-001
#### 边界验证点
- **TP_OPEN_ENT_027**(中)|首页上一页不可用|验证要点:第 1 页时「上一页」禁用或无效|关联需求:UI-SPEC-SPD-OPEN-001
- **TP_OPEN_ENT_028**(中)|末页下一页不可用|验证要点:最后一页时「下一页」禁用或无效|关联需求:UI-SPEC-SPD-OPEN-001
#### 异常验证点
- **TP_OPEN_ENT_029**(低)|跳至非数字页码|验证要点:非法输入不跳转异常页|关联需求:UI-SPEC-SPD-OPEN-001
#### 集成验证点
- **TP_OPEN_ENT_030**(中)|翻页不丢失筛选|验证要点:带筛选翻页后条件保持,新页仍满足原筛选|关联需求:UI-SPEC-SPD-OPEN-001
---
### 行内操作
#### 功能验证点
- **TP_OPEN_ENT_014**(高)|行内「录入」可达|验证要点:首行有数据时点「录入」有反馈或进入预期层(只读冒烟,不写外围回写)|关联需求:UI-SPEC-SPD-OPEN-001
- **TP_OPEN_ENT_015**(高)|行内「删除」可达|验证要点:首行有数据时点「删除」有反馈或进入预期层(只读冒烟,不写外围回写)|关联需求:UI-SPEC-SPD-OPEN-001
- **TP_OPEN_ENT_016**(高)|行内「查看详情」可达|验证要点:首行有数据时点「查看详情」有反馈或进入预期层(只读冒烟,不写外围回写)|关联需求:UI-SPEC-SPD-OPEN-001
- **TP_OPEN_ENT_047**(高)|针对新增待生成单据删除成功|验证要点:对本用例新增产生的待生成单据点「删除」并确认;列表不再出现该期初单号,总数同步减少|关联需求:UI-SPEC-SPD-OPEN-001
#### 边界验证点
- **TP_OPEN_ENT_017**(低)|末行或无数据|验证要点:无数据时空态,行内按钮不可用或不可见(以现网为准)|关联需求:UI-SPEC-SPD-OPEN-001
#### 异常验证点
- **TP_OPEN_ENT_018**(中)|操作失败提示|验证要点:接口失败时有提示,列表行状态不误改为成功|关联需求:UI-SPEC-SPD-OPEN-001
#### 集成验证点
- **TP_OPEN_ENT_019**(低)|一对多备注|验证要点:下游用例可按每个行内操作各拆一条;本页已按操作拆功能点|关联需求:UI-SPEC-SPD-OPEN-001
---
### 单据状态与行操作
#### 功能验证点
- **TP_OPEN_ENT_031**(高)|待生成行操作匹配|验证要点:状态为「待生成」的行展示「录入」「删除」,不出现「查看详情」为主操作(以现网为准)|关联需求:UI-SPEC-SPD-OPEN-001
- **TP_OPEN_ENT_032**(高)|已生成行操作匹配|验证要点:状态为「已生成」的行展示「查看详情」,不误提供删除落库入口(以现网为准)|关联需求:UI-SPEC-SPD-OPEN-001
#### 边界验证点
- **TP_OPEN_ENT_033**(低)|空列表无行操作|验证要点:无数据时空态,行内按钮不可用或不可见|关联需求:UI-SPEC-SPD-OPEN-001
#### 异常验证点
- **TP_OPEN_ENT_034**(中)|状态与操作不一致提示|验证要点:若操作与当前状态不符被拦截,有明确提示且列表状态不误改|关联需求:UI-SPEC-SPD-OPEN-001
#### 集成验证点
- **TP_OPEN_ENT_035**(中)|生成后状态与明细可追溯|验证要点:已生成单据的期初单号可在「期初明细查询」按单号检索到对应明细(允许权限裁剪)|关联需求:UI-SPEC-SPD-OPEN-001
---
### 新增
#### 功能验证点
- **TP_OPEN_ENT_036**(高)|打开对应弹窗/抽屉|验证要点:触发「新增」后弹窗/抽屉可见,标题与关键字段可交互;取消不落库(范围内才写保存)|关联需求:UI-SPEC-SPD-OPEN-001
- **TP_OPEN_ENT_037**(中)|取消不落库|验证要点:填写后取消或关闭,列表不新增/不修改对应记录|关联需求:UI-SPEC-SPD-OPEN-001
- **TP_OPEN_ENT_046**(高)|新增选择库房库区耗材类型并勾选后确定成功|验证要点:新增弹窗选择库房→库区→耗材类型,勾选「导入后使用原系统唯一码做新系统UDI」后点确定;弹窗关闭;列表新增一条待生成单据且库房/库区/耗材类型与所选一致|关联需求:UI-SPEC-SPD-OPEN-001
#### 边界验证点
- **TP_OPEN_ENT_038**(中)|必填为空拦截|验证要点:必填项为空时确定被拦截并提示,不落库|关联需求:UI-SPEC-SPD-OPEN-001
- **TP_OPEN_ENT_039**(低)|重复打开|验证要点:连续两次打开不叠加多层遮罩|关联需求:UI-SPEC-SPD-OPEN-001
#### 异常验证点
- **TP_OPEN_ENT_040**(中)|保存失败|验证要点:接口失败时弹窗不自动关闭且列表保持原状|关联需求:UI-SPEC-SPD-OPEN-001
#### 集成验证点
- **TP_OPEN_ENT_041**(低)|弹窗字段与列表列一致|验证要点:弹窗内关键字段与列表展示字段命名一致|关联需求:UI-SPEC-SPD-OPEN-001
---
### 与同组期初管理页差异
#### 功能验证点
- **TP_OPEN_ENT_042**(中)|本页独有列与能力|验证要点:期初单据头列表(QC 单号)+ 状态驱动行操作;勿与「期初明细查询」明细行或「快速盘点记录」扫码流水混淆;与同组它页切换后列集/工具栏差异可辨识|关联需求:UI-SPEC-SPD-OPEN-001
#### 边界验证点
- **TP_OPEN_ENT_043**(低)|直链不误展示它页列|验证要点:仅打开本页 URL `/spd/start/init/import` 时不应出现它页独有工具栏(如错页 Tab)|关联需求:UI-SPEC-SPD-OPEN-001
#### 异常验证点
- **TP_OPEN_ENT_044**(中)|菜单高亮与 URL 一致|验证要点:左侧高亮菜单名、顶栏 Tab 与地址栏路径同属本页,非兄弟页 URL|关联需求:UI-SPEC-SPD-OPEN-001
#### 集成验证点
- **TP_OPEN_ENT_045**(低)|跨页数据不串行|验证要点:从本页切至它页再返回,本页筛选/列表恢复为本页数据域,不残留它页查询条件(以现网为准)|关联需求:UI-SPEC-SPD-OPEN-001
---
## 质量自检摘要
| 项 | 结论 |
|----|------|
| 范围 | 在范围内:导航、快捷/高级筛选、列表分页、新增、行内录入/删除/查看详情;例外含新增确定成功与针对新增单据删除成功。排除:断网/弱网、导出文件内容、弹窗全字段组合穷举、录入明细写回、登录/改密通用流程(见 `testpoint/scope/期初管理-UI测试点范围.md`)。未声称 100% 全覆盖。 |
| 范围外未覆盖 | 全局左侧菜单与顶栏导航噪声、导出文件字节内容、新增/录入弹窗全字段组合穷举、录入明细写回、断网/弱网 |
| 覆盖 | 已写功能域见正文 H3;共 **47** 条原子测试点;扫描元素约 128 项 |
| 分类 | 功能 / 边界 / 异常 / 集成四类均已按功能点拆分 |
| 去重 | 登录态过期、无菜单权限、改密引用 `TP_USER_USR_006`/`007`,本页不展开。编号前缀 `TP_OPEN_ENT` |
| 待评审项 | 写操作冒烟不提交脏数据;筛选收起后字段是否保留;重置后列表是否自动刷新;页面无列头 sorter(自检);有列设置:列表 H3 已写「列设置隐藏后再恢复」;宽表已写「横向滚动与列对齐」;有每页条数下拉:已写「切换每页条数」 |
| 功能点拆分 | 未使用「筛选与查询 / 列表与分页」;快捷与高级筛选分开;有展开则单开查询条件展开收起;列表→分页→导出;写操作 H3 用业务名 |
| H3 顺序 | 快捷筛选 →(展开)→(高级筛选)→ 列表 → 分页 → 导出 → 写操作;导出/写操作未插在列表、分页前 |
| 3.2 反别名 | 无「重置恢复默认 / 分页翻页 / 导出入口可触发」等 3.2.1 禁止别名 |
| 写操作 H3 命名 | 业务名(非「xxx弹窗/抽屉」);层内为「打开对应弹窗/抽屉」,必填在边界 |
| 横向滚动 | 宽表已写「横向滚动与列对齐」 |
| 报表能力 | 整页渲染,非统计报表 iframe 第四节清单 |
| 列排序下游 | 页面无列头 sorter(自检) |
| 分页每页条数 | 有每页条数下拉:已写「切换每页条数」 |
| 下游 | 可转 testcases/MD、CSV、Playwright;扫描 `npm run discover:scan-open`;YAML `npm run discover:yaml-from-json-open`;测试点 `npm run generate:testpoints-open` |
# 期初管理-期初明细查询 — 测试点分析
**版本**:01
**定稿日期**:2026-11-06
**关联需求**:`knowledge-base/08-UI专项规范库/UI-SPEC-SPD-OPEN-002.md`
**页面 URL**:`http://spdtest.cmic.com.cn:8080/spd/start/init/detail`
**元素扫描**:`data/scan/open-detail-elements.json`(62 项)
**定位器**:`locators/spd/open-detail.locator.yaml`
**本次生成范围**:`testpoint/scope/期初管理-UI测试点范围.md`
---
## 期初管理 · 期初明细查询
### 页面访问与导航
#### 功能验证点
- **TP_OPEN_DTL_001**(高)|页面主区加载完成|验证要点:携带有效登录态进入 `/spd/start/init/detail`(菜单或直链),筛选(库房/期初单号/耗材类型)、查询/重置/高级筛选、明细列表与分页可见;左侧菜单与顶栏 Tab 高亮为期初明细查询,不误入同组其它期初管理页|关联需求:UI-SPEC-SPD-OPEN-002
- **TP_OPEN_DTL_002**(中)|同组期初管理菜单可切换|验证要点:在 scope 所列期初管理 3 个子菜单(期初录入、期初明细查询、快速盘点记录)中切换后 URL 与内容对应,再返回本页状态正确|关联需求:UI-SPEC-SPD-OPEN-002
#### 边界验证点
- **TP_OPEN_DTL_003**(低)|已登录直接打开 URL|验证要点:携带有效登录态打开 `/spd/start/init/detail`,筛选区与列表可见,无报错遮罩,地址仍为该路径|关联需求:UI-SPEC-SPD-OPEN-002
#### 异常验证点
- 无(未登录/会话过期/无菜单权限引用用户管理 `TP_USER_USR_005`~`007`;本模块自动化不单独写「菜单进入」「未登录访问拦截」用例,见 ui-test-point-rules 3.5)
#### 集成验证点
- **TP_OPEN_DTL_004**(中)|顶栏院区与筛选默认一致|验证要点:顶栏当前院区与页面库房/科室默认范围不矛盾(允许按权限裁剪)|关联需求:UI-SPEC-SPD-OPEN-002
---
### 快捷筛选查询
#### 功能验证点
- **TP_OPEN_DTL_005**(中)|快捷区重置恢复默认|验证要点:已填字段(及维度勾选)恢复默认;列表是否刷新按产品规则,未定则标待评审|关联需求:UI-SPEC-SPD-OPEN-002
#### 边界验证点
- **TP_OPEN_DTL_006**(中)|超长文本关键字|验证要点:名称/编号类字段输入较长关键字,查询被接受或截断,页面不崩溃|关联需求:UI-SPEC-SPD-OPEN-002
- **TP_OPEN_DTL_007**(低)|仅空格关键字|验证要点:按空查询或提示,不报错|关联需求:UI-SPEC-SPD-OPEN-002
#### 异常验证点
- **TP_OPEN_DTL_008**(中)|查询接口失败|验证要点:失败有错误提示,不白屏|关联需求:UI-SPEC-SPD-OPEN-002
#### 集成验证点
- **TP_OPEN_DTL_009**(中)|筛选结果与分页总数一致|验证要点:查询后「共 N 条」与本次查询匹配条数一致|关联需求:UI-SPEC-SPD-OPEN-002
---
### 高级筛选抽屉
#### 功能验证点
- **TP_OPEN_DTL_010**(高)|点击高级筛选打开抽屉|验证要点:标题为「高级筛选」;关键字段可交互|关联需求:UI-SPEC-SPD-OPEN-002
- **TP_OPEN_DTL_011**(中)|抽屉内重置恢复默认|验证要点:抽屉字段恢复默认,快捷区不被清空|关联需求:UI-SPEC-SPD-OPEN-002
- **TP_OPEN_DTL_012**(高)|全量查询条件组合查询|验证要点:快捷区 +(有则)维度勾选 + 抽屉全填样本非空字段;抽样首行同时满足全部已填条件|关联需求:UI-SPEC-SPD-OPEN-002
#### 边界验证点
- 无(已并入:高级筛选字段边界见快捷区同类规则)
#### 异常验证点
- 无(已并入:高级筛选接口失败归入查询接口失败)
#### 集成验证点
- **TP_OPEN_DTL_013**(中)|高级筛选带入|验证要点:快捷区同名字段带入抽屉且不手改,与快捷区一致(可选,见 rules 3.3)|关联需求:UI-SPEC-SPD-OPEN-002
---
### 列表
#### 功能验证点
- **TP_OPEN_DTL_014**(高)|列表核心列完整|验证要点:主表展示 期初单号、库房、库区、制单人、生成时间、规格型号、赋码管理、耗材类型、单位、库存数量、结算方式、批号|关联需求:UI-SPEC-SPD-OPEN-002
- **TP_OPEN_DTL_015**(低)|列设置隐藏后再恢复|验证要点:打开列设置 → 取消勾选非核心列 → 表头隐藏且勾选同步 → 再勾选后表头恢复|关联需求:UI-SPEC-SPD-OPEN-002
#### 边界验证点
- **TP_OPEN_DTL_016**(中)|无匹配空列表|验证要点:不存在的关键字查询后表头仍在,0 行或空态;有汇总时为 0 或「-」|关联需求:UI-SPEC-SPD-OPEN-002
- **TP_OPEN_DTL_017**(中)|横向滚动与列对齐|验证要点:远侧列可进入视口;表头列数=数据列数;对齐无重叠。列名以本页为准|关联需求:UI-SPEC-SPD-OPEN-002
#### 异常验证点
- 无(已并入:列表加载失败见查询接口失败)
#### 集成验证点
- 无(已并入:行内操作见行内操作 H3 或本页无行操作)
---
### 分页
#### 功能验证点
- **TP_OPEN_DTL_018**(高)|有数据时总条数|验证要点:「共 N 条」与本次查询匹配条数一致|关联需求:UI-SPEC-SPD-OPEN-002
- **TP_OPEN_DTL_019**(高)|切换至第 2 页|验证要点:页码高亮且首行更换;不足 2 页则该点不适用|关联需求:UI-SPEC-SPD-OPEN-002
- **TP_OPEN_DTL_020**(中)|切换每页条数|验证要点:默认档位(常见 50)→「20 条/页」;共 N 条不变;当前页行数=min(N,20) 且与切换前不同(见 3.7)|关联需求:UI-SPEC-SPD-OPEN-002
#### 边界验证点
- **TP_OPEN_DTL_021**(中)|首页上一页不可用|验证要点:第 1 页时「上一页」禁用或无效|关联需求:UI-SPEC-SPD-OPEN-002
- **TP_OPEN_DTL_022**(中)|末页下一页不可用|验证要点:最后一页时「下一页」禁用或无效|关联需求:UI-SPEC-SPD-OPEN-002
#### 异常验证点
- **TP_OPEN_DTL_023**(低)|跳至非数字页码|验证要点:非法输入不跳转异常页|关联需求:UI-SPEC-SPD-OPEN-002
#### 集成验证点
- **TP_OPEN_DTL_024**(中)|翻页不丢失筛选|验证要点:带筛选翻页后条件保持,新页仍满足原筛选|关联需求:UI-SPEC-SPD-OPEN-002
---
### 与同组期初管理页差异
#### 功能验证点
- **TP_OPEN_DTL_025**(中)|本页独有列与能力|验证要点:期初明细只读查询(赋码/批号/库存数量等);勿与「期初录入」单据头或盘点扫码记录混淆;与同组它页切换后列集/工具栏差异可辨识|关联需求:UI-SPEC-SPD-OPEN-002
#### 边界验证点
- **TP_OPEN_DTL_026**(低)|直链不误展示它页列|验证要点:仅打开本页 URL `/spd/start/init/detail` 时不应出现它页独有工具栏(如错页 Tab)|关联需求:UI-SPEC-SPD-OPEN-002
#### 异常验证点
- **TP_OPEN_DTL_027**(中)|菜单高亮与 URL 一致|验证要点:左侧高亮菜单名、顶栏 Tab 与地址栏路径同属本页,非兄弟页 URL|关联需求:UI-SPEC-SPD-OPEN-002
#### 集成验证点
- **TP_OPEN_DTL_028**(低)|跨页数据不串行|验证要点:从本页切至它页再返回,本页筛选/列表恢复为本页数据域,不残留它页查询条件(以现网为准)|关联需求:UI-SPEC-SPD-OPEN-002
---
## 质量自检摘要
| 项 | 结论 |
|----|------|
| 范围 | 在范围内:导航、快捷/高级筛选、列表分页。排除:断网/弱网、导出文件内容、弹窗全字段落库、登录/改密通用流程(见 `testpoint/scope/期初管理-UI测试点范围.md`)。未声称 100% 全覆盖。 |
| 范围外未覆盖 | 全局左侧菜单与顶栏导航噪声、导出文件字节内容、新增/录入弹窗全字段组合与真实落库、断网/弱网 |
| 覆盖 | 已写功能域见正文 H3;共 **28** 条原子测试点;扫描元素约 62 项 |
| 分类 | 功能 / 边界 / 异常 / 集成四类均已按功能点拆分 |
| 去重 | 登录态过期、无菜单权限、改密引用 `TP_USER_USR_006`/`007`,本页不展开。编号前缀 `TP_OPEN_DTL` |
| 待评审项 | 写操作冒烟不提交脏数据;筛选收起后字段是否保留;重置后列表是否自动刷新;页面无列头 sorter(自检);有列设置:列表 H3 已写「列设置隐藏后再恢复」;宽表已写「横向滚动与列对齐」;有每页条数下拉:已写「切换每页条数」 |
| 功能点拆分 | 未使用「筛选与查询 / 列表与分页」;快捷与高级筛选分开;有展开则单开查询条件展开收起;列表→分页→导出;写操作 H3 用业务名 |
| H3 顺序 | 快捷筛选 →(展开)→(高级筛选)→ 列表 → 分页 → 导出 → 写操作;导出/写操作未插在列表、分页前 |
| 3.2 反别名 | 无「重置恢复默认 / 分页翻页 / 导出入口可触发」等 3.2.1 禁止别名 |
| 写操作 H3 命名 | 业务名(非「xxx弹窗/抽屉」);层内为「打开对应弹窗/抽屉」,必填在边界 |
| 横向滚动 | 宽表已写「横向滚动与列对齐」 |
| 报表能力 | 整页渲染,非统计报表 iframe 第四节清单 |
| 列排序下游 | 页面无列头 sorter(自检) |
| 分页每页条数 | 有每页条数下拉:已写「切换每页条数」 |
| 下游 | 可转 testcases/MD、CSV、Playwright;扫描 `npm run discover:scan-open`;YAML `npm run discover:yaml-from-json-open`;测试点 `npm run generate:testpoints-open` |
...@@ -139,7 +139,7 @@ test.describe('基础设置 · 准入管理', () => { ...@@ -139,7 +139,7 @@ test.describe('基础设置 · 准入管理', () => {
}); });
test.describe('供货目录申请明细查询 · 导出', () => { test.describe('供货目录申请明细查询 · 导出', () => {
test('ADMIT-SUP-020 当前查询条件下导出不报错', { tag: '@smoke' }, async ({ admitSupplyDetailPage }) => { test('ADMIT-SUP-020 首行样本查询后导出', { tag: '@smoke' }, async ({ admitSupplyDetailPage }) => {
await admitSupplyDetailPage.open(); await admitSupplyDetailPage.open();
await admitSupplyDetailPage.exportAfterQuery(); await admitSupplyDetailPage.exportAfterQuery();
}); });
......
...@@ -90,9 +90,9 @@ test.describe('基础设置 · 科室管理', () => { ...@@ -90,9 +90,9 @@ test.describe('基础设置 · 科室管理', () => {
}); });
test.describe('科室分类维护 · 导出', () => { test.describe('科室分类维护 · 导出', () => {
test('DEPTM-CAT-015 导出入口可触发', async ({ deptmCategoryPage }) => { test('DEPTM-CAT-015 首行样本查询后导出', async ({ deptmCategoryPage }) => {
await deptmCategoryPage.open(); await deptmCategoryPage.open();
await deptmCategoryPage.clickExportIfVisible(); await deptmCategoryPage.exportAfterQueryByFirstRowSample();
}); });
}); });
......
...@@ -68,9 +68,9 @@ test.describe('基础设置 · 科室管理', () => { ...@@ -68,9 +68,9 @@ test.describe('基础设置 · 科室管理', () => {
}); });
test.describe('科室上下限建议 · 导出', () => { test.describe('科室上下限建议 · 导出', () => {
test('DEPTM-MNM-011 导出入口可触发', async ({ deptmMinmaxPage }) => { test('DEPTM-MNM-011 首行样本查询后导出', async ({ deptmMinmaxPage }) => {
await deptmMinmaxPage.open(); await deptmMinmaxPage.open();
await deptmMinmaxPage.clickExportIfVisible(); await deptmMinmaxPage.exportAfterQueryByFirstRowSample();
}); });
}); });
......
...@@ -69,9 +69,9 @@ test.describe('基础设置 · 科室管理', () => { ...@@ -69,9 +69,9 @@ test.describe('基础设置 · 科室管理', () => {
}); });
test.describe('科室产品分配 · 导出', () => { test.describe('科室产品分配 · 导出', () => {
test('DEPTM-PRA-010 导出入口可触发', async ({ deptmProductAllocPage }) => { test('DEPTM-PRA-010 首行样本查询后导出', async ({ deptmProductAllocPage }) => {
await deptmProductAllocPage.open(); await deptmProductAllocPage.open();
await deptmProductAllocPage.clickExportIfVisible(); await deptmProductAllocPage.exportAfterQueryByFirstRowSample();
}); });
}); });
......
...@@ -67,9 +67,9 @@ test.describe('基础设置 · 科室管理', () => { ...@@ -67,9 +67,9 @@ test.describe('基础设置 · 科室管理', () => {
}); });
test.describe('科室库区产品设置 · 导出', () => { test.describe('科室库区产品设置 · 导出', () => {
test('DEPTM-ZON-010 导出入口可触发', async ({ deptmZoneProductPage }) => { test('DEPTM-ZON-010 首行样本查询后导出', async ({ deptmZoneProductPage }) => {
await deptmZoneProductPage.open(); await deptmZoneProductPage.open();
await deptmZoneProductPage.clickExportIfVisible(); await deptmZoneProductPage.exportAfterQueryByFirstRowSample();
}); });
}); });
......
...@@ -61,9 +61,9 @@ test.describe('基础设置 · 接口管理', () => { ...@@ -61,9 +61,9 @@ test.describe('基础设置 · 接口管理', () => {
}); });
test.describe('接口日志 · 导出', () => { test.describe('接口日志 · 导出', () => {
test('IFACE-LOG-009 导出明细可触发', async ({ ifaceApiLogPage }) => { test('IFACE-LOG-009 首行样本查询后导出', async ({ ifaceApiLogPage }) => {
await ifaceApiLogPage.open(); await ifaceApiLogPage.open();
await ifaceApiLogPage.clickExportIfVisible(); await ifaceApiLogPage.exportAfterQueryByFirstRowSample();
}); });
}); });
......
...@@ -61,9 +61,9 @@ test.describe('基础设置 · 接口管理', () => { ...@@ -61,9 +61,9 @@ test.describe('基础设置 · 接口管理', () => {
}); });
test.describe('智能柜与库区对码 · 导出', () => { test.describe('智能柜与库区对码 · 导出', () => {
test('IFACE-CZN-008 导出入口可触发', async ({ ifaceCabinetZonePage }) => { test('IFACE-CZN-008 首行样本查询后导出', async ({ ifaceCabinetZonePage }) => {
await ifaceCabinetZonePage.open(); await ifaceCabinetZonePage.open();
await ifaceCabinetZonePage.clickExportIfVisible(); await ifaceCabinetZonePage.exportAfterQueryByFirstRowSample();
}); });
}); });
......
...@@ -43,9 +43,9 @@ test.describe('基础设置 · 接口管理', () => { ...@@ -43,9 +43,9 @@ test.describe('基础设置 · 接口管理', () => {
}); });
test.describe('外部变更明细信息查询 · 导出', () => { test.describe('外部变更明细信息查询 · 导出', () => {
test('IFACE-EXT-006 导出入口可触发', async ({ ifaceExtDetailPage }) => { test('IFACE-EXT-006 首行样本查询后导出', async ({ ifaceExtDetailPage }) => {
await ifaceExtDetailPage.open(); await ifaceExtDetailPage.open();
await ifaceExtDetailPage.clickExportIfVisible(); await ifaceExtDetailPage.exportAfterQueryByFirstRowSample();
}); });
}); });
......
...@@ -55,9 +55,9 @@ test.describe('基础设置 · 接口管理', () => { ...@@ -55,9 +55,9 @@ test.describe('基础设置 · 接口管理', () => {
}); });
test.describe('HIS价对照查询 · 导出', () => { test.describe('HIS价对照查询 · 导出', () => {
test('IFACE-HPR-008 导出入口可触发', async ({ ifaceHisPricePage }) => { test('IFACE-HPR-008 首行样本查询后导出', async ({ ifaceHisPricePage }) => {
await ifaceHisPricePage.open(); await ifaceHisPricePage.open();
await ifaceHisPricePage.clickExportIfVisible(); await ifaceHisPricePage.exportAfterQueryByFirstRowSample();
}); });
}); });
......
...@@ -60,9 +60,9 @@ test.describe('基础设置 · 接口管理', () => { ...@@ -60,9 +60,9 @@ test.describe('基础设置 · 接口管理', () => {
}); });
test.describe('低值计费接口查询 · 导出', () => { test.describe('低值计费接口查询 · 导出', () => {
test('IFACE-LBL-009 导出入口可触发', async ({ ifaceLowBillingPage }) => { test('IFACE-LBL-009 首行样本查询后导出', async ({ ifaceLowBillingPage }) => {
await ifaceLowBillingPage.open(); await ifaceLowBillingPage.open();
await ifaceLowBillingPage.clickExportIfVisible(); await ifaceLowBillingPage.exportAfterQueryByFirstRowSample();
}); });
}); });
......
...@@ -55,9 +55,9 @@ test.describe('基础设置 · 接口管理', () => { ...@@ -55,9 +55,9 @@ test.describe('基础设置 · 接口管理', () => {
}); });
test.describe('外围产品变更 · 导出', () => { test.describe('外围产品变更 · 导出', () => {
test('IFACE-PER-008 导出变更明细', async ({ ifacePeripheralPage }) => { test('IFACE-PER-008 首行样本查询后导出', async ({ ifacePeripheralPage }) => {
await ifacePeripheralPage.open(); await ifacePeripheralPage.open();
await ifacePeripheralPage.clickExportIfVisible(); await ifacePeripheralPage.exportAfterQueryByFirstRowSample();
}); });
}); });
......
...@@ -43,9 +43,9 @@ test.describe('基础设置 · 接口管理', () => { ...@@ -43,9 +43,9 @@ test.describe('基础设置 · 接口管理', () => {
}); });
test.describe('平台产品价格差异查询 · 导出', () => { test.describe('平台产品价格差异查询 · 导出', () => {
test('IFACE-PPD-006 导出入口可触发', async ({ ifacePlatformDiffPage }) => { test('IFACE-PPD-006 首行样本查询后导出', async ({ ifacePlatformDiffPage }) => {
await ifacePlatformDiffPage.open(); await ifacePlatformDiffPage.open();
await ifacePlatformDiffPage.clickExportIfVisible(); await ifacePlatformDiffPage.exportAfterQueryByFirstRowSample();
}); });
}); });
......
import {
openDetailComboAssertKeys,
openDetailComboDrawerFields,
openDetailComboQuickFields,
} from '../../data/open.data';
import { expect, test } from '../../fixtures';
/**
* 全量用例:与 testcase/期初管理-期初明细查询-UI自动化测试用例-01.csv 严格一致
* 运行:npm run test:open-detail:all
*/
test.describe('期初管理', () => {
test.describe('期初明细查询 · 快捷筛选查询', () => {
test('OPEN-DTL-001 快捷区重置恢复默认', { tag: '@smoke' }, async ({ openDetailPage }) => {
await openDetailPage.open();
await openDetailPage.fillQuickVisibleThenResetExpectDefaults();
});
});
test.describe('期初明细查询 · 高级筛选抽屉', () => {
test('OPEN-DTL-002 全量查询条件组合查询', async ({ openDetailPage }) => {
await openDetailPage.open();
const sample = await openDetailPage.searchWithQuickAndDrawerCombo(
openDetailComboQuickFields,
openDetailComboDrawerFields,
);
await openDetailPage.expectComboResultMatchesSample(sample, openDetailComboAssertKeys);
});
test('OPEN-DTL-003 点击高级筛选打开抽屉', async ({ openDetailPage }) => {
await openDetailPage.open();
await openDetailPage.openAdvancedFilterDrawer();
});
test('OPEN-DTL-004 抽屉内重置恢复默认', async ({ openDetailPage }) => {
await openDetailPage.open();
await openDetailPage.fillDrawerThenResetExpectDefaults();
});
});
test.describe('期初明细查询 · 列表', () => {
test('OPEN-DTL-005 列表核心列完整', async ({ openDetailPage }) => {
await openDetailPage.open();
await openDetailPage.assertConfiguredHeaders();
});
test('OPEN-DTL-006 列设置隐藏后再恢复', async ({ openDetailPage }) => {
await openDetailPage.open();
await openDetailPage.clickQuery();
await openDetailPage.executeColumnSettingsToggleRestoreTest();
});
test('OPEN-DTL-007 横向滚动与列对齐', async ({ openDetailPage }) => {
await openDetailPage.open();
await openDetailPage.expectHorizontalScrollAlignment();
});
test('OPEN-DTL-008 无匹配空态(mock反例)', async ({ openDetailPage }) => {
await openDetailPage.open();
await openDetailPage.searchByMockKeyword();
const snap = await openDetailPage.snapshotList();
expect(snap.rows === 0 || snap.emptyVisible, '无匹配应空态').toBeTruthy();
});
});
test.describe('期初明细查询 · 分页', () => {
test('OPEN-DTL-009 有数据时总条数', async ({ openDetailPage }) => {
await openDetailPage.open();
await openDetailPage.assertTotalWhenHasData();
});
test('OPEN-DTL-010 切换至第 2 页', async ({ openDetailPage }) => {
await openDetailPage.open();
await openDetailPage.goToPage2ForOpen();
});
test('OPEN-DTL-011 切换20条每页页面正常且列表同步', async ({ openDetailPage }) => {
await openDetailPage.open();
const { total, rowsBefore, rowsAfter } = await openDetailPage.switchToPageSizeTwenty();
const expectedRows = Math.min(total, 20);
expect(rowsAfter, '当前页行数应与 20 条/页及总条数一致').toBe(expectedRows);
if (total > 20) {
expect(rowsAfter, '切换后可见行应随每页条数变化').not.toBe(rowsBefore);
}
expect(await openDetailPage.getTotalCount(), '总条数应不变').toBe(total);
});
});
});
import { expect, test } from '../../fixtures';
/**
* 全量用例:与 testcase/期初管理-期初录入-UI自动化测试用例-01.csv 严格一致
* 运行:npm run test:open-entry:all
*/
test.describe('期初管理', () => {
test.describe('期初录入 · 快捷筛选查询', () => {
test('OPEN-ENT-001 快捷区重置恢复默认', { tag: '@smoke' }, async ({ openEntryPage }) => {
await openEntryPage.open();
await openEntryPage.clickResetQuick();
await openEntryPage.expectOnPage();
});
});
test.describe('期初录入 · 高级筛选抽屉', () => {
test('OPEN-ENT-002 全量查询条件组合查询', async ({ openEntryPage }) => {
test.skip(
true,
'组合查询须按页面配置 quickFields/drawerFields 实现 searchWithQuickAndDrawerCombo(对齐 center-report-sheet STAT-IOD-004),禁止临时启发式填表',
);
});
test('OPEN-ENT-003 点击高级筛选打开抽屉', async ({ openEntryPage }) => {
await openEntryPage.open();
await openEntryPage.openAdvancedFilterDrawer();
});
});
test.describe('期初录入 · 列表', () => {
test('OPEN-ENT-004 列表核心列完整', async ({ openEntryPage }) => {
await openEntryPage.open();
await openEntryPage.assertConfiguredHeaders();
});
test('OPEN-ENT-008 列设置隐藏后再恢复', async ({ openEntryPage }) => {
await openEntryPage.open();
await openEntryPage.clickQuery();
await openEntryPage.executeColumnSettingsToggleRestoreTest();
});
test('OPEN-ENT-009 横向滚动与列对齐', async ({ openEntryPage }) => {
await openEntryPage.open();
await openEntryPage.expectHorizontalScrollAlignment();
});
test('OPEN-ENT-010 无匹配空态(mock反例)', async ({ openEntryPage }) => {
await openEntryPage.open();
await openEntryPage.searchByMockKeyword();
const snap = await openEntryPage.snapshotList();
expect(snap.rows === 0 || snap.emptyVisible, '无匹配应空态').toBeTruthy();
});
});
test.describe('期初录入 · 行内操作', () => {
test('OPEN-ENT-005 行内「录入」可达(只读冒烟)', async ({ openEntryPage }) => {
await openEntryPage.open();
await openEntryPage.rowActionSmoke('录入');
});
test('OPEN-ENT-006 行内「删除」可达(只读冒烟)', async ({ openEntryPage }) => {
await openEntryPage.open();
await openEntryPage.rowActionSmoke('删除');
});
test('OPEN-ENT-007 行内「查看详情」可达(只读冒烟)', async ({ openEntryPage }) => {
await openEntryPage.open();
await openEntryPage.rowActionSmoke('查看详情');
});
});
test.describe('期初录入 · 分页', () => {
test('OPEN-ENT-011 有数据时总条数', async ({ openEntryPage }) => {
await openEntryPage.open();
await openEntryPage.assertTotalWhenHasData();
});
test('OPEN-ENT-012 切换至第 2 页', async ({ openEntryPage }) => {
await openEntryPage.open();
await openEntryPage.goToPage2ForOpen();
});
test('OPEN-ENT-013 切换20条每页页面正常且列表同步', async ({ openEntryPage }) => {
await openEntryPage.open();
const { total, rowsBefore, rowsAfter } = await openEntryPage.switchToPageSizeTwenty();
const expectedRows = Math.min(total, 20);
expect(rowsAfter, '当前页行数应与 20 条/页及总条数一致').toBe(expectedRows);
if (total > 20) {
expect(rowsAfter, '切换后可见行应随每页条数变化').not.toBe(rowsBefore);
}
expect(await openEntryPage.getTotalCount(), '总条数应不变').toBe(total);
});
});
test.describe('期初录入 · 单据状态与行操作', () => {
test('OPEN-ENT-014 待生成行操作匹配', async ({ openEntryPage }) => {
await openEntryPage.open();
await openEntryPage.assertPendingRowOps();
});
test('OPEN-ENT-015 已生成行操作匹配', async ({ openEntryPage }) => {
await openEntryPage.open();
await openEntryPage.assertGeneratedRowOps();
});
});
test.describe('期初录入 · 新增', () => {
test('OPEN-ENT-016 打开「新增」对应弹窗/抽屉', async ({ openEntryPage }) => {
await openEntryPage.open();
await openEntryPage.openToolbarOverlay('新增');
await openEntryPage.closeLayer();
});
test('OPEN-ENT-017 「新增」取消不落库', async ({ openEntryPage }) => {
await openEntryPage.open();
await openEntryPage.cancelToolbarWithoutCommit('新增');
});
test('OPEN-ENT-018 「新增」必填为空拦截', async ({ openEntryPage }) => {
await openEntryPage.open();
await openEntryPage.assertRequiredInterceptFor('新增');
});
});
/**
* 019/020 串行联动:
* - 019 负责新增并产出期初单号
* - 020 只删除 019 产出的期初单,跳过自行新增
* - 若 019 未成功(无单号),020 整例 skip 不执行
*
* 说明:原文「019 成功则跳过 020」与「删除 019 生成的单」冲突;
* 落地为「019 未成功则跳过 020;019 成功则 020 直接删该单、不重做新增」。
*/
test.describe.serial('期初录入 · 新增与删除联动', () => {
let orderNoFrom019 = '';
test('OPEN-ENT-019 新增选择库房库区耗材类型并勾选后确定成功', async ({ openEntryPage }) => {
await openEntryPage.open();
const result = await openEntryPage.createAddSelectWarehouseAreaTypeConfirmSuccess();
expect(result.warehouse.length, '应选中库房').toBeGreaterThan(0);
expect(result.area.length, '应选中库区').toBeGreaterThan(0);
expect(result.purType.length, '应选中耗材类型').toBeGreaterThan(0);
expect(result.orderNo, '应带回新增期初单号且与主列表一致').toMatch(/^QC\d+/);
orderNoFrom019 = result.orderNo;
});
test('OPEN-ENT-020 针对新增待生成单据删除成功', async ({ openEntryPage }) => {
test.skip(
!orderNoFrom019,
'OPEN-ENT-019 未执行成功(无期初单号),跳过 OPEN-ENT-020,不执行删除',
);
await openEntryPage.open();
await openEntryPage.deletePendingOrderByNo(orderNoFrom019);
});
});
});
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment