Commit 2d26844c authored by liguangyu06's avatar liguangyu06
Browse files

同步基础管理/报表用例与登录态稳定性修复

修复 auth 写入锁 stale PID 导致 setup 空等超时;主辅账号 setup 串行并延长超时,login 依赖 setup。同步用户/厂商/准入等 CSV·MD·spec·PO,移除 stat 调试 spec,补充离线全量脚本与 gate-stamp 目录哈希修复。
parent 45178f79
......@@ -6,6 +6,8 @@
**元素扫描**:`data/scan/vendor-cert-first-elements.json`(40 项)
**定位器**:`locators/spd/vendor-cert-first.locator.yaml`
**本次生成范围**:见本文件既有功能域(历史生成,无独立 `testpoint/scope` 文件);本次按 ui-test-point-rules 补齐文档头与质量自检,不扩大范围
---
## 基础设置 · 厂商管理 · 注册证变更初审
......@@ -63,7 +65,12 @@
## 质量自检摘要
- 覆盖:页面访问、筛选/Tab、列表分页、关键写操作或详情、权限与登录异常、同模块衔接。
- 颗粒度:一条测试点只验证一件独立事;优先级已标高/中/低。
- 待评审项:审批通过/驳回写操作是否自动化(建议只读详情冒烟);注册证差异对比 iframe 断言策略。
- 下游:可转结构化 MD/CSV;自动化需先补 Page Object(`pages/spd/vendor-cert-first.page.ts`)。
| 项 | 结论 |
|----|------|
| 范围 | 在范围内:页面访问与导航、注册证变更列表与详情。明确排除:断网/弱网、视觉像素、导出文件内容校验(未在本文件展开)。未声称需求 100% 全覆盖。 |
| 覆盖 | 已写功能域:页面访问与导航、注册证变更列表与详情;共 **19** 条原子测试点(未声称全覆盖) |
| 分类 | 功能 / 边界 / 异常 / 集成四类均已按功能点拆分 |
| 去重 | 登录拦截、会话过期与同模块其它厂商管理页规则相同,本页仅保留菜单/URL/字段差异;编号前缀 `TP_VENDOR_CF1` |
| 待评审项 | ① 审批通过/驳回写操作是否纳入自动化(建议只读详情冒烟) ② 初审可操作角色范围 |
| 报表能力 | 非统计报表 iframe 页,不适用第四节能力清单;本页为整页渲染,无报表 iframe |
| 下游 | 已落地 CSV/MD 与 Playwright:`tests/spd/vendor-audit.spec.ts` + `pages/spd/vendor-cert-first.page.ts` |
......@@ -6,6 +6,8 @@
**元素扫描**:`data/scan/vendor-cert-final-elements.json`(40 项)
**定位器**:`locators/spd/vendor-cert-final.locator.yaml`
**本次生成范围**:见本文件既有功能域(历史生成,无独立 `testpoint/scope` 文件);本次按 ui-test-point-rules 补齐文档头与质量自检,不扩大范围
---
## 基础设置 · 厂商管理 · 注册证变更终审
......@@ -63,7 +65,12 @@
## 质量自检摘要
- 覆盖:页面访问、筛选/Tab、列表分页、关键写操作或详情、权限与登录异常、同模块衔接。
- 颗粒度:一条测试点只验证一件独立事;优先级已标高/中/低。
- 待评审项:审批通过/驳回写操作是否自动化(建议只读详情冒烟);注册证差异对比 iframe 断言策略。
- 下游:可转结构化 MD/CSV;自动化需先补 Page Object(`pages/spd/vendor-cert-final.page.ts`)。
| 项 | 结论 |
|----|------|
| 范围 | 在范围内:页面访问与导航、注册证变更列表与详情。明确排除:断网/弱网、视觉像素、导出文件内容校验(未在本文件展开)。未声称需求 100% 全覆盖。 |
| 覆盖 | 已写功能域:页面访问与导航、注册证变更列表与详情;共 **19** 条原子测试点(未声称全覆盖) |
| 分类 | 功能 / 边界 / 异常 / 集成四类均已按功能点拆分 |
| 去重 | 登录拦截、会话过期与同模块其它厂商管理页规则相同,本页仅保留菜单/URL/字段差异;编号前缀 `TP_VENDOR_CF2` |
| 待评审项 | ① 审批通过/驳回写操作是否纳入自动化(建议只读详情冒烟) ② 终审可操作角色范围 |
| 报表能力 | 非统计报表 iframe 页,不适用第四节能力清单;本页为整页渲染,无报表 iframe |
| 下游 | 已落地 CSV/MD 与 Playwright:`tests/spd/vendor-audit.spec.ts` + `pages/spd/vendor-cert-final.page.ts` |
......@@ -6,6 +6,8 @@
**元素扫描**:`data/scan/vendor-cert-diff-elements.json`(54 项)
**定位器**:`locators/spd/vendor-cert-diff.locator.yaml`
**本次生成范围**:见本文件既有功能域(历史生成,无独立 `testpoint/scope` 文件);本次按 ui-test-point-rules 补齐文档头与质量自检,不扩大范围
---
## 基础设置 · 厂商管理 · 注册证差异对比
......@@ -66,7 +68,12 @@
## 质量自检摘要
- 覆盖:页面访问、筛选/Tab、列表分页、关键写操作或详情、权限与登录异常、同模块衔接。
- 颗粒度:一条测试点只验证一件独立事;优先级已标高/中/低。
- 待评审项:审批通过/驳回写操作是否自动化(建议只读详情冒烟);注册证差异对比 iframe 断言策略。
- 下游:可转结构化 MD/CSV;自动化需先补 Page Object(`pages/spd/vendor-cert-diff.page.ts`)。
| 项 | 结论 |
|----|------|
| 范围 | 在范围内:页面访问与导航、差异筛选与对比结果。明确排除:断网/弱网、视觉像素、导出文件内容校验(未在本文件展开)。未声称需求 100% 全覆盖。 |
| 覆盖 | 已写功能域:页面访问与导航、差异筛选与对比结果;共 **22** 条原子测试点(未声称全覆盖) |
| 分类 | 功能 / 边界 / 异常 / 集成四类均已按功能点拆分 |
| 去重 | 登录拦截、会话过期与同模块其它厂商管理页规则相同,本页仅保留菜单/URL/字段差异;编号前缀 `TP_VENDOR_CDF` |
| 待评审项 | ① 内嵌/iframe 对比页加载失败时外壳是否假成功 ② 立即更新后列表刷新时效 ③ 导出是否含当前 Tab |
| 报表能力 | 非统计报表页,不适用第四节报表能力清单;本页含内嵌/iframe 对比区,导航与内嵌加载失败须分开断言 |
| 下游 | 已落地 CSV/MD 与 Playwright:`tests/spd/vendor-cert-diff.spec.ts` + `pages/spd/vendor-cert-diff.page.ts` |
......@@ -6,6 +6,8 @@
**元素扫描**:`data/scan/vendor-eval-indicator-elements.json`(151 项)
**定位器**:`locators/spd/vendor-eval-indicator.locator.yaml`
**本次生成范围**:见本文件既有功能域(历史生成,无独立 `testpoint/scope` 文件);本次按 ui-test-point-rules 补齐文档头与质量自检,不扩大范围
---
## 基础设置 · 厂商管理 · 评价指标维护
......@@ -64,7 +66,12 @@
## 质量自检摘要
- 覆盖:页面访问、筛选/Tab、列表分页、关键写操作或详情、权限与登录异常、同模块衔接。
- 颗粒度:一条测试点只验证一件独立事;优先级已标高/中/低。
- 待评审项:审批通过/驳回写操作是否自动化(建议只读详情冒烟);注册证差异对比 iframe 断言策略。
- 下游:可转结构化 MD/CSV;自动化需先补 Page Object(`pages/spd/vendor-eval-indicator.page.ts`)。
| 项 | 结论 |
|----|------|
| 范围 | 在范围内:页面访问与导航、指标分类树与指标列表。明确排除:断网/弱网、视觉像素、导出文件内容校验(未在本文件展开)。未声称需求 100% 全覆盖。 |
| 覆盖 | 已写功能域:页面访问与导航、指标分类树与指标列表;共 **20** 条原子测试点(未声称全覆盖) |
| 分类 | 功能 / 边界 / 异常 / 集成四类均已按功能点拆分 |
| 去重 | 登录拦截、会话过期与同模块其它厂商管理页规则相同,本页仅保留菜单/URL/字段差异;编号前缀 `TP_VENDOR_EVI` |
| 待评审项 | ① 分类树搜索是即时过滤还是回车 ② 停用指标是否允许被方案继续引用 |
| 报表能力 | 非统计报表 iframe 页,不适用第四节能力清单;本页为整页渲染,无报表 iframe |
| 下游 | 已落地 CSV/MD 与 Playwright:`tests/spd/vendor-eval-indicator.spec.ts` + `pages/spd/vendor-eval-indicator.page.ts` |
......@@ -6,6 +6,8 @@
**元素扫描**:`data/scan/vendor-eval-scheme-elements.json`(57 项)
**定位器**:`locators/spd/vendor-eval-scheme.locator.yaml`
**本次生成范围**:见本文件既有功能域(历史生成,无独立 `testpoint/scope` 文件);本次按 ui-test-point-rules 补齐文档头与质量自检,不扩大范围
---
## 基础设置 · 厂商管理 · 评价方案维护
......@@ -62,7 +64,12 @@
## 质量自检摘要
- 覆盖:页面访问、筛选/Tab、列表分页、关键写操作或详情、权限与登录异常、同模块衔接。
- 颗粒度:一条测试点只验证一件独立事;优先级已标高/中/低。
- 待评审项:审批通过/驳回写操作是否自动化(建议只读详情冒烟);注册证差异对比 iframe 断言策略。
- 下游:可转结构化 MD/CSV;自动化需先补 Page Object(`pages/spd/vendor-eval-scheme.page.ts`)。
| 项 | 结论 |
|----|------|
| 范围 | 在范围内:页面访问与导航、方案筛选与维护。明确排除:断网/弱网、视觉像素、导出文件内容校验(未在本文件展开)。未声称需求 100% 全覆盖。 |
| 覆盖 | 已写功能域:页面访问与导航、方案筛选与维护;共 **18** 条原子测试点(未声称全覆盖) |
| 分类 | 功能 / 边界 / 异常 / 集成四类均已按功能点拆分 |
| 去重 | 登录拦截、会话过期与同模块其它厂商管理页规则相同,本页仅保留菜单/URL/字段差异;编号前缀 `TP_VENDOR_EVS` |
| 待评审项 | ① 方案引用已停用指标时的拦截规则 ② 删除方案是否二次确认 |
| 报表能力 | 非统计报表 iframe 页,不适用第四节能力清单;本页为整页渲染,无报表 iframe |
| 下游 | 已落地 CSV/MD 与 Playwright:`tests/spd/vendor-eval-scheme.spec.ts` + `pages/spd/vendor-eval-scheme.page.ts` |
......@@ -6,6 +6,8 @@
**元素扫描**:`data/scan/warehouse-zone-elements.json`(106 项)
**定位器**:`locators/spd/warehouse-zone.locator.yaml`
**本次生成范围**:见本文件既有功能域(历史生成,无独立 `testpoint/scope` 文件);本次按 ui-test-point-rules 补齐文档头与质量自检,不扩大范围
---
## 基础设置 · 库房管理 · 库区设置
......@@ -249,9 +251,10 @@
| 项 | 结论 |
|----|------|
| 范围 | 在范围内:页面访问与导航、左侧库房树、右侧库区列表与分页、库区搜索、新增库区、编辑库区、停用与启用、人员管理、货位管理、同步库房信息。明确排除:断网/弱网、视觉像素、导出文件内容校验(未在本文件展开)。未声称需求 100% 全覆盖。 |
| 覆盖 | 已覆盖:导航、库房树过滤/切换、库区列表分页、库区搜索、新增/编辑弹窗、停用启用、人员/货位入口、同步;共 **74** 条原子测试点(未声称全覆盖,断网类与仓库其它基础管理页同样省略) |
| 分类 | 功能 / 边界 / 异常 / 集成四类均已按功能点拆分;无某类时保留标题并说明 |
| 去重 | 登录拦截、会话过期与同模块其它页规则相同,本页仅保留菜单/URL/字段差异;编号前缀 `TP_WH_ZON` |
| 待评审项 | ① 人员管理/货位管理扫描未打开面板,入口以行内按钮为准,子页字段待补扫 ② 默认库区如何指定(编辑字段或单独接口)以现网为准 ③ 停用默认库区是否允许待产品确认 ④ 新增弹窗扫描未见「是否专项库区」控件,列表有该列,编辑是否可改为待评审 |
| 报表能力 | 非统计报表 iframe 页,不适用第四节能力清单;本页为整页渲染,无报表 iframe |
| 下游 | 可转结构化 MD/CSV;扫描 `npm run discover:scan-warehouse`;自动化建议 `pages/spd/warehouse-zone.page.ts` |
......@@ -6,6 +6,8 @@
**元素扫描**:`data/scan/warehouse-probe-elements.json`(78 项)
**定位器**:`locators/spd/warehouse-probe.locator.yaml`
**本次生成范围**:见本文件既有功能域(历史生成,无独立 `testpoint/scope` 文件);本次按 ui-test-point-rules 补齐文档头与质量自检,不扩大范围
---
## 基础设置 · 库房管理 · 探针绑定
......@@ -160,9 +162,10 @@
| 项 | 结论 |
|----|------|
| 范围 | 在范围内:页面访问与导航、筛选与查询、列表与分页、打开绑定货位弹窗、弹窗筛选货位、勾选货位并保存绑定。明确排除:断网/弱网、视觉像素、导出文件内容校验(未在本文件展开)。未声称需求 100% 全覆盖。 |
| 覆盖 | 已覆盖:导航、探针筛选查询、列表数量规则、绑定弹窗筛选分页、勾选确定/取消、与库区货位集成;共 **49** 条原子测试点(未声称全覆盖,断网类与仓库其它基础管理页同样省略) |
| 分类 | 功能 / 边界 / 异常 / 集成四类均已按功能点拆分;无某类时保留标题并说明 |
| 去重 | 登录拦截、会话过期与同模块其它页规则相同,本页仅保留菜单/URL/字段差异;编号前缀 `TP_WH_PRB` |
| 待评审项 | ① 同一货位已有其它探针ID时是换绑还是拒绝,以保存后主列表数量与弹窗探针ID列为准 ② 确定按钮文案为「确定(N)」,未选为 0 ③ 主表无新增探针入口,探针主数据来源不在本页维护 |
| 报表能力 | 非统计报表 iframe 页,不适用第四节能力清单;本页为整页渲染,无报表 iframe |
| 下游 | 可转结构化 MD/CSV;扫描 `npm run discover:scan-warehouse`;自动化建议 `pages/spd/warehouse-probe.page.ts` |
......@@ -6,6 +6,8 @@
**元素扫描**:`data/scan/surgery-base-pkg-elements.json`(87 项)
**定位器**:`locators/spd/surgery-base-pkg.locator.yaml`
**本次生成范围**:见本文件既有功能域(历史生成,无独立 `testpoint/scope` 文件);本次按 ui-test-point-rules 补齐文档头与质量自检,不扩大范围
---
## 基础设置 · 手术套包设置 · 基础包维护
......@@ -140,8 +142,10 @@
| 项 | 结论 |
|----|------|
| 范围 | 在范围内:页面访问与导航、左侧分类树、右侧筛选与列表、新增基础包、行内操作(编辑 / 移除)。明确排除:断网/弱网、视觉像素、导出文件内容校验(未在本文件展开)。未声称需求 100% 全覆盖。 |
| 覆盖 | 已覆盖:左侧分类树(搜索/选择/新增分类)、右侧筛选(产品名称/产品编号/规格型号/器械注册人/耗材类型)、列表列、分页、新增基础包弹窗、行内编辑/移除;共 **46** 条原子测试点 |
| 分类 | 功能 / 边界 / 异常 / 集成四类均已按功能点拆分 |
| 去重 | 登录/权限与同模块其它页共用规则,本页强调分类树联动与基础包 CRUD;编号前缀 `TP_SURG_BASE` |
| 待评审项 | ① 分类搜索是即时过滤还是回车 ② 包编码是否唯一约束 ③「移除」是否二次确认 ④ 被标准套包引用时能否移除 |
| 报表能力 | 非统计报表 iframe 页,不适用第四节能力清单;本页为整页渲染,无报表 iframe |
| 下游 | 可生成 MD/CSV 与 Playwright;扫描 `npm run discover:scan-surgery` |
......@@ -6,6 +6,8 @@
**元素扫描**:`data/scan/surgery-oper-type-elements.json`(69 项)
**定位器**:`locators/spd/surgery-oper-type.locator.yaml`
**本次生成范围**:见本文件既有功能域(历史生成,无独立 `testpoint/scope` 文件);本次按 ui-test-point-rules 补齐文档头与质量自检,不扩大范围
---
## 基础设置 · 手术套包设置 · 术种维护
......@@ -163,8 +165,10 @@
| 项 | 结论 |
|----|------|
| 范围 | 在范围内:页面访问与导航、左侧术种分类树、右侧筛选与状态 Tab、术种列表与编码展示、新增术种、行内操作(编辑 / 停用)。明确排除:断网/弱网、视觉像素、导出文件内容校验(未在本文件展开)。未声称需求 100% 全覆盖。 |
| 覆盖 | 已覆盖:导航、左侧分类树(搜索/下钻/新增分类维护)、筛选(术种名称/病种名称)、状态 Tab(全部/停用/未建分类)、ICD-10/ICD-9-CM-3 列展示、分页、新增术种、行内编辑/停用/启用;共 **53** 条原子测试点 |
| 分类 | 功能 / 边界 / 异常 / 集成四类均已按功能点拆分 |
| 去重 | 登录/权限与同模块其它页共用规则,本页强调状态 Tab 计数守恒与 ICD 编码展示;编号前缀 `TP_SURG_TYPE` |
| 待评审项 | ① 分类搜索是即时过滤还是回车 ②「停用」是否需确认框 ③ 停用后 Tab 计数与「全部」的口径 ④ 被套包引用时停用策略 |
| 报表能力 | 非统计报表 iframe 页,不适用第四节能力清单;本页为整页渲染,无报表 iframe |
| 下游 | 可生成 MD/CSV 与 Playwright;扫描 `npm run discover:scan-surgery` |
......@@ -6,6 +6,8 @@
**元素扫描**:`data/scan/surgery-std-pkg-elements.json`(61 项)
**定位器**:`locators/spd/surgery-std-pkg.locator.yaml`
**本次生成范围**:见本文件既有功能域(历史生成,无独立 `testpoint/scope` 文件);本次按 ui-test-point-rules 补齐文档头与质量自检,不扩大范围
---
## 基础设置 · 手术套包设置 · 标准套包维护
......@@ -167,8 +169,10 @@
| 项 | 结论 |
|----|------|
| 范围 | 在范围内:页面访问与导航、左侧术种分类树、右侧筛选与构成列表、添加基础包弹窗、添加散件弹窗、行内操作(编辑 / 移除)。明确排除:断网/弱网、视觉像素、导出文件内容校验(未在本文件展开)。未声称需求 100% 全覆盖。 |
| 覆盖 | 已覆盖:导航、左侧术种分类树(搜索/未建分类)、筛选(产品名称/规格型号/器械注册人/耗材类型)、构成列表分组展开、分页、添加基础包弹窗、添加散件弹窗(产品列表 + 规格/应拣明细)、行内编辑/移除;共 **57** 条原子测试点 |
| 分类 | 功能 / 边界 / 异常 / 集成四类均已按功能点拆分 |
| 去重 | 登录/权限与同模块其它页共用规则,本页强调嵌套弹窗计数一致与万级数据性能;编号前缀 `TP_SURG_STD` |
| 待评审项 | ① 重复添加同一基础包/散件的合并策略 ② 耗材品种数/耗材总数的精确口径 ③ 移除是否二次确认 ④ 万级散件列表是否支持全量选择 |
| 报表能力 | 非统计报表 iframe 页,不适用第四节能力清单;本页为整页渲染,无报表 iframe |
| 下游 | 可生成 MD/CSV 与 Playwright;扫描 `npm run discover:scan-surgery` |
......@@ -6,6 +6,8 @@
**元素扫描**:`data/scan/flow-inst-elements.json`(62 项)
**定位器**:`locators/spd/flow-inst.locator.yaml`
**本次生成范围**:见本文件既有功能域(历史生成,无独立 `testpoint/scope` 文件);本次按 ui-test-point-rules 补齐文档头与质量自检,不扩大范围
---
## 基础设置 · 流程设置 · 审批流实例
......@@ -120,9 +122,10 @@
| 项 | 结论 |
|----|------|
| 范围 | 在范围内:页面访问与导航、筛选与查询、列表与分页、审批详情。明确排除:断网/弱网、视觉像素、导出文件内容校验(未在本文件展开)。未声称需求 100% 全覆盖。 |
| 覆盖 | 已覆盖:导航、单据编号/状态/类型/时间/摘要筛选、列表列与前缀规则、分页、只读详情、与流程设置类型同源;共 **41** 条原子测试点(未声称全覆盖,断网类与仓库其它基础管理页同样省略) |
| 分类 | 功能 / 边界 / 异常 / 集成四类均已按功能点拆分;无某类时保留标题并说明 |
| 去重 | 登录拦截、会话过期与同模块其它页规则相同,本页仅保留菜单/URL/字段差异;编号前缀 `TP_FLOW_INS` |
| 待评审项 | ① 默认发起时间跨度大,断言「共 N 条」须先收窄日期 ② 本页无新增/导出/改审批人;写配置只在审批流程设置 ③ 详情扫描打开「采购计划详情」,其它业务类型详情标题以现网为准 |
| 报表能力 | 非统计报表 iframe 页,不适用第四节能力清单;本页为整页渲染,无报表 iframe |
| 下游 | 可转结构化 MD/CSV;扫描 `npm run discover:scan-flow`;自动化建议 `pages/spd/flow-inst.page.ts` |
......@@ -6,6 +6,8 @@
**元素扫描**:`data/scan/flow-def-elements.json`(43 项)
**定位器**:`locators/spd/flow-def.locator.yaml`
**本次生成范围**:见本文件既有功能域(历史生成,无独立 `testpoint/scope` 文件);本次按 ui-test-point-rules 补齐文档头与质量自检,不扩大范围
---
## 基础设置 · 流程设置 · 审批流程设置
......@@ -152,9 +154,10 @@
| 项 | 结论 |
|----|------|
| 范围 | 在范围内:页面访问与导航、左侧业务类型、默认审批流、自定义审批流、条件配置、保存与重置。明确排除:断网/弱网、视觉像素、导出文件内容校验(未在本文件展开)。未声称需求 100% 全覆盖。 |
| 覆盖 | 已覆盖:导航、业务类型过滤/切换、默认审批流、自定义流增删、条件配置、保存重置、与审批流实例类型同源;共 **41** 条原子测试点(未声称全覆盖,断网类与仓库其它基础管理页同样省略) |
| 分类 | 功能 / 边界 / 异常 / 集成四类均已按功能点拆分;无某类时保留标题并说明 |
| 去重 | 登录拦截、会话过期与同模块其它页规则相同,本页仅保留菜单/URL/字段差异;编号前缀 `TP_FLOW_DEF` |
| 待评审项 | ① 保存会改线上审批路由,自动化冒烟只读结构、不提交 ② 未保存切类型按「提示后丢弃、不串写」写点,若自动保存需改判定 ③ 历史已通过实例是否快照冻结待产品确认 |
| 报表能力 | 非统计报表 iframe 页,不适用第四节能力清单;本页为整页渲染,无报表 iframe |
| 下游 | 可转结构化 MD/CSV;扫描 `npm run discover:scan-flow`;自动化建议 `pages/spd/flow-def.page.ts` |
......@@ -6,6 +6,8 @@
**元素扫描**:`data/scan/basic-user-union-elements.json`(221 项)
**定位器**:`locators/spd/basic-user-union.locator.yaml`
**本次生成范围**:见本文件既有功能域(历史生成,无独立 `testpoint/scope` 文件);本次按 ui-test-point-rules 补齐文档头与质量自检,不扩大范围
---
## 基础设置 · 用户管理 · 医共体用户管理
......@@ -42,7 +44,7 @@
- **TP_USER_UNI_010**(高)|姓名/登录账号关键字|验证要点:「姓名」框(占位「姓名、登录账号」)输入后结果姓名或账号匹配|关联需求:UI-SPEC-SPD-USER-002
- **TP_USER_UNI_011**(高)|所属医院筛选|验证要点:切换「所属医院」后列表仅该院用户,「共 N 条」同步变化|关联需求:UI-SPEC-SPD-USER-002
- **TP_USER_UNI_012**(高)|联系方式筛选|验证要点:按「联系方式」关键字查询,结果联系方式匹配|关联需求:UI-SPEC-SPD-USER-002
- **TP_USER_UNI_013**(高)|姓名+医院+科室+角色+状态组合查询|验证要点:多条件同时生效,结果同时满足;含所属医院维度(自动化 `USER-UNI-006`)|关联需求:UI-SPEC-SPD-USER-002
- **TP_USER_UNI_013**(高)|姓名、所属医院、联系方式、科室、角色等条件组合查询|验证要点:多条件同时生效,结果同时满足;含所属医院与联系方式维度(自动化 `USER-UNI-002`)|关联需求:UI-SPEC-SPD-USER-002
- **TP_USER_UNI_014**(中)|重置恢复默认|验证要点:点「重置」后医院等条件恢复默认(含默认医院),列表刷新|关联需求:UI-SPEC-SPD-USER-002
- **TP_USER_UNI_015**(中)|展开高级筛选|验证要点:点「高级筛选」展开后可见所属医院、联系方式、科室、角色及「筛选」|关联需求:UI-SPEC-SPD-USER-002
- **TP_USER_UNI_016**(中)|高级筛选按科室过滤|验证要点:高级筛选选择科室后点「筛选」,列表「所属科室」与所选一致|关联需求:UI-SPEC-SPD-USER-002
......@@ -72,8 +74,10 @@
- **TP_USER_UNI_024**(高)|列表核心列完整且顺序正确|验证要点:列顺序为登录账号、姓名、联系方式、所属医院、所属科室、医院员工编号、角色、科室任职数、操作(编辑/授权/重置密码);勿用用户管理页列断言|关联需求:UI-SPEC-SPD-USER-002
- **TP_USER_UNI_025**(中)|登录账号列截断|验证要点:长账号在列宽内截断;按账号搜索/断言用筛选框而非截断后的单元格文本|关联需求:UI-SPEC-SPD-USER-002
- **TP_USER_UNI_026**(中)|分页翻页|验证要点:总条数大于一页时可翻至第 2 页,数据更换且页码高亮正确|关联需求:UI-SPEC-SPD-USER-002
- **TP_USER_UNI_027**(中)|每页条数切换|验证要点:切换「20 条/页」等后当前页行数为 min(N,所选值),总数不变(自动化 `USER-UNI-018`)|关联需求:UI-SPEC-SPD-USER-002
- **TP_USER_UNI_027**(中)|每页条数切换|验证要点:切换「20 条/页」等后当前页行数为 min(N,所选值),总数不变(自动化 `USER-UNI-014`)|关联需求:UI-SPEC-SPD-USER-002
- **TP_USER_UNI_028**(中)|跳至指定页|验证要点:分页「跳至」输入合法页码后跳到对应页|关联需求:UI-SPEC-SPD-USER-002
- **TP_USER_UNI_059**(低)|打开列设置面板|验证要点:列设置齿轮可打开,含列展示/字段设置/重置;关闭后面板消失、列表仍在|关联需求:UI-SPEC-SPD-USER-002
- **TP_USER_UNI_060**(低)|列设置隐藏后再恢复|验证要点:取消勾选非核心列后表头隐藏,再勾选恢复;勾选状态与表头一致(一对多:CSV `USER-UNI-015`/`016`)|关联需求:UI-SPEC-SPD-USER-002
#### 边界验证点
......@@ -103,7 +107,7 @@
- **TP_USER_UNI_039**(高)|打开编辑并回填|验证要点:行内「编辑」打开「编辑用户」,回填与列表行一致|关联需求:UI-SPEC-SPD-USER-002
- **TP_USER_UNI_040**(高)|修改后确定落库|验证要点:修改后确定,本页列表与再次编辑回看均为新值|关联需求:UI-SPEC-SPD-USER-002
- **TP_USER_UNI_041**(中)|编辑取消不保存|验证要点:修改后点取消,列表与再次打开仍为修改前值|关联需求:UI-SPEC-SPD-USER-002
- **TP_USER_UNI_042**(中)|启用禁用规则同用户管理|验证要点:编辑弹窗启用/禁用后,按状态筛选能命中;禁用登录受限同 TP_USER_USR|关联需求:UI-SPEC-SPD-USER-002
- **TP_USER_UNI_042**(中)|启用禁用规则同用户管理|验证要点:编辑弹窗可见启用/禁用;保存后仍能按姓名/账号查到该用户;禁用登录受限同 TP_USER_USR。扫描未见高级筛选「状态」字段,不按状态筛选写点|关联需求:UI-SPEC-SPD-USER-002
- **TP_USER_UNI_043**(中)|签名规则同用户管理|验证要点:编辑弹窗签名上传/展示规则同 TP_USER_USR,本页不重复展开|关联需求:UI-SPEC-SPD-USER-002
- **TP_USER_UNI_044**(中)|Excel 导入入口可达|验证要点:「Excel导入」可打开导入流程|关联需求:UI-SPEC-SPD-USER-002
......@@ -128,7 +132,7 @@
#### 功能验证点
- **TP_USER_UNI_051**(高)|行内授权可打开|验证要点:点「授权」打开用户角色授权弹框;弹框账号与所选行一致;弹框内「添加/移除」可增删角色行;取消不落库(自动化 `USER-UNI-021`~`023`,规则同 TP_USER_USR)|关联需求:UI-SPEC-SPD-USER-002
- **TP_USER_UNI_051**(高)|行内授权可打开|验证要点:点「授权」打开用户角色授权弹框;弹框账号与所选行一致;弹框内「添加/移除」可增删角色行;取消不落库(自动化 `USER-UNI-017`~`019`,规则同 TP_USER_USR)|关联需求:UI-SPEC-SPD-USER-002
- **TP_USER_UNI_052**(高)|行内重置密码可执行|验证要点:点「重置密码」可完成改密;改密后登录规则同 TP_USER_USR|关联需求:UI-SPEC-SPD-USER-002
#### 边界验证点
......@@ -153,9 +157,10 @@
| 项 | 结论 |
|----|------|
| 覆盖 | 已覆盖:导航、所属医院筛选、列顺序差异、跨院不覆盖/不串改;启用禁用/签名/任职/授权持久化引用 TP_USER_USR,本页不重复展开;共 **58** 条原子测试点(未声称全覆盖,断网类与仓库其它基础管理页同样省略) |
| 范围 | 在范围内:页面访问与导航、筛选与查询、列表与分页、新增与编辑、授权与重置密码。明确排除:断网/弱网、视觉像素、导出文件内容校验(未在本文件展开)。未声称需求 100% 全覆盖。 |
| 覆盖 | 已覆盖:导航、所属医院筛选、列顺序差异、跨院不覆盖/不串改、列设置;启用禁用/签名/任职/授权持久化引用 TP_USER_USR,本页不重复展开;共 **60** 条原子测试点(未声称全覆盖,断网类与仓库其它基础管理页同样省略) |
| 分类 | 功能 / 边界 / 异常 / 集成四类均已按功能点拆分;无某类时保留标题并说明 |
| 去重 | 登录拦截、会话过期与同模块其它用户管理页规则相同,本页仅保留菜单/URL/字段差异;编号前缀 `TP_USER_UNI` |
| 待评审项 | ① 新增/授权弹窗扫描未稳定打开,以现网为准 ② 跨院登录账号按拒绝且不覆盖写点,若产品允许共用需改判定 ③ 所属医院默认值与顶栏约定以现网为准 ④ 签名/启用禁用/任职明细/改密后登录同用户管理对应 TP,本页只保留医院维度 |
| 待评审项 | ① 新增/授权弹窗扫描未稳定打开,以现网为准 ② 跨院登录账号按拒绝且不覆盖写点,若产品允许共用需改判定 ③ 所属医院默认值与顶栏约定以现网为准 ④ 签名/启用禁用/任职明细/改密后登录同用户管理对应 TP,本页只保留医院维度 ⑤ UI-SPEC 测试关注点写了「状态」筛选,现网扫描仅在编辑弹窗有启用/禁用、无高级筛选「状态」;按扫描写点,自动化 `USER-UNI-013` 改为按科室过滤(TP_USER_UNI_016) |
| 报表能力 | 非统计报表 iframe 页,不适用第四节能力清单;本页为整页渲染,无报表 iframe |
| 下游 | 可转结构化 MD/CSV(`npm run generate:md-user`);扫描 `npm run discover:scan-user`;Playwright `tests/spd/basic-user-union.spec.ts` + `pages/spd/basic-user-union.page.ts` |
......@@ -6,6 +6,8 @@
**元素扫描**:`data/scan/basic-user-elements.json`(219 项)
**定位器**:`locators/spd/basic-user.locator.yaml`
**本次生成范围**:见本文件既有功能域(历史生成,无独立 `testpoint/scope` 文件);本次按 ui-test-point-rules 补齐文档头与质量自检,不扩大范围
---
## 基础设置 · 用户管理 · 用户管理
......@@ -79,6 +81,8 @@
- **TP_USER_USR_031**(中)|分页翻页|验证要点:总条数大于一页时可翻至第 2 页,数据更换且页码高亮正确|关联需求:UI-SPEC-SPD-USER-001
- **TP_USER_USR_032**(中)|每页条数切换|验证要点:切换「20 条/页」「50 条/页」等后当前页行数为 min(N,所选值) 且与切换前不同(当数据量足够时),总数不变;UI 自动化 `USER-USR-016` 覆盖切换 20 条/页|关联需求:UI-SPEC-SPD-USER-001
- **TP_USER_USR_033**(中)|跳至指定页|验证要点:分页「跳至」输入合法页码后跳到对应页|关联需求:UI-SPEC-SPD-USER-001
- **TP_USER_USR_083**(低)|打开列设置面板|验证要点:列设置齿轮可打开,含列展示/字段设置/重置;关闭后面板消失、列表仍在(自动化 `USER-USR-017`)|关联需求:UI-SPEC-SPD-USER-001
- **TP_USER_USR_084**(低)|列设置隐藏后再恢复|验证要点:取消勾选非核心列后表头隐藏,再勾选恢复;勾选状态与表头一致(自动化 `USER-USR-018`)|关联需求:UI-SPEC-SPD-USER-001
#### 边界验证点
......@@ -209,9 +213,10 @@
| 项 | 结论 |
|----|------|
| 覆盖 | 已覆盖:导航、筛选查询、列表分页、新增/编辑(含签名与启用禁用)、授权、重置密码、权限与登录异常、同模块衔接;共 **82** 条原子测试点(未声称全覆盖,断网类与仓库其它基础管理页同样省略) |
| 范围 | 在范围内:页面访问与导航、筛选与查询、列表与分页、新增用户、编辑用户、授权、重置密码。明确排除:断网/弱网、视觉像素、导出文件内容校验(未在本文件展开)。未声称需求 100% 全覆盖。 |
| 覆盖 | 已覆盖:导航、筛选查询、列表分页、列设置、新增/编辑(含签名与启用禁用)、授权、重置密码、权限与登录异常、同模块衔接;共 **84** 条原子测试点(未声称全覆盖,断网类与仓库其它基础管理页同样省略) |
| 分类 | 功能 / 边界 / 异常 / 集成四类均已按功能点拆分;无某类时保留标题并说明 |
| 去重 | 登录拦截、会话过期与同模块其它用户管理页规则相同,本页仅保留菜单/URL/字段差异;编号前缀 `TP_USER_USR` |
| 待评审项 | ① 新增弹窗扫描未稳定打开,字段以编辑弹窗与 UI-SPEC 为准 ② 授权层扫描未采集到,勾选控件以现网为准 ③ 编辑时登录账号按只读写点,若现网可改需改判定 ④ 空权限按允许保存写点,联系方式非法/签名非图片按拦截写点,禁用用户重置按允许且不启用写点 ⑤ UI-SPEC 截图未见「查询」,现网扫描有「查询」,测试点以扫描为准 ⑥ 列表序号可勾选但无批量工具栏,按无批量处理 |
| 报表能力 | 非统计报表 iframe 页,不适用第四节能力清单;本页为整页渲染,无报表 iframe |
| 下游 | 可转结构化 MD/CSV(`npm run generate:md-user`);扫描 `npm run discover:scan-user`;Playwright `tests/spd/basic-user.spec.ts` + `pages/spd/basic-user.page.ts`(含 `USER-USR-016` 每页 20 条) |
......@@ -6,6 +6,8 @@
**元素扫描**:`data/scan/basic-role-elements.json`(1170 项)
**定位器**:`locators/spd/basic-role.locator.yaml`
**本次生成范围**:见本文件既有功能域(历史生成,无独立 `testpoint/scope` 文件);本次按 ui-test-point-rules 补齐文档头与质量自检,不扩大范围
---
## 基础设置 · 用户管理 · 角色管理
......@@ -124,9 +126,10 @@
| 项 | 结论 |
|----|------|
| 范围 | 在范围内:页面访问与导航、左侧角色列表、右侧菜单权限树、角色增删改。明确排除:断网/弱网、视觉像素、导出文件内容校验(未在本文件展开)。未声称需求 100% 全覆盖。 |
| 覆盖 | 已覆盖:导航(左右分栏无分页)、左栏角色搜索、右栏权限树勾选联动/保存/未保存切角色、角色增删改与用户页下拉同步;共 **45** 条原子测试点(未声称全覆盖,断网类与仓库其它基础管理页同样省略) |
| 分类 | 功能 / 边界 / 异常 / 集成四类均已按功能点拆分;无某类时保留标题并说明 |
| 去重 | 登录拦截、会话过期与同模块其它用户管理页规则相同,本页仅保留菜单/URL/字段差异;编号前缀 `TP_USER_ROL` |
| 待评审项 | ① 预置角色按不可删除写点,以现网预置名单为准 ② 未保存切角色按「提示后丢弃、不静默写入」写点,若自动保存需改判定 ③ 本页无授权弹窗、无分页、无所属医院 |
| 报表能力 | 非统计报表 iframe 页,不适用第四节能力清单;本页为整页渲染,无报表 iframe |
| 下游 | UI 自动化 CSV **12** 条:`testcase/基础管理-用户管理-角色管理-UI自动化测试用例-01.csv`;MD `testcases/基础管理-用户管理-角色管理-UI自动化测试用例-01.md`;`tests/spd/basic-role.spec.ts`;`npm run test:basic-role:all`;扫描 `npm run discover:scan-user` |
import { test as setup } from '@playwright/test';
import { hasSecondaryCredentials } from '../../config/credentials.config';
import { ensureAuthStorageFresh } from '../../utils/auth-session';
/**
* 会话级登录态(只跑一次):登录成功后写入 auth/user.json。
* 业务 project(chromium)通过 use.storageState 加载该文件;
* 会话级登录态(只跑一次):登录成功后写入 auth/*.json。
* 业务 project 通过 storageState fixture 按 worker 加载对应文件;
* Playwright 仍为每条业务用例创建独立 BrowserContext,互不共享。
*/
setup.describe('auth setup', () => {
setup('保存登录态', async ({ browser }) => {
const result = await ensureAuthStorageFresh(browser, { honorForce: true });
setup.describe.configure({ mode: 'serial' });
setup('保存主账号登录态', async ({ browser }) => {
const result = await ensureAuthStorageFresh(browser, { honorForce: true, slot: 'primary' });
if (result === 'reused-fresh') {
setup.skip(true, '主账号登录态新鲜,跳过重复登录与探活');
return;
}
if (result === 'reused-probed') {
setup.skip(true, '主账号登录态有效,跳过重复登录');
}
});
setup('保存辅账号登录态', async ({ browser }) => {
if (!hasSecondaryCredentials()) {
setup.skip(true, '未配置 TEST_USER_2/TEST_PASS_2,跳过辅账号登录');
return;
}
const result = await ensureAuthStorageFresh(browser, { honorForce: true, slot: 'secondary' });
if (result === 'reused-fresh') {
setup.skip(true, '登录态新鲜,跳过重复登录与探活');
setup.skip(true, '辅账号登录态新鲜,跳过重复登录与探活');
return;
}
if (result === 'reused-probed') {
setup.skip(true, '登录态有效,跳过重复登录');
setup.skip(true, '辅账号登录态有效,跳过重复登录');
}
});
});
......@@ -6,59 +6,14 @@ import { assertHeaderOrder, assertListOrEmpty, assertMockEmpty } from './helpers
* 运行:npm run test:basic-user-union:all
*/
test.describe('基础设置 · 用户管理', () => {
test.describe('医共体用户管理 · 页面进入', () => {
test('USER-UNI-001 菜单进入医共体用户管理页', { tag: '@smoke' }, async ({ basicUserUnionPage }) => {
await basicUserUnionPage.openFromMenu();
expect(basicUserUnionPage.browserPage.url(), 'URL 应含医共体 path').toContain('/basic/user/platform/personCom');
expect(basicUserUnionPage.browserPage.url(), '不应进入角色管理').not.toContain('/platform/role');
await expect(basicUserUnionPage.locators.formSelect('所属医院'), '所属医院筛选').toBeVisible();
await expect(basicUserUnionPage.button('新增').first(), '工具栏新增').toBeVisible();
expect((await basicUserUnionPage.headerTexts()).length, '列表列头').toBeGreaterThan(0);
await expect(
basicUserUnionPage.locators.paginationTotal.or(basicUserUnionPage.browserPage.locator('.ant-pagination')).first(),
'分页',
).toBeVisible();
});
test.describe('未登录', () => {
test.use({ storageState: { cookies: [], origins: [] } });
test('USER-UNI-002 未登录访问拦截', async ({ basicUserUnionPage }) => {
const probe = await basicUserUnionPage.probeUnauthAccess();
expect(probe.onLogin || !probe.hasBusinessRow, '未登录不可见医共体用户数据').toBeTruthy();
});
});
});
test.describe('医共体用户管理 · 筛选与查询', () => {
test('USER-UNI-003 默认查询列表有数据或空态明确', { tag: '@smoke' }, async ({ basicUserUnionPage }) => {
test('USER-UNI-001 默认查询列表有数据或空态明确', { tag: '@smoke' }, async ({ basicUserUnionPage }) => {
await basicUserUnionPage.open();
await basicUserUnionPage.query();
await assertListOrEmpty(await basicUserUnionPage.snapshotList(), '默认查询');
});
test('USER-UNI-004 姓名或登录账号关键字查询', async ({ basicUserUnionPage }) => {
await basicUserUnionPage.open();
const sample = await basicUserUnionPage.extractUnionSample();
const keyword = sample.sampleUserName || sample.sampleLoginName;
await basicUserUnionPage.queryByName(keyword);
const nameOk = await basicUserUnionPage.rowsMatchKeyword('姓名', keyword);
const loginOk = await basicUserUnionPage.rowsMatchKeyword('登录账号', keyword);
expect(nameOk || loginOk, '结果行姓名或登录账号应匹配关键字').toBeTruthy();
});
test('USER-UNI-005 所属医院筛选', { tag: '@smoke' }, async ({ basicUserUnionPage }) => {
await basicUserUnionPage.open();
await basicUserUnionPage.query();
const switched = await basicUserUnionPage.switchHospitalIfPossible();
expect(switched, '应切换到另一医院').toBeTruthy();
expect(
await basicUserUnionPage.rowsMatchKeyword('所属医院', switched!.to),
'结果行所属医院应与所选一致',
).toBeTruthy();
});
test('USER-UNI-006 姓名+医院+科室+角色+状态组合查询', async ({ basicUserUnionPage }) => {
test('USER-UNI-002 姓名、所属医院、联系方式、科室、角色等条件组合查询', async ({ basicUserUnionPage }) => {
await basicUserUnionPage.open();
const sample = await basicUserUnionPage.extractUnionSample();
await basicUserUnionPage.queryComboUnion(sample);
......@@ -74,22 +29,34 @@ test.describe('基础设置 · 用户管理', () => {
if (sample.sampleHospital) {
expect(await basicUserUnionPage.rowsMatchKeyword('所属医院', sample.sampleHospital), '所属医院应匹配').toBeTruthy();
}
const phoneNorm = sample.samplePhone.replace(/\s/g, '');
if (phoneNorm && phoneNorm !== '--') {
expect(await basicUserUnionPage.rowsMatchKeyword('联系方式', sample.samplePhone), '联系方式应匹配').toBeTruthy();
}
if (sample.sampleDept && sample.sampleDept !== '--') {
expect(await basicUserUnionPage.rowsMatchKeyword('所属科室', sample.sampleDept), '所属科室应匹配').toBeTruthy();
}
if (sample.sampleRole) {
expect(await basicUserUnionPage.rowsMatchKeyword('角色', sample.sampleRole), '角色应匹配').toBeTruthy();
}
expect(await basicUserUnionPage.rowsMatchStatus(sample.sampleStatus), '状态应匹配').toBeTruthy();
});
test('USER-UNI-017 高级筛选按状态过滤', { tag: '@smoke' }, async ({ basicUserUnionPage }) => {
test('USER-UNI-013 高级筛选按科室过滤', { tag: '@smoke' }, async ({ basicUserUnionPage }) => {
await basicUserUnionPage.open();
await basicUserUnionPage.filterByStatus('启用');
await assertListOrEmpty(await basicUserUnionPage.snapshotList(), '按状态过滤');
const sample = await basicUserUnionPage.extractUnionSample();
if (!sample.sampleDept || sample.sampleDept === '--') {
await basicUserUnionPage.ensureHealthyBeforeSkip('数据不足:无有效科室可筛');
test.skip(true, '数据不足:无有效科室可筛');
}
await basicUserUnionPage.filterByDept(sample.sampleDept);
const list = await basicUserUnionPage.snapshotList();
await assertListOrEmpty(list, '按科室过滤');
if (list.rows > 0) {
expect(await basicUserUnionPage.rowsMatchKeyword('所属科室', sample.sampleDept), '所属科室应匹配').toBeTruthy();
}
});
test('USER-UNI-007 重置恢复默认医院', async ({ basicUserUnionPage }) => {
test('USER-UNI-003 重置恢复默认医院', async ({ basicUserUnionPage }) => {
await basicUserUnionPage.open();
const defHospital = await basicUserUnionPage.currentHospitalLabel();
await basicUserUnionPage.fillName('x');
......@@ -98,7 +65,7 @@ test.describe('基础设置 · 用户管理', () => {
await expect(basicUserUnionPage.locators.nameInput).toHaveValue('');
});
test('USER-UNI-008 展开高级筛选', async ({ basicUserUnionPage }) => {
test('USER-UNI-004 展开高级筛选', async ({ basicUserUnionPage }) => {
await basicUserUnionPage.open();
await basicUserUnionPage.expandAdvanced();
await expect(
......@@ -111,7 +78,7 @@ test.describe('基础设置 · 用户管理', () => {
await expect(basicUserUnionPage.button('筛选').first(), '筛 选').toBeVisible();
});
test('USER-UNI-009 无匹配空态(mock反例)', { tag: '@smoke' }, async ({ basicUserUnionPage }) => {
test('USER-UNI-005 无匹配空态(mock反例)', { tag: '@smoke' }, async ({ basicUserUnionPage }) => {
await basicUserUnionPage.open();
await basicUserUnionPage.queryMockEmpty();
await assertMockEmpty(await basicUserUnionPage.snapshotList());
......@@ -119,7 +86,7 @@ test.describe('基础设置 · 用户管理', () => {
});
test.describe('医共体用户管理 · 列表与分页', () => {
test('USER-UNI-010 列表列顺序含所属医院', async ({ basicUserUnionPage }) => {
test('USER-UNI-006 列表列顺序含所属医院', async ({ basicUserUnionPage }) => {
await basicUserUnionPage.open();
await basicUserUnionPage.query();
assertHeaderOrder(await basicUserUnionPage.headerTexts(), [
......@@ -135,7 +102,7 @@ test.describe('基础设置 · 用户管理', () => {
]);
});
test('USER-UNI-011 分页翻至第 2 页', async ({ basicUserUnionPage }) => {
test('USER-UNI-007 分页翻至第 2 页', async ({ basicUserUnionPage }) => {
await basicUserUnionPage.open();
await basicUserUnionPage.query();
const hospital = await basicUserUnionPage.currentHospitalLabel();
......@@ -145,7 +112,7 @@ test.describe('基础设置 · 用户管理', () => {
expect(await basicUserUnionPage.currentHospitalLabel(), '翻页后医院筛选应保持').toBe(hospital);
});
test('USER-UNI-018 切换20条每页页面正常且列表同步', async ({ basicUserUnionPage }) => {
test('USER-UNI-014 切换20条每页页面正常且列表同步', async ({ basicUserUnionPage }) => {
await basicUserUnionPage.open();
await basicUserUnionPage.query();
const hospital = await basicUserUnionPage.currentHospitalLabel();
......@@ -160,7 +127,7 @@ test.describe('基础设置 · 用户管理', () => {
await expect(basicUserUnionPage.locators.tableHeader.first(), '列表表头').toBeVisible();
});
test('USER-UNI-019 打开列设置面板', { tag: '@smoke' }, async ({ basicUserUnionPage }) => {
test('USER-UNI-015 打开列设置面板', { tag: '@smoke' }, async ({ basicUserUnionPage }) => {
await basicUserUnionPage.open();
await basicUserUnionPage.query();
await basicUserUnionPage.openColumnSettings();
......@@ -168,13 +135,13 @@ test.describe('基础设置 · 用户管理', () => {
await basicUserUnionPage.closeColumnSettingsPanel();
});
test('USER-UNI-020 列设置取消勾选后列表列恢复', async ({ basicUserUnionPage }) => {
test('USER-UNI-016 列设置取消勾选后列表列恢复', async ({ basicUserUnionPage }) => {
await basicUserUnionPage.open();
await basicUserUnionPage.query();
await basicUserUnionPage.executeColumnSettingsToggleRestoreTest();
});
test('USER-UNI-012 与用户管理页同一用户字段一致', async ({ basicUserUnionPage, basicUserPage }) => {
test('USER-UNI-008 与用户管理页同一用户字段一致', async ({ basicUserUnionPage, basicUserPage }) => {
await basicUserUnionPage.open();
const sample = await basicUserUnionPage.extractUnionSample();
expect(sample.sampleHospital, '本页应有所属医院').toBeTruthy();
......@@ -197,7 +164,7 @@ test.describe('基础设置 · 用户管理', () => {
});
test.describe('医共体用户管理 · 新增与编辑', () => {
test('USER-UNI-013 打开新增弹窗', async ({ basicUserUnionPage }) => {
test('USER-UNI-009 打开新增弹窗', async ({ basicUserUnionPage }) => {
await basicUserUnionPage.open();
const dialog = await basicUserUnionPage.openAddDialog();
await expect(dialog.getByText(/账号|姓名|联系方式/).first()).toBeVisible();
......@@ -206,20 +173,20 @@ test.describe('基础设置 · 用户管理', () => {
await basicUserUnionPage.closeDialog();
});
test('USER-UNI-014 新增取消不落库', async ({ basicUserUnionPage }) => {
test('USER-UNI-010 新增取消不落库', async ({ basicUserUnionPage }) => {
await basicUserUnionPage.open();
const login = await basicUserUnionPage.addAndCancelOnHospital();
await assertMockEmpty(await basicUserUnionPage.snapshotList(), login);
});
test('USER-UNI-015 必填为空拦截', async ({ basicUserUnionPage }) => {
test('USER-UNI-011 必填为空拦截', async ({ basicUserUnionPage }) => {
await basicUserUnionPage.open();
await basicUserUnionPage.submitEmptyRequired();
await basicUserUnionPage.expectBlockedAndStay();
await basicUserUnionPage.closeDialog();
});
test('USER-UNI-016 打开编辑并回填', async ({ basicUserUnionPage }) => {
test('USER-UNI-012 打开编辑并回填', async ({ basicUserUnionPage }) => {
await basicUserUnionPage.open();
await basicUserUnionPage.query();
const { login, name } = await basicUserUnionPage.openEdit();
......@@ -236,7 +203,7 @@ test.describe('基础设置 · 用户管理', () => {
});
test.describe('医共体用户管理 · 授权', () => {
test('USER-UNI-022 授权弹框账号与所选行一致', { tag: '@smoke' }, async ({ basicUserUnionPage }) => {
test('USER-UNI-018 授权弹框账号与所选行一致', { tag: '@smoke' }, async ({ basicUserUnionPage }) => {
await basicUserUnionPage.open();
await basicUserUnionPage.query();
const { row, sampleLoginName, sampleUserName } = await basicUserUnionPage.pickRowWithLogin();
......@@ -245,7 +212,7 @@ test.describe('基础设置 · 用户管理', () => {
await basicUserUnionPage.closeDialog();
});
test('USER-UNI-023 授权弹框添加移除角色行', async ({ basicUserUnionPage }) => {
test('USER-UNI-019 授权弹框添加移除角色行', async ({ basicUserUnionPage }) => {
await basicUserUnionPage.open();
await basicUserUnionPage.query();
const { row } = await basicUserUnionPage.pickRowWithLogin();
......@@ -256,7 +223,7 @@ test.describe('基础设置 · 用户管理', () => {
await basicUserUnionPage.closeDialog();
});
test('USER-UNI-021 打开授权后取消不生效', async ({ basicUserUnionPage }) => {
test('USER-UNI-017 打开授权后取消不生效', async ({ basicUserUnionPage }) => {
await basicUserUnionPage.open();
await basicUserUnionPage.query();
await basicUserUnionPage.openRowAction('授权');
......
import { test } from '../../fixtures';
/**
* STAT-IES-026 导出当前查询结果(调试/演示专用)
*
* 运行示例:
* SLOW_MO=500 npx playwright test tests/spd/center-report-entry.stat-ies-027.spec.ts \
* --headed --project=chromium --workers=1
*
* 或:npm run test:stat-ies-027
*/
test.describe('入库汇总查询 · STAT-IES-026', () => {
test('STAT-IES-026 按当前查询条件导出文件', async ({ centerReportEntryPage, page }) => {
await centerReportEntryPage.open();
await centerReportEntryPage.checkAllDimensions();
await centerReportEntryPage.search();
await centerReportEntryPage.exportReport();
await page.pause();
});
});
import { test } from '../../fixtures';
/**
* STAT-LMP-004 全量查询条件组合查询(调试/演示专用)
*
* 运行示例:
* SLOW_MO=500 npx playwright test tests/spd/center-report-lmm-psi.stat-lmp-004.spec.ts \
* --headed --project=chromium --workers=1
*
* 或:npm run test:stat-lmp-004
* (PWDEBUG=console 确保执行完毕后在 Playwright Inspector 暂停)
*/
test.describe('中心库进销存(后勤) · STAT-LMP-004', () => {
test('STAT-LMP-004 全量查询条件组合查询', async ({ centerReportLmmPsiPage, page }) => {
await centerReportLmmPsiPage.open();
const sample = await centerReportLmmPsiPage.searchWithAllConditions();
await centerReportLmmPsiPage.expectCombinedFilterResult(sample);
await page.pause();
});
});
import { test } from '../../fixtures';
import { centerReportLmmSheetComboAssertKeys } from '../../data/center-report-lmm-sheet.data';
/**
* STAT-LMS-006 快捷与高级组合查询(调试/演示专用)
*
* 运行示例:
* SLOW_MO=500 npx playwright test tests/spd/center-report-lmm-sheet.stat-lms-005.spec.ts \
* --headed --project=chromium --workers=1
*
* 或:npm run test:stat-lms-005
*/
test.describe('出入库明细查询(后勤) · STAT-LMS-006', () => {
test('STAT-LMS-006 快捷与高级组合查询', async ({ centerReportLmmSheetPage, page }) => {
await centerReportLmmSheetPage.open();
const sample = await centerReportLmmSheetPage.searchWithQuickAndDrawerCombo();
await centerReportLmmSheetPage.expectCombinedFilterResult(sample, centerReportLmmSheetComboAssertKeys);
await page.pause();
});
});
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