Commit 6a181bea authored by liguangyu06's avatar liguangyu06
Browse files

将基础管理等未入库改动暂存到 temp 分支,便于远程备份。

新模块用例尚未具备通关凭证,本次按临时备份跳过本地门禁。
parent f6eec849
# 基础管理-厂商管理-注册证变更初审 UI 自动化测试用例
**来源测试点**:`testpoint/基础管理-厂商管理-注册证变更初审-测试点分析-01.md`
**执行 CSV**:`testcase/基础管理-厂商管理-注册证变更初审-UI自动化测试用例-01.csv`
**页面 URL**:`/spd/basic/mfrs/paltform/mfrsName/regCertAudit`
**定位器 YAML**:`locators/spd/vendor-cert-first.locator.yaml`
**元素扫描**:`data/scan/vendor-cert-first-elements.json`(40 项)
**关联规范**:`knowledge-base/08-UI专项规范库/UI-SPEC-SPD-VENDOR-005.md`
**版本**:2026-09-30
**自动化框架**:Playwright + TypeScript(`tests/spd/vendor-audit.spec.ts`,依赖 `auth.setup` 登录态)
**通用前置**:已执行 `auth.setup`,`storageState` 有效;测试账号具备「基础设置 → 厂商管理 → 注册证变更初审」权限。
**页面约定**:整页渲染,**无报表 iframe**。
**写操作**:审批写操作只打开详情后返回,不确认通过/驳回/提交。
**动态取数**:默认查询后从首行读取 `${sampleOrderNo}`;禁止写死单号;mock:`__NOT_EXIST_ORDER__99999`。
---
## 基础设置 · 厂商管理
### 注册证变更初审 · 页面进入
#### 功能验证点
##### 【P0】【TC-UI-VENDOR-CF1-001】【TP_VENDOR_CF1_001】菜单进入注册证变更初审页
- 前置条件:已登录且具备厂商管理权限
- 操作步骤:
1. 按菜单「基础设置 → 厂商管理 → 注册证变更初审」进入
2. 断言 URL 含 `/spd/basic/mfrs/paltform/mfrsName/regCertAudit`
3. 断言可见「查 询」「重 置」及制单日期筛选
- 自动化断言:与 CSV `VENDOR-CF1-001` 及 `tests/spd/vendor-audit.spec.ts` 一致
###### 预期结果
进入注册证变更初审页;不误入其它变更审批菜单。
---
### 注册证变更初审 · 筛选与列表
#### 功能验证点
##### 【P0】【TC-UI-VENDOR-CF1-002】【TP_VENDOR_CF1_009】默认查询列表有数据或空态明确
- 前置条件:已进入注册证变更初审页
- 操作步骤:
1. 点击「查 询」并等待列表稳定
2. 断言出现数据行或空态明确
- 自动化断言:与 CSV `VENDOR-CF1-002` 及 `tests/spd/vendor-audit.spec.ts` 一致
###### 预期结果
查询无报错;有数据时分页 N≥1。
---
##### 【P0】【TC-UI-VENDOR-CF1-003】【TP_VENDOR_CF1_010】按单号筛选
- 前置条件:列表至少 1 条且单号非空
- 操作步骤:
1. 从首行读取 `${sampleOrderNo}` 取关键字
2. 单号填入关键字并「查 询」
3. 断言结果行「单号」包含关键字
- 自动化断言:与 CSV `VENDOR-CF1-003` 及 `tests/spd/vendor-audit.spec.ts` 一致
###### 预期结果
单号列与条件一致。
---
##### 【P0】【TC-UI-VENDOR-CF1-004】【TP_VENDOR_CF1_011】按注册证号(新)筛选
- 前置条件:列表至少 1 条
- 操作步骤:
1. 按样本填写或选择「注册证号(新)」并查询
2. 断言结果列与条件匹配
- 自动化断言:与 CSV `VENDOR-CF1-004` 及 `tests/spd/vendor-audit.spec.ts` 一致
###### 预期结果
筛选条件生效。
---
##### 【P1】【TC-UI-VENDOR-CF1-005】【TP_VENDOR_CF1_012】重置恢复默认
- 前置条件:已进入注册证变更初审页
- 操作步骤:
1. 填写筛选项后点击「重 置」
2. 断言文本条件清空、列表按默认规则刷新
- 自动化断言:与 CSV `VENDOR-CF1-005` 及 `tests/spd/vendor-audit.spec.ts` 一致
###### 预期结果
重置成功。
---
#### 异常验证点
##### 【P1】【TC-UI-VENDOR-CF1-006】【TP_VENDOR_CF1_016】无匹配空态(mock反例)
- 前置条件:已进入注册证变更初审页
- 操作步骤:
1. 单号填入 `__NOT_EXIST_ORDER__99999` 并查询
2. 断言空态且分页总数为 0
- 自动化断言:与 CSV `VENDOR-CF1-006` 及 `tests/spd/vendor-audit.spec.ts` 一致
###### 预期结果
无匹配时不报错;总数为 0。
---
#### 功能验证点
##### 【P0】【TC-UI-VENDOR-CF1-007】【TP_VENDOR_CF1_013】列表核心列完整
- 前置条件:已进入注册证变更初审页
- 操作步骤:
1. 断言表头含 进院供应商名称、单号、状态、制单时间、制单人、变更类型、注册证号(新)、操作
2. 断言存在「详情」操作
- 自动化断言:与 CSV `VENDOR-CF1-007` 及 `tests/spd/vendor-audit.spec.ts` 一致
###### 预期结果
核心列与详情入口可见。
---
### 注册证变更初审 · 详情
#### 功能验证点
##### 【P0】【TC-UI-VENDOR-CF1-008】【TP_VENDOR_CF1_014】打开详情后返回
- 前置条件:存在含「详情」的行
- 操作步骤:
1. 点击行内「详 情」
2. 断言详情层可见且含单号片段
3. 返回/关闭,不提交审批
- 自动化断言:与 CSV `VENDOR-CF1-008` 及 `tests/spd/vendor-audit.spec.ts` 一致
###### 预期结果
详情只读可返回;列表状态不变。
---
### 注册证变更初审 · 筛选与列表
#### 边界验证点
##### 【P2】【TC-UI-VENDOR-CF1-009】【TP_VENDOR_CF1_015】制单日期起止同一天
- 前置条件:已进入注册证变更初审页
- 操作步骤:
1. 制单日期起止选同一天并查询
2. 断言仅返回该日单据或空态明确
- 自动化断言:本条以手工/后续扩展为主;当前冒烟未覆盖
###### 预期结果
同日区间行为明确。
---
### 注册证变更初审 · 详情
#### 集成验证点
##### 【P0】【TC-UI-VENDOR-CF1-010】【TP_VENDOR_CF1_018】与终审单据衔接不串单
- 前置条件:已进入注册证变更初审页
- 操作步骤:
1. 记录本页某单号后切换到对应终审菜单
2. 断言同业务单据状态流转合理、不串到非本业务菜单
- 自动化断言:本条以手工/后续扩展为主;当前冒烟未覆盖
###### 预期结果
初审/终审衔接正确。
# 基础管理-厂商管理-注册证变更终审 UI 自动化测试用例
**来源测试点**:`testpoint/基础管理-厂商管理-注册证变更终审-测试点分析-01.md`
**执行 CSV**:`testcase/基础管理-厂商管理-注册证变更终审-UI自动化测试用例-01.csv`
**页面 URL**:`/spd/basic/mfrs/paltform/mfrsName/regCertAuditFinal`
**定位器 YAML**:`locators/spd/vendor-cert-final.locator.yaml`
**元素扫描**:`data/scan/vendor-cert-final-elements.json`(40 项)
**关联规范**:`knowledge-base/08-UI专项规范库/UI-SPEC-SPD-VENDOR-006.md`
**版本**:2026-09-30
**自动化框架**:Playwright + TypeScript(`tests/spd/vendor-audit.spec.ts`,依赖 `auth.setup` 登录态)
**通用前置**:已执行 `auth.setup`,`storageState` 有效;测试账号具备「基础设置 → 厂商管理 → 注册证变更终审」权限。
**页面约定**:整页渲染,**无报表 iframe**。
**写操作**:审批写操作只打开详情后返回,不确认通过/驳回/提交。
**动态取数**:默认查询后从首行读取 `${sampleOrderNo}`;禁止写死单号;mock:`__NOT_EXIST_ORDER__99999`。
---
## 基础设置 · 厂商管理
### 注册证变更终审 · 页面进入
#### 功能验证点
##### 【P0】【TC-UI-VENDOR-CF2-001】【TP_VENDOR_CF2_001】菜单进入注册证变更终审页
- 前置条件:已登录且具备厂商管理权限
- 操作步骤:
1. 按菜单「基础设置 → 厂商管理 → 注册证变更终审」进入
2. 断言 URL 含 `/spd/basic/mfrs/paltform/mfrsName/regCertAuditFinal`
3. 断言可见「查 询」「重 置」及制单日期筛选
- 自动化断言:与 CSV `VENDOR-CF2-001` 及 `tests/spd/vendor-audit.spec.ts` 一致
###### 预期结果
进入注册证变更终审页;不误入其它变更审批菜单。
---
### 注册证变更终审 · 筛选与列表
#### 功能验证点
##### 【P0】【TC-UI-VENDOR-CF2-002】【TP_VENDOR_CF2_009】默认查询列表有数据或空态明确
- 前置条件:已进入注册证变更终审页
- 操作步骤:
1. 点击「查 询」并等待列表稳定
2. 断言出现数据行或空态明确
- 自动化断言:与 CSV `VENDOR-CF2-002` 及 `tests/spd/vendor-audit.spec.ts` 一致
###### 预期结果
查询无报错;有数据时分页 N≥1。
---
##### 【P0】【TC-UI-VENDOR-CF2-003】【TP_VENDOR_CF2_010】按单号筛选
- 前置条件:列表至少 1 条且单号非空
- 操作步骤:
1. 从首行读取 `${sampleOrderNo}` 取关键字
2. 单号填入关键字并「查 询」
3. 断言结果行「单号」包含关键字
- 自动化断言:与 CSV `VENDOR-CF2-003` 及 `tests/spd/vendor-audit.spec.ts` 一致
###### 预期结果
单号列与条件一致。
---
##### 【P0】【TC-UI-VENDOR-CF2-004】【TP_VENDOR_CF2_011】按注册证号(新)筛选
- 前置条件:列表至少 1 条
- 操作步骤:
1. 按样本填写或选择「注册证号(新)」并查询
2. 断言结果列与条件匹配
- 自动化断言:与 CSV `VENDOR-CF2-004` 及 `tests/spd/vendor-audit.spec.ts` 一致
###### 预期结果
筛选条件生效。
---
##### 【P1】【TC-UI-VENDOR-CF2-005】【TP_VENDOR_CF2_012】重置恢复默认
- 前置条件:已进入注册证变更终审页
- 操作步骤:
1. 填写筛选项后点击「重 置」
2. 断言文本条件清空、列表按默认规则刷新
- 自动化断言:与 CSV `VENDOR-CF2-005` 及 `tests/spd/vendor-audit.spec.ts` 一致
###### 预期结果
重置成功。
---
#### 异常验证点
##### 【P1】【TC-UI-VENDOR-CF2-006】【TP_VENDOR_CF2_016】无匹配空态(mock反例)
- 前置条件:已进入注册证变更终审页
- 操作步骤:
1. 单号填入 `__NOT_EXIST_ORDER__99999` 并查询
2. 断言空态且分页总数为 0
- 自动化断言:与 CSV `VENDOR-CF2-006` 及 `tests/spd/vendor-audit.spec.ts` 一致
###### 预期结果
无匹配时不报错;总数为 0。
---
#### 功能验证点
##### 【P0】【TC-UI-VENDOR-CF2-007】【TP_VENDOR_CF2_013】列表核心列完整
- 前置条件:已进入注册证变更终审页
- 操作步骤:
1. 断言表头含 进院供应商名称、单号、状态、制单时间、制单人、变更类型、注册证号(新)、操作
2. 断言存在「详情」操作
- 自动化断言:与 CSV `VENDOR-CF2-007` 及 `tests/spd/vendor-audit.spec.ts` 一致
###### 预期结果
核心列与详情入口可见。
---
### 注册证变更终审 · 详情
#### 功能验证点
##### 【P0】【TC-UI-VENDOR-CF2-008】【TP_VENDOR_CF2_014】打开详情后返回
- 前置条件:存在含「详情」的行
- 操作步骤:
1. 点击行内「详 情」
2. 断言详情层可见且含单号片段
3. 返回/关闭,不提交审批
- 自动化断言:与 CSV `VENDOR-CF2-008` 及 `tests/spd/vendor-audit.spec.ts` 一致
###### 预期结果
详情只读可返回;列表状态不变。
---
### 注册证变更终审 · 筛选与列表
#### 边界验证点
##### 【P2】【TC-UI-VENDOR-CF2-009】【TP_VENDOR_CF2_015】制单日期起止同一天
- 前置条件:已进入注册证变更终审页
- 操作步骤:
1. 制单日期起止选同一天并查询
2. 断言仅返回该日单据或空态明确
- 自动化断言:本条以手工/后续扩展为主;当前冒烟未覆盖
###### 预期结果
同日区间行为明确。
---
### 注册证变更终审 · 详情
#### 集成验证点
##### 【P0】【TC-UI-VENDOR-CF2-010】【TP_VENDOR_CF2_018】与初审单据衔接不串单
- 前置条件:已进入注册证变更终审页
- 操作步骤:
1. 记录本页某单号后切换到对应初审菜单
2. 断言同业务单据状态流转合理、不串到非本业务菜单
- 自动化断言:本条以手工/后续扩展为主;当前冒烟未覆盖
###### 预期结果
初审/终审衔接正确。
# 基础管理-厂商管理-注册证差异对比 UI 自动化测试用例
**来源测试点**:`testpoint/基础管理-厂商管理-注册证差异对比-测试点分析-01.md`
**执行 CSV**:`testcase/基础管理-厂商管理-注册证差异对比-UI自动化测试用例-01.csv`
**页面 URL**:`/spd/basic/mfrs/scjs/yc/certCompare`
**定位器 YAML**:`locators/spd/vendor-cert-diff.locator.yaml`
**元素扫描**:`data/scan/vendor-cert-diff-elements.json`(54 项)
**关联规范**:`knowledge-base/08-UI专项规范库/UI-SPEC-SPD-VENDOR-007.md`
**版本**:2026-09-30
**自动化框架**:Playwright + TypeScript(`tests/spd/vendor-cert-diff.spec.ts`,依赖 `auth.setup` 登录态)
**通用前置**:已执行 `auth.setup`,`storageState` 有效;测试账号具备「基础设置 → 厂商管理 → 注册证差异对比」权限。
**页面约定**:主体在 scjs **iframe**。
**写操作**:主体在 scjs iframe;导出本批只断言按钮可见,不确认下载。
**动态取数**:iframe 内首行读取 `${sampleMaterialName}`;mock:`__NOT_EXIST_MFRS__99999`。
---
## 基础设置 · 厂商管理
### 注册证差异对比 · 页面进入
#### 功能验证点
##### 【P0】【TC-UI-VENDOR-CDF-001】【TP_VENDOR_CDF_001】菜单进入注册证差异对比页
- 前置条件:已登录且具备厂商管理权限
- 操作步骤:
1. 按菜单「基础设置 → 厂商管理 → 注册证差异对比」进入
2. 断言 URL 含 `certCompare`
3. 断言外壳或 iframe 内可见物料名称/全部/一致/不一致等主区
- 自动化断言:与 CSV `VENDOR-CDF-001` 及 `tests/spd/vendor-cert-diff.spec.ts` 一致
###### 预期结果
进入差异对比页;iframe 或主区加载成功。
---
### 注册证差异对比 · 筛选与对比
#### 功能验证点
##### 【P0】【TC-UI-VENDOR-CDF-002】【TP_VENDOR_CDF_009】默认查询列表有数据或空态明确
- 前置条件:已进入注册证差异对比页
- 操作步骤:
1. 在对比页执行查询(若有查询按钮)
2. 断言列表有数据或空态明确
- 自动化断言:与 CSV `VENDOR-CDF-002` 及 `tests/spd/vendor-cert-diff.spec.ts` 一致
###### 预期结果
查询无报错。
---
##### 【P0】【TC-UI-VENDOR-CDF-003】【TP_VENDOR_CDF_013】切换不一致 Tab
- 前置条件:已进入注册证差异对比页
- 操作步骤:
1. 点击「不一致」
2. 断言列表稳定
- 自动化断言:与 CSV `VENDOR-CDF-003` 及 `tests/spd/vendor-cert-diff.spec.ts` 一致
###### 预期结果
不一致 Tab 切换成功。
---
##### 【P1】【TC-UI-VENDOR-CDF-004】【TP_VENDOR_CDF_013】切换一致 Tab
- 前置条件:已进入注册证差异对比页
- 操作步骤:
1. 点击「一致」
2. 断言列表稳定
- 自动化断言:与 CSV `VENDOR-CDF-004` 及 `tests/spd/vendor-cert-diff.spec.ts` 一致
###### 预期结果
一致 Tab 切换成功。
---
##### 【P0】【TC-UI-VENDOR-CDF-005】【TP_VENDOR_CDF_010】按物料名称筛选
- 前置条件:对比列表至少 1 条
- 操作步骤:
1. 从首行读取 `${sampleMaterialName}` 取关键字
2. 物料名称填入并查询
3. 断言结果行物料名称包含关键字
- 自动化断言:与 CSV `VENDOR-CDF-005` 及 `tests/spd/vendor-cert-diff.spec.ts` 一致
###### 预期结果
物料名称匹配。
---
#### 异常验证点
##### 【P1】【TC-UI-VENDOR-CDF-006】【TP_VENDOR_CDF_016】无匹配空态(mock反例)
- 前置条件:已进入注册证差异对比页
- 操作步骤:
1. 物料名称填 mock 关键字并查询
2. 断言空态或总数为 0
- 自动化断言:与 CSV `VENDOR-CDF-006` 及 `tests/spd/vendor-cert-diff.spec.ts` 一致
###### 预期结果
无匹配时不报错。
---
#### 功能验证点
##### 【P0】【TC-UI-VENDOR-CDF-007】【TP_VENDOR_CDF_014】列表核心列完整
- 前置条件:已进入注册证差异对比页
- 操作步骤:
1. 断言表头含物料编号/物料名称/规格型号/生产厂家等关键列
- 自动化断言:与 CSV `VENDOR-CDF-007` 及 `tests/spd/vendor-cert-diff.spec.ts` 一致
###### 预期结果
核心对比列可见。
---
### 注册证差异对比 · 导出
#### 功能验证点
##### 【P1】【TC-UI-VENDOR-CDF-008】【TP_VENDOR_CDF_015】导出按钮可见
- 前置条件:已进入注册证差异对比页
- 操作步骤:
1. 断言「导出」按钮可见(不确认下载)
- 自动化断言:与 CSV `VENDOR-CDF-008` 及 `tests/spd/vendor-cert-diff.spec.ts` 一致
###### 预期结果
导出入口可见。
---
### 注册证差异对比 · 筛选与对比
#### 边界验证点
##### 【P2】【TC-UI-VENDOR-CDF-009】【TP_VENDOR_CDF_015】仅空格物料名称搜索
- 前置条件:已进入注册证差异对比页
- 操作步骤:
1. 物料名称仅填空格并查询
2. 断言按空查询处理或提示,不白屏
- 自动化断言:本条以手工/后续扩展为主;当前冒烟未覆盖
###### 预期结果
空格关键字不导致页面异常。
---
#### 集成验证点
##### 【P0】【TC-UI-VENDOR-CDF-010】【TP_VENDOR_CDF_017】一致行两侧字段抽样一致
- 前置条件:已进入注册证差异对比页
- 操作步骤:
1. 在「一致」Tab 抽样一行
2. 核对望海与 FLI+ 注册证号/效期关键字段一致
- 自动化断言:本条以手工/后续扩展为主;当前冒烟未覆盖
###### 预期结果
标记一致的行两侧关键字段抽样相同。
---
##### 【P0】【TC-UI-VENDOR-CDF-011】【TP_VENDOR_CDF_018】不一致行至少一侧差异
- 前置条件:已进入注册证差异对比页
- 操作步骤:
1. 在「不一致」Tab 抽样一行
2. 断言望海与 FLI+ 至少一处字段不同
- 自动化断言:本条以手工/后续扩展为主;当前冒烟未覆盖
###### 预期结果
不一致结论与字段差异相符。
# 基础管理-厂商管理-评价指标维护 UI 自动化测试用例
**来源测试点**:`testpoint/基础管理-厂商管理-评价指标维护-测试点分析-01.md`
**执行 CSV**:`testcase/基础管理-厂商管理-评价指标维护-UI自动化测试用例-01.csv`
**页面 URL**:`/spd/basic/mfrs/paltform/mfrsName/indicators`
**定位器 YAML**:`locators/spd/vendor-eval-indicator.locator.yaml`
**元素扫描**:`data/scan/vendor-eval-indicator-elements.json`(151 项)
**关联规范**:`knowledge-base/08-UI专项规范库/UI-SPEC-SPD-VENDOR-009.md`
**版本**:2026-09-30
**自动化框架**:Playwright + TypeScript(`tests/spd/vendor-eval-indicator.spec.ts`,依赖 `auth.setup` 登录态)
**通用前置**:已执行 `auth.setup`,`storageState` 有效;测试账号具备「基础设置 → 厂商管理 → 评价指标维护」权限。
**页面约定**:整页渲染,**无报表 iframe**。
**写操作**:详情只读返回;不落库新增/编辑提交。
**动态取数**:右表首行读取 `${sampleIndicatorCode}`;列名可能为指标编码或指标编号;mock:`__NOT_EXIST_ORDER__99999`。
---
## 基础设置 · 厂商管理
### 评价指标维护 · 页面进入
#### 功能验证点
##### 【P0】【TC-UI-VENDOR-EVI-001】【TP_VENDOR_EVI_001】菜单进入评价指标维护页
- 前置条件:已登录且具备厂商管理权限
- 操作步骤:
1. 按菜单进入评价指标维护
2. 断言 URL 含 `indicators`
3. 断言可见「指标分类」与查询
- 自动化断言:与 CSV `VENDOR-EVI-001` 及 `tests/spd/vendor-eval-indicator.spec.ts` 一致
###### 预期结果
进入评价指标维护页。
---
### 评价指标维护 · 树与列表
#### 功能验证点
##### 【P0】【TC-UI-VENDOR-EVI-002】【TP_VENDOR_EVI_009】默认查询列表有数据或空态明确
- 前置条件:已进入评价指标维护页
- 操作步骤:
1. 点击查询
2. 断言右表有数据或空态
- 自动化断言:与 CSV `VENDOR-EVI-002` 及 `tests/spd/vendor-eval-indicator.spec.ts` 一致
###### 预期结果
查询无报错。
---
##### 【P0】【TC-UI-VENDOR-EVI-003】【TP_VENDOR_EVI_010】点击左侧分类树
- 前置条件:已进入评价指标维护页
- 操作步骤:
1. 点击左侧首个分类节点
2. 断言右侧列表刷新
- 自动化断言:与 CSV `VENDOR-EVI-003` 及 `tests/spd/vendor-eval-indicator.spec.ts` 一致
###### 预期结果
分类切换成功。
---
##### 【P0】【TC-UI-VENDOR-EVI-004】【TP_VENDOR_EVI_011】按指标编码筛选
- 前置条件:右表有数据
- 操作步骤:
1. 取样本指标编码/编号筛选并查询
2. 断言编码列匹配
- 自动化断言:与 CSV `VENDOR-EVI-004` 及 `tests/spd/vendor-eval-indicator.spec.ts` 一致
###### 预期结果
指标编码匹配。
---
#### 异常验证点
##### 【P1】【TC-UI-VENDOR-EVI-005】【TP_VENDOR_EVI_015】无匹配空态(mock反例)
- 前置条件:已进入评价指标维护页
- 操作步骤:
1. 指标编码填 mock 后查询
2. 断言空态
- 自动化断言:与 CSV `VENDOR-EVI-005` 及 `tests/spd/vendor-eval-indicator.spec.ts` 一致
###### 预期结果
无匹配不报错。
---
#### 功能验证点
##### 【P0】【TC-UI-VENDOR-EVI-006】【TP_VENDOR_EVI_012】列表核心列完整
- 前置条件:已进入评价指标维护页
- 操作步骤:
1. 断言表头含评价类型、指标编码或指标编号、指标名称、状态、操作
- 自动化断言:与 CSV `VENDOR-EVI-006` 及 `tests/spd/vendor-eval-indicator.spec.ts` 一致
###### 预期结果
核心列可见。
---
### 评价指标维护 · 详情
#### 功能验证点
##### 【P0】【TC-UI-VENDOR-EVI-007】【TP_VENDOR_EVI_014】打开详情后返回
- 前置条件:存在详情操作行
- 操作步骤:
1. 点击行内详情
2. 断言详情层可见
3. 返回不保存
- 自动化断言:与 CSV `VENDOR-EVI-007` 及 `tests/spd/vendor-eval-indicator.spec.ts` 一致
###### 预期结果
详情只读可返回。
---
### 评价指标维护 · 树与列表
#### 边界验证点
##### 【P2】【TC-UI-VENDOR-EVI-008】【TP_VENDOR_EVI_015】分类下无指标空态
- 前置条件:已进入评价指标维护页
- 操作步骤:
1. 选择无指标的分类(若有)
2. 断言右表空态明确
- 自动化断言:本条以手工/后续扩展为主;当前冒烟未覆盖
###### 预期结果
空分类下列表空态正确。
---
#### 集成验证点
##### 【P1】【TC-UI-VENDOR-EVI-009】【TP_VENDOR_EVI_018】启用指标可供方案使用
- 前置条件:已进入评价指标维护页
- 操作步骤:
1. 确认状态为启用的指标
2. 在评价方案维护中核对其可选(只读核对或抽样)
- 自动化断言:本条以手工/后续扩展为主;当前冒烟未覆盖
###### 预期结果
启用指标与方案引用衔接正确。
# 基础管理-厂商管理-评价方案维护 UI 自动化测试用例
**来源测试点**:`testpoint/基础管理-厂商管理-评价方案维护-测试点分析-01.md`
**执行 CSV**:`testcase/基础管理-厂商管理-评价方案维护-UI自动化测试用例-01.csv`
**页面 URL**:`/spd/basic/mfrs/paltform/mfrsName/evaluationPlan`
**定位器 YAML**:`locators/spd/vendor-eval-scheme.locator.yaml`
**元素扫描**:`data/scan/vendor-eval-scheme-elements.json`(57 项)
**关联规范**:`knowledge-base/08-UI专项规范库/UI-SPEC-SPD-VENDOR-008.md`
**版本**:2026-09-30
**自动化框架**:Playwright + TypeScript(`tests/spd/vendor-eval-scheme.spec.ts`,依赖 `auth.setup` 登录态)
**通用前置**:已执行 `auth.setup`,`storageState` 有效;测试账号具备「基础设置 → 厂商管理 → 评价方案维护」权限。
**页面约定**:整页渲染,**无报表 iframe**。
**写操作**:新增只打开后取消,不提交保存。
**动态取数**:有数据时从首行读取 `${sampleSchemeCode}`;mock:`__NOT_EXIST_ORDER__99999`。
---
## 基础设置 · 厂商管理
### 评价方案维护 · 页面进入
#### 功能验证点
##### 【P0】【TC-UI-VENDOR-EVS-001】【TP_VENDOR_EVS_001】菜单进入评价方案维护页
- 前置条件:已登录且具备厂商管理权限
- 操作步骤:
1. 按菜单进入评价方案维护
2. 断言 URL 含 `evaluationPlan`
3. 断言可见查询与新增
- 自动化断言:与 CSV `VENDOR-EVS-001` 及 `tests/spd/vendor-eval-scheme.spec.ts` 一致
###### 预期结果
进入评价方案维护页。
---
### 评价方案维护 · 筛选与维护
#### 功能验证点
##### 【P0】【TC-UI-VENDOR-EVS-002】【TP_VENDOR_EVS_009】默认查询列表有数据或空态明确
- 前置条件:已进入评价方案维护页
- 操作步骤:
1. 点击查询
2. 断言列表有数据或「暂无数据」空态
- 自动化断言:与 CSV `VENDOR-EVS-002` 及 `tests/spd/vendor-eval-scheme.spec.ts` 一致
###### 预期结果
查询无报错。
---
##### 【P0】【TC-UI-VENDOR-EVS-003】【TP_VENDOR_EVS_010】按方案编码筛选
- 前置条件:列表有数据
- 操作步骤:
1. 取样本方案编码筛选并查询
2. 断言方案编码列匹配
- 自动化断言:与 CSV `VENDOR-EVS-003` 及 `tests/spd/vendor-eval-scheme.spec.ts` 一致
###### 预期结果
方案编码匹配。
---
##### 【P1】【TC-UI-VENDOR-EVS-004】【TP_VENDOR_EVS_011】重置恢复默认
- 前置条件:已进入评价方案维护页
- 操作步骤:
1. 填写筛选后重置
2. 断言条件清空、列表刷新
- 自动化断言:与 CSV `VENDOR-EVS-004` 及 `tests/spd/vendor-eval-scheme.spec.ts` 一致
###### 预期结果
重置成功。
---
#### 异常验证点
##### 【P1】【TC-UI-VENDOR-EVS-005】【TP_VENDOR_EVS_015】无匹配空态(mock反例)
- 前置条件:已进入评价方案维护页
- 操作步骤:
1. 方案编码填 mock 后查询
2. 断言空态总数 0
- 自动化断言:与 CSV `VENDOR-EVS-005` 及 `tests/spd/vendor-eval-scheme.spec.ts` 一致
###### 预期结果
无匹配不报错。
---
#### 功能验证点
##### 【P0】【TC-UI-VENDOR-EVS-006】【TP_VENDOR_EVS_012】列表核心列完整
- 前置条件:已进入评价方案维护页
- 操作步骤:
1. 断言表头含方案编码、方案名称、创建人、创建时间、状态、操作
- 自动化断言:与 CSV `VENDOR-EVS-006` 及 `tests/spd/vendor-eval-scheme.spec.ts` 一致
###### 预期结果
核心列可见。
---
### 评价方案维护 · 新增
#### 功能验证点
##### 【P0】【TC-UI-VENDOR-EVS-007】【TP_VENDOR_EVS_013】打开新增后取消
- 前置条件:已进入评价方案维护页
- 操作步骤:
1. 记录总数
2. 点击新增打开编辑层
3. 取消/返回不提交
4. 断言总数不变
- 自动化断言:与 CSV `VENDOR-EVS-007` 及 `tests/spd/vendor-eval-scheme.spec.ts` 一致
###### 预期结果
取消不落库。
---
#### 异常验证点
##### 【P0】【TC-UI-VENDOR-EVS-008】【TP_VENDOR_EVS_016】必填为空提交拦截
- 前置条件:已进入评价方案维护页
- 操作步骤:
1. 打开新增不填必填项尝试提交(若可点)
2. 断言拦截提示,页面不关闭或总数不变
- 自动化断言:本条以手工/后续扩展为主;当前冒烟未覆盖
###### 预期结果
空提交被拦截。
---
### 评价方案维护 · 筛选与维护
#### 边界验证点
##### 【P2】【TC-UI-VENDOR-EVS-009】【TP_VENDOR_EVS_015】方案名称超长输入
- 前置条件:已进入评价方案维护页
- 操作步骤:
1. 打开新增,方案名称输入超长字符串(如 200+ 字符)
2. 断言前端截断/校验提示或后端拒绝,不白屏
- 自动化断言:本条以手工/后续扩展为主;当前冒烟未覆盖
###### 预期结果
超长输入被约束且页面可用。
---
#### 集成验证点
##### 【P1】【TC-UI-VENDOR-EVS-010】【TP_VENDOR_EVS_018】方案与评价指标可关联
- 前置条件:已进入评价方案维护页
- 操作步骤:
1. 在方案配置中查看指标选择(只读打开)
2. 断言可选指标来源于评价指标维护启用项或规则允许集合
- 自动化断言:本条以手工/后续扩展为主;当前冒烟未覆盖
###### 预期结果
方案与指标主数据衔接正确。
# 基础管理-库房管理-库区设置 UI 自动化测试用例
**来源测试点**:`testpoint/基础管理-库房管理-库区设置-测试点分析-01.md`
**执行 CSV**:`testcase/基础管理-库房管理-库区设置-UI自动化测试用例-01.csv`
**页面 URL**:`/spd/basic/storehouse/platform/storehouse/area`
**定位器 YAML**:`locators/spd/warehouse-zone.locator.yaml`
**元素扫描**:`data/scan/warehouse-zone-elements.json`(106 项)
**关联规范**:`knowledge-base/08-UI专项规范库/UI-SPEC-SPD-WH-001.md`
**版本**:2026-10-20
**自动化框架**:Playwright + TypeScript(规划 `tests/spd/warehouse-zone.spec.ts`,依赖 `auth.setup` 登录态)
**通用前置**:正例账号 `test_1` 经 `auth.setup` 写入 `storageState`(密码仅存 `.env` 的 `TEST_PASS`);具备「基础设置 → 库房管理 → 库区设置」权限。反例筛选用 mock。
**页面约定**:整页渲染,**无报表 iframe**;定位均在 `page` 上。
**菜单导航**:菜单「基础设置 → 库房管理 → 库区设置」;建议 `openPath('/spd/basic/storehouse/platform/storehouse/area')` 并断言 URL,勿误入探针绑定。
**写操作**:新增/编辑只打开后取消或点确定做必填拦截,不提交成功保存;不停用/启用落库;人员管理/货位管理只打开后关闭;同步仅点一次并断言树仍在。
**动态取数**:从左侧树读取 `${sampleWhName}`,从右侧首行读取 `${sampleZoneNo}`、`${sampleZoneName}`;mock:`__NOT_EXIST_ZONE__99999`。
---
## 基础设置 · 库房管理
### 库区设置 · 页面进入
#### 功能验证点
##### 【P0】【TC-UI-WH-ZON-001】【TP_WH_ZON_001】菜单进入库区设置页
- 前置条件:已进入库区设置页
- 操作步骤:
1. 按菜单「基础设置 → 库房管理 → 库区设置」进入,或 `openPath` 打开 `/spd/basic/storehouse/platform/storehouse/area`
2. 断言 URL 含 `/spd/basic/storehouse/platform/storehouse/area`
3. 断言左侧「库房信息」树、右侧库区列表、「新 增」与分页可见
- 自动化断言:规划与 CSV `WH-ZON-001` 及 `tests/spd/warehouse-zone.spec.ts` 一致
###### 预期结果
进入库区设置页;不误入探针绑定;无报错遮罩。
---
#### 异常验证点
##### 【P0】【TC-UI-WH-ZON-002】【TP_WH_ZON_005】未登录访问拦截
- 前置条件:已进入库区设置页
- 操作步骤:
1. 清除登录态后直接打开 `/spd/basic/storehouse/platform/storehouse/area`
2. 断言跳转登录或不展示库房/库区业务数据
- 自动化断言:规划与 CSV `WH-ZON-002` 及 `tests/spd/warehouse-zone.spec.ts` 一致
###### 预期结果
未登录不可见库区数据。
---
### 库区设置 · 左侧库房树
#### 功能验证点
##### 【P0】【TC-UI-WH-ZON-003】【TP_WH_ZON_009】库房树默认有选中项
- 前置条件:已进入库区设置页
- 操作步骤:
1. 断言左侧「库房信息」至少 1 个节点且有选中项
2. 读取选中节点 `${sampleWhName}`
3. 断言右侧列表为该库房库区,或空态且「共 0 条」
- 自动化断言:规划与 CSV `WH-ZON-003` 及 `tests/spd/warehouse-zone.spec.ts` 一致
###### 预期结果
树有选中;右侧对应当前库房。
---
##### 【P0】【TC-UI-WH-ZON-004】【TP_WH_ZON_010】按库房名称过滤树
- 前置条件:库房树至少 1 个节点
- 操作步骤:
1. 读取当前选中 `${sampleWhName}` 取关键字(可截取前若干字)
2. 在左侧「库房名称」输入关键字
3. 断言可见节点名称均包含该关键字
- 自动化断言:规划与 CSV `WH-ZON-004` 及 `tests/spd/warehouse-zone.spec.ts` 一致
###### 预期结果
树过滤结果与关键字匹配。
---
##### 【P1】【TC-UI-WH-ZON-005】【TP_WH_ZON_011】清空库房名称恢复全量树
- 前置条件:已进入库区设置页
- 操作步骤:
1. 记录过滤前节点数
2. 输入关键字过滤后再清空
3. 断言节点数恢复为过滤前
- 自动化断言:规划与 CSV `WH-ZON-005` 及 `tests/spd/warehouse-zone.spec.ts` 一致
###### 预期结果
清空后树恢复全量。
---
##### 【P0】【TC-UI-WH-ZON-006】【TP_WH_ZON_012】切换库房刷新右侧列表
- 前置条件:已进入库区设置页
- 操作步骤:
1. 记录当前库房 `${sampleWhName}` 与右侧首行库区编号(若有)
2. 点选另一库房节点(仅 1 个则 skip)
3. 断言「共 N 条」可变化;若有行则库区编号/名称属于新库房
- 自动化断言:规划与 CSV `WH-ZON-006` 及 `tests/spd/warehouse-zone.spec.ts` 一致
###### 预期结果
切换库房后右侧列表刷新,不残留上一库房库区。
---
#### 异常验证点
##### 【P1】【TC-UI-WH-ZON-007】【TP_WH_ZON_015】无匹配库房空树(mock反例)
- 前置条件:已进入库区设置页
- 操作步骤:
1. 库房名称填入 `__NOT_EXIST_ZONE__99999`
2. 断言树为空或明确无数据,右侧不展示上一库房库区为成功态
- 自动化断言:规划与 CSV `WH-ZON-007` 及 `tests/spd/warehouse-zone.spec.ts` 一致
###### 预期结果
无匹配不报错;不残留上一库房列表当成功。
---
### 库区设置 · 右侧库区列表与分页
#### 功能验证点
##### 【P0】【TC-UI-WH-ZON-008】【TP_WH_ZON_018】列表核心列完整
- 前置条件:已进入库区设置页
- 操作步骤:
1. 断言表头含库区编号、库区名称、库区地址、是否专项库区、操作
2. 若有数据行,断言操作列可见「编辑」「人员管理」「货位管理」及「停用」或「启用」
- 自动化断言:规划与 CSV `WH-ZON-008` 及 `tests/spd/warehouse-zone.spec.ts` 一致
###### 预期结果
核心列完整;行内操入口可见。
---
##### 【P0】【TC-UI-WH-ZON-009】【TP_WH_ZON_019】默认库区以标签展示
- 前置条件:已进入库区设置页
- 操作步骤:
1. 在当前库房列表中查找「默认库区」标签
2. 断言该标签出现在库区名称旁,不是独立列
3. 断言当前库房至多 1 个默认库区标签(无默认则本条只断言不是独立列)
- 自动化断言:规划与 CSV `WH-ZON-009` 及 `tests/spd/warehouse-zone.spec.ts` 一致
###### 预期结果
默认库区为名称旁标签;同一库房至多一个。
---
### 库区设置 · 库区搜索
#### 功能验证点
##### 【P0】【TC-UI-WH-ZON-010】【TP_WH_ZON_029】按库区编号搜索
- 前置条件:当前库房至少 1 条库区且编号非空
- 操作步骤:
1. 从首行读取 `${sampleZoneNo}`
2. 在「库区编号/名称」填入该编号并触发搜索
3. 断言结果包含该编号行,且均属于当前选中库房
- 自动化断言:规划与 CSV `WH-ZON-010` 及 `tests/spd/warehouse-zone.spec.ts` 一致
###### 预期结果
搜索命中该编号;不串其它库房。
---
##### 【P0】【TC-UI-WH-ZON-011】【TP_WH_ZON_030】按库区名称搜索
- 前置条件:当前库房至少 1 条且名称非空
- 操作步骤:
1. 从首行读取 `${sampleZoneName}` 取关键字
2. 在「库区编号/名称」填入关键字并搜索
3. 断言结果行名称匹配
- 自动化断言:规划与 CSV `WH-ZON-011` 及 `tests/spd/warehouse-zone.spec.ts` 一致
###### 预期结果
名称关键字命中;无未捕获异常。
---
#### 异常验证点
##### 【P1】【TC-UI-WH-ZON-012】【TP_WH_ZON_034】无匹配库区空态(mock反例)
- 前置条件:已进入库区设置页
- 操作步骤:
1. 「库区编号/名称」填入 `__NOT_EXIST_ZONE__99999` 并搜索
2. 断言列表空且分页为 0
- 自动化断言:规划与 CSV `WH-ZON-012` 及 `tests/spd/warehouse-zone.spec.ts` 一致
###### 预期结果
无匹配不报错;总数为 0。
---
### 库区设置 · 新增库区
#### 功能验证点
##### 【P0】【TC-UI-WH-ZON-013】【TP_WH_ZON_036】打开新增库区弹窗
- 前置条件:已进入库区设置页
- 操作步骤:
1. 点击「新 增」
2. 断言弹出「新增库区」,可见库区编号、库区名称、库区地址、联系人、联系方式及「取 消」「确 定」
- 自动化断言:规划与 CSV `WH-ZON-013` 及 `tests/spd/warehouse-zone.spec.ts` 一致
###### 预期结果
新增弹窗可见;关键字段与按钮齐全。
---
##### 【P1】【TC-UI-WH-ZON-014】【TP_WH_ZON_038】新增取消不落库
- 前置条件:已进入库区设置页
- 操作步骤:
1. 打开新增,编号填 `AUTO${timestamp}`,名称填任意合法值
2. 点击「取 消」
3. 按该编号搜索,断言无该记录
- 自动化断言:规划与 CSV `WH-ZON-014` 及 `tests/spd/warehouse-zone.spec.ts` 一致
###### 预期结果
弹窗关闭;列表不出现该编号。
---
#### 异常验证点
##### 【P0】【TC-UI-WH-ZON-015】【TP_WH_ZON_041】必填为空拦截
- 前置条件:已进入库区设置页
- 操作步骤:
1. 打开新增,库区编号或名称留空后点击「确 定」
2. 断言出现必填提示,弹窗仍打开
3. 点「取 消」
- 自动化断言:规划与 CSV `WH-ZON-015` 及 `tests/spd/warehouse-zone.spec.ts` 一致
###### 预期结果
确定被拦截;不落库;弹窗不关闭。
---
### 库区设置 · 编辑库区
#### 功能验证点
##### 【P0】【TC-UI-WH-ZON-016】【TP_WH_ZON_046】打开编辑并回填
- 前置条件:当前库房至少 1 条库区
- 操作步骤:
1. 点击首行「编辑」
2. 断言弹窗标题含「编辑库区信息」
3. 断言库区编号、名称与该行 `${sampleZoneNo}`、`${sampleZoneName}` 一致(允许规范化空白)
4. 点「取 消」
- 自动化断言:规划与 CSV `WH-ZON-016` 及 `tests/spd/warehouse-zone.spec.ts` 一致
###### 预期结果
编辑弹窗可见;回填与列表行一致。
---
##### 【P1】【TC-UI-WH-ZON-017】【TP_WH_ZON_048】编辑取消不保存
- 前置条件:当前库房至少 1 条库区
- 操作步骤:
1. 打开首行编辑,记录原名称
2. 将名称改为临时值后点「取 消」
3. 再次打开编辑,断言名称仍为原值
- 自动化断言:规划与 CSV `WH-ZON-017` 及 `tests/spd/warehouse-zone.spec.ts` 一致
###### 预期结果
取消后列表与回看均为修改前名称。
---
#### 异常验证点
##### 【P0】【TC-UI-WH-ZON-018】【TP_WH_ZON_052】编辑清空必填拦截
- 前置条件:当前库房至少 1 条库区
- 操作步骤:
1. 打开首行编辑,清空库区名称后点「确 定」
2. 断言被拦截并提示,弹窗仍开
3. 点「取 消」,断言列表名称未被写成空
- 自动化断言:规划与 CSV `WH-ZON-018` 及 `tests/spd/warehouse-zone.spec.ts` 一致
###### 预期结果
清空必填不能保存;原记录名称保持。
---
### 库区设置 · 人员管理
#### 功能验证点
##### 【P0】【TC-UI-WH-ZON-019】【TP_WH_ZON_061】打开人员管理后关闭
- 前置条件:当前库房至少 1 条库区
- 操作步骤:
1. 点击首行「人员管理」
2. 断言打开弹层或子页,标题含人员管理或对应当前库区
3. 关闭后断言仍在库区设置,当前库房选中保持
- 自动化断言:规划与 CSV `WH-ZON-019` 及 `tests/spd/warehouse-zone.spec.ts` 一致
###### 预期结果
人员管理可打开;关闭后回到当前库房列表。本条不改人员。
---
### 库区设置 · 货位管理
#### 功能验证点
##### 【P0】【TC-UI-WH-ZON-020】【TP_WH_ZON_066】打开货位管理后关闭
- 前置条件:当前库房至少 1 条库区
- 操作步骤:
1. 点击首行「货位管理」
2. 断言打开弹层或子页,标题含货位且对应当前库区
3. 关闭后断言库房选中与库区列表保持
- 自动化断言:规划与 CSV `WH-ZON-020` 及 `tests/spd/warehouse-zone.spec.ts` 一致
###### 预期结果
货位管理可打开;关闭后列表状态保持。本条不改货位。
## 质量与覆盖说明
| 项 | 说明 |
|----|------|
| 用例数 | **20** 条(P0=15 / P1=5) |
| 来源 | 从 74 条测试点选取可稳定自动化的主路径与关键反向 |
| 未纳入自动化 | 真实保存新增/编辑、停用启用持久化、接口失败注入、会话过期、无菜单权限、人员/货位子页字段细节 |
| 单一职责 | 每条只断言一个核心业务结果 |
| 独立性 | 每条独立 `open()`,不复用 BrowserContext;不依赖上一条写结果 |
# 基础管理-库房管理-探针绑定 UI 自动化测试用例
**来源测试点**:`testpoint/基础管理-库房管理-探针绑定-测试点分析-01.md`
**执行 CSV**:`testcase/基础管理-库房管理-探针绑定-UI自动化测试用例-01.csv`
**页面 URL**:`/spd/basic/storehouse/storehouse/probe`
**定位器 YAML**:`locators/spd/warehouse-probe.locator.yaml`
**元素扫描**:`data/scan/warehouse-probe-elements.json`(78 项)
**关联规范**:`knowledge-base/08-UI专项规范库/UI-SPEC-SPD-WH-002.md`
**版本**:2026-10-20
**自动化框架**:Playwright + TypeScript(规划 `tests/spd/warehouse-probe.spec.ts`,依赖 `auth.setup` 登录态)
**通用前置**:正例账号 `test_1` 经 `auth.setup` 写入 `storageState`(密码仅存 `.env` 的 `TEST_PASS`);具备「基础设置 → 库房管理 → 探针绑定」权限。反例筛选用 mock。
**页面约定**:整页渲染,**无报表 iframe**;定位均在 `page` 上。
**菜单导航**:菜单「基础设置 → 库房管理 → 探针绑定」;建议 `openPath('/spd/basic/storehouse/storehouse/probe')` 并断言 URL。
**写操作**:绑定货位只打开弹窗后取消,不点确定保存;不改绑定关系。
**动态取数**:查询后从首行读取 `${sampleProbeId}`、`${sampleHostCode}`、`${sampleBindFlag}`、`${sampleBindCount}`;mock:`__NOT_EXIST_PROBE__99999`。
---
## 基础设置 · 库房管理
### 探针绑定 · 页面进入
#### 功能验证点
##### 【P0】【TC-UI-WH-PRB-001】【TP_WH_PRB_001】菜单进入探针绑定页
- 前置条件:已进入探针绑定页
- 操作步骤:
1. 按菜单「基础设置 → 库房管理 → 探针绑定」进入,或 `openPath` 打开 `/spd/basic/storehouse/storehouse/probe`
2. 断言 URL 含 `/spd/basic/storehouse/storehouse/probe`
3. 断言探针ID、主机编码、是否绑定货位、查询、重置、列表与分页可见
- 自动化断言:规划与 CSV `WH-PRB-001` 及 `tests/spd/warehouse-probe.spec.ts` 一致
###### 预期结果
进入探针绑定页;不误入库区设置。
---
#### 异常验证点
##### 【P0】【TC-UI-WH-PRB-002】【TP_WH_PRB_005】未登录访问拦截
- 前置条件:已进入探针绑定页
- 操作步骤:
1. 清除登录态后直接打开 `/spd/basic/storehouse/storehouse/probe`
2. 断言跳转登录或不展示探针业务列表
- 自动化断言:规划与 CSV `WH-PRB-002` 及 `tests/spd/warehouse-probe.spec.ts` 一致
###### 预期结果
未登录不可见探针数据。
---
### 探针绑定 · 筛选与查询
#### 功能验证点
##### 【P0】【TC-UI-WH-PRB-003】【TP_WH_PRB_009】默认查询列表有数据或空态明确
- 前置条件:已进入探针绑定页
- 操作步骤:
1. 点击「查 询」并等待列表稳定
2. 断言出现数据行,或「暂无数据」且分页总数为 0
- 自动化断言:规划与 CSV `WH-PRB-003` 及 `tests/spd/warehouse-probe.spec.ts` 一致
###### 预期结果
查询无报错;有数据时「共 N 条」N≥1。
---
##### 【P0】【TC-UI-WH-PRB-004】【TP_WH_PRB_010】按探针ID查询
- 前置条件:默认查询至少 1 条且探针ID非空
- 操作步骤:
1. 从首行读取 `${sampleProbeId}`
2. 探针ID填入该值,点击「查 询」
3. 断言结果探针ID匹配,精确命中时行数合理
- 自动化断言:规划与 CSV `WH-PRB-004` 及 `tests/spd/warehouse-probe.spec.ts` 一致
###### 预期结果
探针ID条件生效。
---
##### 【P0】【TC-UI-WH-PRB-005】【TP_WH_PRB_011】按主机编码查询
- 前置条件:默认查询至少 1 条且主机编码非空
- 操作步骤:
1. 从首行读取 `${sampleHostCode}`
2. 主机编码填入该值,点击「查 询」
3. 断言结果行「主机编码」与条件一致
- 自动化断言:规划与 CSV `WH-PRB-005` 及 `tests/spd/warehouse-probe.spec.ts` 一致
###### 预期结果
主机编码条件生效;允许多探针共用同一主机。
---
##### 【P0】【TC-UI-WH-PRB-006】【TP_WH_PRB_012】按是否绑定货位查询
- 前置条件:已进入探针绑定页
- 操作步骤:
1. 是否绑定货位选择「已绑定」,点击「查 询」
2. 断言结果「是否绑定货位」均为已绑定,且「绑定的货位」>0
3. 再选「未绑定」查询,断言均为未绑定且数量为 0(无数据则空态)
- 自动化断言:规划与 CSV `WH-PRB-006` 及 `tests/spd/warehouse-probe.spec.ts` 一致
###### 预期结果
已绑定数量大于 0;未绑定数量为 0。
---
##### 【P0】【TC-UI-WH-PRB-007】【TP_WH_PRB_013】探针ID+主机编码组合查询
- 前置条件:默认查询至少 1 条
- 操作步骤:
1. 填写 `${sampleProbeId}` 与 `${sampleHostCode}` 后点击「查 询」
2. 断言结果同时满足已填条件
- 自动化断言:规划与 CSV `WH-PRB-007` 及 `tests/spd/warehouse-probe.spec.ts` 一致
###### 预期结果
组合条件同时生效。
---
##### 【P1】【TC-UI-WH-PRB-008】【TP_WH_PRB_014】重置恢复默认
- 前置条件:已进入探针绑定页
- 操作步骤:
1. 填写探针ID后点击「重 置」
2. 断言条件恢复默认,列表按默认规则刷新
- 自动化断言:规划与 CSV `WH-PRB-008` 及 `tests/spd/warehouse-probe.spec.ts` 一致
###### 预期结果
条件恢复默认;列表刷新。
---
#### 异常验证点
##### 【P1】【TC-UI-WH-PRB-009】【TP_WH_PRB_018】无匹配空态(mock反例)
- 前置条件:已进入探针绑定页
- 操作步骤:
1. 探针ID填入 `__NOT_EXIST_PROBE__99999`,点击「查 询」
2. 断言空态且分页总数为 0
- 自动化断言:规划与 CSV `WH-PRB-009` 及 `tests/spd/warehouse-probe.spec.ts` 一致
###### 预期结果
无匹配不报错;总数为 0。
---
### 探针绑定 · 列表与分页
#### 功能验证点
##### 【P0】【TC-UI-WH-PRB-010】【TP_WH_PRB_020】列表核心列与数量规则
- 前置条件:已进入探针绑定页
- 操作步骤:
1. 断言表头含序号、探针ID、主机编码、是否绑定货位、绑定的货位、操作
2. 抽样已绑定行:绑定数量为数字且 >0;抽样未绑定行:数量为 0
3. 断言「绑定的货位」列不是货位号格式
- 自动化断言:规划与 CSV `WH-PRB-010` 及 `tests/spd/warehouse-probe.spec.ts` 一致
###### 预期结果
核心列完整;数量列是数字不是货位号。
---
### 探针绑定 · 打开绑定货位弹窗
#### 功能验证点
##### 【P0】【TC-UI-WH-PRB-011】【TP_WH_PRB_030】行内打开货位绑定探针
- 前置条件:列表至少 1 条
- 操作步骤:
1. 点击首行「绑定货位」
2. 断言弹出「货位绑定探针」,可见当前库房/库区/货位查询及货位列表
- 自动化断言:规划与 CSV `WH-PRB-011` 及 `tests/spd/warehouse-probe.spec.ts` 一致
###### 预期结果
弹窗标题正确;筛选与列表可见。
---
##### 【P1】【TC-UI-WH-PRB-012】【TP_WH_PRB_031】取消关闭不改主列表
- 前置条件:列表至少 1 条
- 操作步骤:
1. 记录主列表首行绑定数量与当前筛选
2. 打开绑定弹窗后点「取 消」
3. 断言主列表绑定数量与筛选条件保持
- 自动化断言:规划与 CSV `WH-PRB-012` 及 `tests/spd/warehouse-probe.spec.ts` 一致
###### 预期结果
取消不改绑定关系。
---
#### 边界验证点
##### 【P1】【TC-UI-WH-PRB-013】【TP_WH_PRB_032】未选货位时确定计数为 0
- 前置条件:列表至少 1 条
- 操作步骤:
1. 打开绑定弹窗,不勾选货位
2. 断言底部按钮文案为「确定(0)」或等价
3. 点「取 消」,不点确定保存
- 自动化断言:规划与 CSV `WH-PRB-013` 及 `tests/spd/warehouse-probe.spec.ts` 一致
###### 预期结果
未选时计数为 0;本条不保存绑定。
---
#### 集成验证点
##### 【P1】【TC-UI-WH-PRB-014】【TP_WH_PRB_034】弹窗分页独立于主列表
- 前置条件:列表至少 1 条
- 操作步骤:
1. 记录主列表「共 N 条」
2. 打开绑定弹窗,记录弹窗分页「共 M 条」
3. 断言不得用 M 断言主列表 N(货位量级可远大于探针条数)
4. 点「取 消」
- 自动化断言:规划与 CSV `WH-PRB-014` 及 `tests/spd/warehouse-probe.spec.ts` 一致
###### 预期结果
弹窗总条数与主列表探针条数相互独立。
---
### 探针绑定 · 弹窗筛选货位
#### 功能验证点
##### 【P0】【TC-UI-WH-PRB-015】【TP_WH_PRB_035】按当前库房筛选货位
- 前置条件:列表至少 1 条
- 操作步骤:
1. 打开绑定弹窗,记录默认 `${sampleModalWh}`
2. 点「查 询」
3. 断言可见行「当前库房」与所选库房一致(有数据时)
4. 点「取 消」
- 自动化断言:规划与 CSV `WH-PRB-015` 及 `tests/spd/warehouse-probe.spec.ts` 一致
###### 预期结果
弹窗库房条件生效。
---
##### 【P1】【TC-UI-WH-PRB-016】【TP_WH_PRB_038】弹窗内重置
- 前置条件:列表至少 1 条
- 操作步骤:
1. 打开绑定弹窗,填写货位查询关键字后点「重 置」
2. 断言货位查询条件恢复,列表按弹窗默认规则刷新
3. 点「取 消」
- 自动化断言:规划与 CSV `WH-PRB-016` 及 `tests/spd/warehouse-probe.spec.ts` 一致
###### 预期结果
弹窗重置不影响主列表筛选。
---
### 探针绑定 · 勾选货位并保存绑定
#### 功能验证点
##### 【P1】【TC-UI-WH-PRB-017】【TP_WH_PRB_043】勾选后确定计数增加再取消勾选
- 前置条件:弹窗货位列表至少 1 条
- 操作步骤:
1. 打开绑定弹窗,勾选 1 个货位
2. 断言确定按钮计数为 1
3. 取消该勾选,断言计数回到 0
4. 点「取 消」,不保存
- 自动化断言:规划与 CSV `WH-PRB-017` 及 `tests/spd/warehouse-probe.spec.ts` 一致
###### 预期结果
计数随勾选变化;取消勾选不落库。
## 质量与覆盖说明
| 项 | 说明 |
|----|------|
| 用例数 | **17** 条(P0=10 / P1=7) |
| 来源 | 从 49 条测试点选取可稳定自动化的主路径与关键反向 |
| 未纳入自动化 | 真实勾选确定绑定、换绑/占用规则落库、接口失败、会话过期、无菜单权限 |
| 单一职责 | 每条只断言一个核心业务结果 |
| 独立性 | 每条独立 `open()`,不复用 BrowserContext;不依赖上一条写结果 |
# 基础管理-手术套包设置-基础包维护 UI 自动化测试用例
**来源测试点**:`testpoint/基础管理-手术套包设置-基础包维护-测试点分析-01.md`
**执行 CSV**:`testcase/基础管理-手术套包设置-基础包维护-UI自动化测试用例-01.csv`
**页面 URL**:`/spd/basic/operationSetting/baseMaintenance`
**定位器 YAML**:`locators/spd/surgery-base-pkg.locator.yaml`
**元素扫描**:`data/scan/surgery-base-pkg-elements.json`(87 项)
**关联规范**:`knowledge-base/08-UI专项规范库/UI-SPEC-SPD-SURG-001.md`
**版本**:2026-10-13
**自动化框架**:Playwright + TypeScript(规划 `tests/spd/surgery-base-pkg.spec.ts`,依赖 `auth.setup` 登录态)
**通用前置**:已执行 `auth.setup`,`storageState` 有效(已通过 `auth.setup` 写入,用例内不重复登录);测试账号具备「基础设置 → 手术套包设置 → 基础包维护」权限。
**测试数据**:正例复用 `auth.setup` 写入的登录态;反例使用 mock 数据(无匹配关键字 `__NOT_EXIST_BASE__99999`、空必填项),不依赖真实业务数据。
**页面约定**:整页渲染,**无报表 iframe**;左右分栏(左分类树 + 右列表)。
**菜单导航**:`page.getByRole('menuitem', { name: '基础包维护', exact: true })`(注意与「术种维护」「标准套包维护」区分)。
**写操作**:基础包名称使用 `${uniqPkgName}`(建议 `AUTO-BASE-${timestamp}`),包编码使用 `${uniqPkgCode}`;用例结束按环境约定清理,禁止写死生产基础包。
**动态取数约定**:
1. 打开页面后从左树读取 `${sampleCategoryName}`,从右侧首行读取 `${sampleProductCode}`、`${sampleProductName}`、`${sampleSpecModel}`、`${sampleMfrsName}`。
2. 筛选关键字使用样本占位,**禁止写死**产品/注册人名称;mock 无匹配值:`__NOT_EXIST_BASE__99999`。
3. 左侧分类搜索框 `categorySearchInput`、分类弹窗名称框 `basePkgCategoryName`(`#form_item_kindName`)。
---
## 基础设置 · 手术套包设置
### 基础包维护 · 左侧分类树
#### 功能验证点
##### 【P0】【TC-UI-SURG-BASE-001】【TP_SURG_BASE_009】分类名称搜索过滤
- 前置条件:左侧树至少 1 个非空分类节点
- 操作步骤:
1. 从树读取 `${sampleCategoryName}`
2. 在 `categorySearchInput` 填入该关键字(即时过滤或回车,以现网为准)
3. 断言树节点文本均包含该关键字
- 自动化断言:规划与 CSV `SURG-BASE-001` 一致
###### 预期结果
过滤后树节点名称与关键字匹配;无未捕获异常。
---
##### 【P0】【TC-UI-SURG-BASE-002】【TP_SURG_BASE_010】选择分类联动右侧列表
- 前置条件:左侧树至少 1 个分类节点,右侧有数据
- 操作步骤:
1. 点击 `${sampleCategoryName}` 节点
2. 等待右侧列表刷新稳定
3. 断言列表首屏加载无报错,分页「共 N 条」与当前分类规模一致
- 自动化断言:规划与 CSV `SURG-BASE-002` 一致
###### 预期结果
右侧仅展示该分类下基础包;总数与筛选一致。
---
##### 【P1】【TC-UI-SURG-BASE-003】【TP_SURG_BASE_012】打开新增分类弹窗
- 前置条件:已进入基础包维护页
- 操作步骤:
1. 点击「新增分类」
2. 断言弹窗可见,含分类名称输入(`basePkgCategoryName`)与「取 消」「确 认」
3. 点击「取 消」关闭
- 自动化断言:规划与 CSV `SURG-BASE-003` 一致
###### 预期结果
新增分类弹窗字段完整;取消可关闭。
---
#### 边界验证点
##### 【P2】【TC-UI-SURG-BASE-004】【TP_SURG_BASE_013】分类搜索清空恢复全量
- 前置条件:已用 `${sampleCategoryName}` 过滤
- 操作步骤:
1. 记录过滤后节点数
2. 清空 `categorySearchInput`
3. 断言节点数回到未过滤的默认集合(或不少于过滤后节点数)
- 自动化断言:规划与 CSV `SURG-BASE-004` 一致
###### 预期结果
清空后分类树恢复默认集合。
---
### 基础包维护 · 右侧筛选与列表
#### 功能验证点
##### 【P0】【TC-UI-SURG-BASE-005】【TP_SURG_BASE_017】默认列出基础包或空态明确
- 前置条件:已进入基础包维护页
- 操作步骤:
1. 等待列表稳定
2. 断言出现数据行,或「暂无数据」且分页总数为 0
- 自动化断言:规划与 CSV `SURG-BASE-005` 一致
###### 预期结果
加载无报错;有数据时「共 N 条」N≥1;无数据时空态明确。
---
##### 【P0】【TC-UI-SURG-BASE-006】【TP_SURG_BASE_018】产品名称筛选过滤
- 前置条件:默认列表至少 1 条数据
- 操作步骤:
1. 从首行读取 `${sampleProductName}`
2. 在 `productName`(`#table_search_form_keyword`)填入该关键字
3. 点击「查 询」,断言结果行产品名称均包含该关键字
- 自动化断言:规划与 CSV `SURG-BASE-006` 一致
###### 预期结果
过滤结果与关键字匹配;「共 N 条」随之更新。
---
##### 【P0】【TC-UI-SURG-BASE-007】【TP_SURG_BASE_019】规格型号筛选过滤
- 前置条件:默认列表至少 1 条数据且含规格型号
- 操作步骤:
1. 从首行读取 `${sampleSpecModel}`
2. 在 `specModel`(`#table_search_form_goodsSpec`)填入该关键字
3. 点击「查 询」,断言结果行规格型号均包含该关键字
- 自动化断言:规划与 CSV `SURG-BASE-007` 一致
###### 预期结果
按规格型号过滤生效。
---
##### 【P0】【TC-UI-SURG-BASE-008】【TP_SURG_BASE_020】器械注册人筛选过滤
- 前置条件:默认列表至少 1 条数据
- 操作步骤:
1. 从首行读取 `${sampleMfrsName}`
2. 在 `manufacturer`(`#table_search_form_goodsMfrsName`)填入该关键字
3. 点击「查 询」,断言结果行器械注册人均包含该关键字
- 自动化断言:规划与 CSV `SURG-BASE-008` 一致
###### 预期结果
按器械注册人过滤生效。
---
##### 【P0】【TC-UI-SURG-BASE-009】【TP_SURG_BASE_022】列表核心列完整
- 前置条件:默认列表至少 1 条数据
- 操作步骤:
1. 断言表头包含序号、产品编号、产品名称、规格型号、器械注册人、单位、产地、耗材类型、操作
- 自动化断言:规划与 CSV `SURG-BASE-009` 一致
###### 预期结果
核心列均可见,操作列含「编 辑」「移 除」。
---
##### 【P1】【TC-UI-SURG-BASE-010】【TP_SURG_BASE_023】查询与重置
- 前置条件:已用关键字过滤
- 操作步骤:
1. 点击「重 置」
2. 断言筛选输入框被清空、列表恢复默认集合
- 自动化断言:规划与 CSV `SURG-BASE-010` 一致
###### 预期结果
重置清空筛选并恢复默认列表。
---
##### 【P1】【TC-UI-SURG-BASE-011】【TP_SURG_BASE_024】分页与页大小切换
- 前置条件:默认列表总数大于单页行数上限
- 操作步骤:
1. 切换每页条数(如 50 → 100)
2. 断言单页行数不超过所选值,分页总数不变
- 自动化断言:规划与 CSV `SURG-BASE-011` 一致
###### 预期结果
页大小切换生效;总数保持稳定。
---
#### 边界验证点
##### 【P2】【TC-UI-SURG-BASE-012】【TP_SURG_BASE_026】首页上一页不可用
- 前置条件:已进入第 1 页
- 操作步骤:
1. 断言「上一页」置灰或点击无效果
- 自动化断言:规划与 CSV `SURG-BASE-012` 一致
###### 预期结果
第 1 页无法回到上一页。
---
#### 异常验证点
##### 【P1】【TC-UI-SURG-BASE-013】【TP_SURG_BASE_028】搜索无匹配空态
- 前置条件:已进入基础包维护页
- 操作步骤:
1. 在 `productName` 输入不存在关键字 `__NOT_EXIST_BASE__99999`
2. 点击「查 询」
3. 断言「暂无数据」且分页总数为 0
- 自动化断言:规划与 CSV `SURG-BASE-013` 一致
###### 预期结果
无匹配时空态明确,不白屏。
---
### 基础包维护 · 新增基础包
#### 功能验证点
##### 【P0】【TC-UI-SURG-BASE-014】【TP_SURG_BASE_030】打开新增基础包弹窗
- 前置条件:已进入基础包维护页
- 操作步骤:
1. 点击「新增基础包」
2. 断言弹窗可见,含基础包名称(`basePkgName`)、所属分类(`basePkgCategory`)、包编码(`basePkgCode`)、备注(`remark`)
3. 断言含「取 消」「确 认」
- 自动化断言:规划与 CSV `SURG-BASE-014` 一致
###### 预期结果
新增基础包弹窗字段完整(名称/所属分类/包编码/备注)。
---
##### 【P0】【TC-UI-SURG-BASE-015】【TP_SURG_BASE_034】新增取消不落库
- 前置条件:已进入基础包维护页
- 操作步骤:
1. 记录当前分页总数 `${sampleTotal}`
2. 打开新增,填写名称 `${uniqPkgName}` 后点「取 消」
3. 断言列表总数不变,且无该名称行
- 自动化断言:规划与 CSV `SURG-BASE-015` 一致
###### 预期结果
取消后不新增基础包。
---
##### 【P0】【TC-UI-SURG-BASE-016】【TP_SURG_BASE_031】合法必填新增成功
- 前置条件:允许写基础包;名称 `${uniqPkgName}`、编码 `${uniqPkgCode}`
- 操作步骤:
1. 打开新增,填写名称、所属分类、包编码
2. 点击「确 认」
3. 断言弹窗关闭,列表出现该名称行且字段一致
4. 后置:按环境约定清理该基础包,避免污染主数据
- 自动化断言:规划与 CSV `SURG-BASE-016` 一致;环境禁止写则 skip
###### 预期结果
新增成功且列表可见;用例结束清理,不留生产脏数据。
---
#### 异常验证点
##### 【P0】【TC-UI-SURG-BASE-017】【TP_SURG_BASE_037】基础包名称为空拦截
- 前置条件:已打开新增基础包弹窗
- 操作步骤:
1. 名称留空,补齐所属分类与包编码后点「确 认」
2. 断言必填提示,弹窗仍在,列表无新行
- 自动化断言:规划与 CSV `SURG-BASE-017` 一致
###### 预期结果
确定被拦截;不落库。
---
##### 【P0】【TC-UI-SURG-BASE-018】【TP_SURG_BASE_038】所属分类为空拦截
- 前置条件:已打开新增基础包弹窗
- 操作步骤:
1. 填写名称与包编码,不选所属分类,点「确 认」
2. 断言必填提示,弹窗仍在
- 自动化断言:规划与 CSV `SURG-BASE-018` 一致
###### 预期结果
确定被拦截;不落库。
---
##### 【P1】【TC-UI-SURG-BASE-019】【TP_SURG_BASE_040】重复点击确定防重
- 前置条件:已打开新增弹窗并填写合法数据
- 操作步骤:
1. 快速连点「确 认」两次
2. 断言只产生一条基础包(或无重复名称/编码行)
- 自动化断言:规划与 CSV `SURG-BASE-019` 一致;环境禁止写则 skip
###### 预期结果
连点只落一条;无重复脏数据。
---
### 基础包维护 · 行内操作(编辑 / 移除)
#### 功能验证点
##### 【P0】【TC-UI-SURG-BASE-020】【TP_SURG_BASE_043】行内编辑回填
- 前置条件:列表至少 1 条数据
- 操作步骤:
1. 从首行读取 `${sampleProductCode}`
2. 点击行内「编 辑」
3. 断言编辑弹窗可见且回填当前行数据
4. 点击「取 消」关闭
- 自动化断言:规划与 CSV `SURG-BASE-020` 一致
###### 预期结果
编辑弹窗回填正确;取消不影响数据。
---
#### 异常验证点
##### 【P0】【TC-UI-SURG-BASE-021】【TP_SURG_BASE_046】移除二次确认防误删
- 前置条件:列表至少 1 条数据
- 操作步骤:
1. 记录当前总数为 `${sampleTotal}`
2. 点击首行「移 除」
3. 断言出现确认框,点击「取 消」
4. 断言总数仍为 `${sampleTotal}`
- 自动化断言:规划与 CSV `SURG-BASE-021` 一致
###### 预期结果
移除有二次确认;取消不删除。
---
#### 集成验证点
##### 【P1】【TC-UI-SURG-BASE-022】【TP_SURG_BASE_042】新增基础包可在标准套包被引用
- 前置条件:已新增 `${uniqPkgName}` 且未清理
- 操作步骤:
1. 进入「标准套包维护」,点击「添加基础包」
2. 在弹窗搜索框输入 `${uniqPkgName}`
3. 断言可检索到该基础包并可勾选
4. 后置:清理该基础包
- 自动化断言:规划与 CSV `SURG-BASE-022` 一致;环境禁止写则 skip
###### 预期结果
新增基础包在标准套包可选;跨页数据一致。
---
## 质量与覆盖说明
| 项 | 说明 |
|----|------|
| 用例数 | **22** 条(P0=14 / P1=6 / P2=2) |
| 来源 | 从 49 条测试点选取可稳定自动化的主路径与关键反向 |
| 未纳入自动化 | 未登录权限矩阵、分类增删主数据联动、编辑保存落库、被套包引用时移除策略、列表接口异常注入 |
| 数据隔离 | 新增必须用唯一名称/编码并清理;编辑/移除不改生产主数据 |
| 单一职责 | 每条只断言一个核心业务结果 |
# 基础管理-手术套包设置-术种维护 UI 自动化测试用例
**来源测试点**:`testpoint/基础管理-手术套包设置-术种维护-测试点分析-01.md`
**执行 CSV**:`testcase/基础管理-手术套包设置-术种维护-UI自动化测试用例-01.csv`
**页面 URL**:`/spd/basic/operationSetting/typeMaintenance`
**定位器 YAML**:`locators/spd/surgery-oper-type.locator.yaml`
**元素扫描**:`data/scan/surgery-oper-type-elements.json`(69 项)
**关联规范**:`knowledge-base/08-UI专项规范库/UI-SPEC-SPD-SURG-002.md`
**版本**:2026-10-13
**自动化框架**:Playwright + TypeScript(规划 `tests/spd/surgery-oper-type.spec.ts`,依赖 `auth.setup` 登录态)
**通用前置**:已执行 `auth.setup`,`storageState` 有效(已通过 `auth.setup` 写入,用例内不重复登录);测试账号具备「基础设置 → 手术套包设置 → 术种维护」权限。
**测试数据**:正例复用 `auth.setup` 写入的登录态;反例使用 mock 数据(无匹配关键字 `__NOT_EXIST_OPER__99999`、空必填项),不依赖真实业务数据。
**页面约定**:整页渲染,**无报表 iframe**;左右分栏(左术种分类树 + 右筛选/状态 Tab/列表)。
**菜单导航**:`page.getByRole('menuitem', { name: '术种维护', exact: true })`(注意与「基础包维护」「标准套包维护」区分)。
**写操作**:术种名称使用 `${uniqOperName}`(建议 `AUTO-OPER-${timestamp}`);停用为写操作,用例结束按环境约定恢复/清理,禁止写死生产术种。
**动态取数约定**:
1. 打开页面后从左树读取 `${sampleOperCategoryName}`,从右侧首行读取 `${sampleOperName}`、`${sampleDiseaseName}`、`${sampleIcd10Code}`、`${sampleIcd9Code}`。
2. 筛选关键字使用样本占位,**禁止写死**术种/病种名称;mock 无匹配值:`__NOT_EXIST_OPER__99999`。
3. 状态 Tab 定位:`tab`(全部)/「停用」/「未建分类」,切换后断言括号计数与列表规模一致。
4. 分类搜索框 `operTypeCategoryInput`;分类维护弹窗名称框 `operTypeCategoryName`(`#basic_kindName`)。
---
## 基础设置 · 手术套包设置
### 术种维护 · 页面进入
#### 功能验证点
##### 【P0】【TC-UI-SURG-TYPE-001】【TP_SURG_TYPE_001】菜单进入术种维护页
- 前置条件:已登录且具备手术套包设置权限
- 操作步骤:
1. 按菜单「基础设置 → 手术套包设置 → 术种维护」进入
2. 断言 URL 含 `/spd/basic/operationSetting/typeMaintenance`
3. 断言左侧分类树(`operTypeCategoryInput`)、右侧筛选区、状态 Tab、列表与分页可见
- 自动化断言:规划与 CSV `SURG-TYPE-001` 及 `tests/spd/surgery-oper-type.spec.ts` 一致
###### 预期结果
进入术种维护页;不误入基础包维护/标准套包维护;左右分栏渲染完整。
---
##### 【P1】【TC-UI-SURG-TYPE-002】【TP_SURG_TYPE_003】同组页签切换后返回
- 前置条件:已进入术种维护页
- 操作步骤:
1. 点击页内 Tab 「标准套包维护」,等待 URL 切换
2. 返回点击 Tab 「术种维护」
3. 断言 URL 回到 `typeMaintenance`,左树与状态 Tab 重新渲染
- 自动化断言:规划与 CSV `SURG-TYPE-002` 一致
###### 预期结果
三页签互切正常;返回后本页数据恢复。
---
#### 异常验证点
##### 【P0】【TC-UI-SURG-TYPE-003】【TP_SURG_TYPE_005】未登录访问拦截
- 前置条件:`test.use({ storageState: { cookies: [], origins: [] } })` 无登录态
- 操作步骤:
1. 直接访问 `/spd/basic/operationSetting/typeMaintenance`
2. 断言跳转登录页或不展示术种列表数据
- 自动化断言:规划与 CSV `SURG-TYPE-003` 一致
###### 预期结果
未登录被拦截,不泄露术种数据。
---
### 术种维护 · 左侧术种分类树
#### 功能验证点
##### 【P0】【TC-UI-SURG-TYPE-004】【TP_SURG_TYPE_009】术种分类名称搜索过滤
- 前置条件:左侧树至少 1 个非空分类节点
- 操作步骤:
1. 从树读取 `${sampleOperCategoryName}`
2. 在 `operTypeCategoryInput` 填入该关键字(即时过滤或回车,以现网为准)
3. 断言树节点文本均包含该关键字
- 自动化断言:规划与 CSV `SURG-TYPE-004` 一致
###### 预期结果
过滤后树节点名称与关键字匹配;无未捕获异常。
---
##### 【P0】【TC-UI-SURG-TYPE-005】【TP_SURG_TYPE_010】选择分类联动右侧列表
- 前置条件:左侧树至少 1 个分类节点,右侧有数据
- 操作步骤:
1. 点击 `${sampleOperCategoryName}` 节点
2. 等待右侧列表刷新稳定
3. 断言列表加载无报错,分页「共 N 条」与当前分类规模一致
- 自动化断言:规划与 CSV `SURG-TYPE-005` 一致
###### 预期结果
右侧仅展示该分类下术种;总数与筛选一致。
---
##### 【P1】【TC-UI-SURG-TYPE-006】【TP_SURG_TYPE_011】分类树计数与下钻
- 前置条件:至少 1 个带计数的分类节点
- 操作步骤:
1. 读取某分类节点括号内计数 `${nodeCount}`
2. 点击该节点,断言右侧「共 N 条」与 `${nodeCount}` 一致
- 自动化断言:规划与 CSV `SURG-TYPE-006` 一致
###### 预期结果
分类计数与该分类下术种条数一致。
---
##### 【P1】【TC-UI-SURG-TYPE-007】【TP_SURG_TYPE_013】打开分类维护弹窗
- 前置条件:已进入术种维护页
- 操作步骤:
1. 点击左侧「新增」
2. 断言弹窗可见,含分类名称输入(`operTypeCategoryName`)与「取 消」「保 存」
3. 点击「取 消」关闭
- 自动化断言:规划与 CSV `SURG-TYPE-007` 一致
###### 预期结果
分类维护弹窗字段完整;取消可关闭。
---
#### 边界验证点
##### 【P2】【TC-UI-SURG-TYPE-008】【TP_SURG_TYPE_014】分类搜索清空恢复全量
- 前置条件:已用 `${sampleOperCategoryName}` 过滤
- 操作步骤:
1. 记录过滤后节点数
2. 清空 `operTypeCategoryInput`
3. 断言节点数回到未过滤的默认集合
- 自动化断言:规划与 CSV `SURG-TYPE-008` 一致
###### 预期结果
清空后分类树恢复默认集合。
---
### 术种维护 · 筛选与状态 Tab
#### 功能验证点
##### 【P0】【TC-UI-SURG-TYPE-009】【TP_SURG_TYPE_018】术种名称筛选过滤
- 前置条件:默认列表至少 1 条数据
- 操作步骤:
1. 从首行读取 `${sampleOperName}`
2. 在 `operationName`(`#table_search_form_operationName`)填入该关键字
3. 点击「查 询」,断言结果行术种名称均包含该关键字
- 自动化断言:规划与 CSV `SURG-TYPE-009` 一致
###### 预期结果
过滤结果与关键字匹配;「共 N 条」随之更新。
---
##### 【P0】【TC-UI-SURG-TYPE-010】【TP_SURG_TYPE_019】病种名称筛选过滤
- 前置条件:默认列表至少 1 条数据且含病种名称
- 操作步骤:
1. 从首行读取 `${sampleDiseaseName}`
2. 在 `diseaseName`(`#table_search_form_disease`)填入该关键字
3. 点击「查 询」,断言结果行病种名称均包含该关键字
- 自动化断言:规划与 CSV `SURG-TYPE-010` 一致
###### 预期结果
按病种名称过滤生效。
---
##### 【P0】【TC-UI-SURG-TYPE-011】【TP_SURG_TYPE_020】状态 Tab 切换与计数一致
- 前置条件:已进入术种维护页
- 操作步骤:
1. 读取「全部」Tab 括号计数 `${totalCount}`
2. 依次点击「停用」「未建分类」「全部」
3. 每次断言列表条数与「共 N 条」和该 Tab 括号计数一致
- 自动化断言:规划与 CSV `SURG-TYPE-011` 一致
###### 预期结果
Tab 切换后列表仅展示对应状态;括号计数与结果规模一致。
---
##### 【P1】【TC-UI-SURG-TYPE-012】【TP_SURG_TYPE_022】左树 + 筛选 + Tab 组合过滤
- 前置条件:左侧至少 1 个分类节点、右侧至少 1 条数据
- 操作步骤:
1. 选择 `${sampleOperCategoryName}` 节点
2. 填入术种名称关键字并点「查 询」
3. 切到「全部」Tab,断言结果为三者交集且无未捕获异常
- 自动化断言:规划与 CSV `SURG-TYPE-012` 一致
###### 预期结果
三条件叠加后结果正确,总数一致。
---
##### 【P1】【TC-UI-SURG-TYPE-013】【TP_SURG_TYPE_021】重置清空筛选
- 前置条件:已用关键字过滤
- 操作步骤:
1. 点击「重 置」
2. 断言筛选输入框被清空、列表恢复默认集合
- 自动化断言:规划与 CSV `SURG-TYPE-013` 一致
###### 预期结果
重置清空筛选并恢复默认列表。
---
#### 边界验证点
##### 【P2】【TC-UI-SURG-TYPE-014】【TP_SURG_TYPE_023】无匹配组合空态
- 前置条件:已进入术种维护页
- 操作步骤:
1. 在 `operationName` 输入不存在关键字 `__NOT_EXIST_OPER__99999`
2. 点击「查 询」
3. 断言「暂无数据」且分页总数为 0
- 自动化断言:规划与 CSV `SURG-TYPE-014` 一致
###### 预期结果
无匹配时空态明确,不白屏。
---
### 术种维护 · 列表与编码展示
#### 功能验证点
##### 【P0】【TC-UI-SURG-TYPE-015】【TP_SURG_TYPE_027】列表核心列完整
- 前置条件:默认列表至少 1 条数据
- 操作步骤:
1. 断言表头包含序号、术种名称、病种名称、诊断编码(ICD-10)、诊断名称(ICD-10)、操作编码(ICD-9-CM-3)、操作名称(ICD-9-CM-3)、操作
- 自动化断言:规划与 CSV `SURG-TYPE-015` 一致
###### 预期结果
核心列均可见,操作列含「编 辑」「停用/启用」。
---
##### 【P1】【TC-UI-SURG-TYPE-016】【TP_SURG_TYPE_028】ICD-10 诊断编码展示完整
- 前置条件:列表中至少 1 条含诊断编码的数据
- 操作步骤:
1. 读取含 ICD-10 编码的行 `${sampleIcd10Code}`
2. 断言编码文本完整(如 `A02.000x010`)不截断、无乱码
- 自动化断言:规划与 CSV `SURG-TYPE-016` 一致
###### 预期结果
ICD-10 编码完整展示。
---
##### 【P2】【TC-UI-SURG-TYPE-017】【TP_SURG_TYPE_029】ICD-9-CM-3 操作编码展示完整
- 前置条件:列表中至少 1 条含操作编码的数据
- 操作步骤:
1. 读取含操作编码的行 `${sampleIcd9Code}`
2. 断言操作编码(如 `00.0200`)与操作名称(如 `心脏治疗性超声`)对应展示无乱码
- 自动化断言:规划与 CSV `SURG-TYPE-017` 一致
###### 预期结果
ICD-9-CM-3 编码与操作名称对应正确。
---
##### 【P1】【TC-UI-SURG-TYPE-018】【TP_SURG_TYPE_030】分页与页大小切换
- 前置条件:默认列表总数大于单页行数上限
- 操作步骤:
1. 切换每页条数(如 50 → 100)
2. 断言单页行数不超过所选值,分页总数不变
- 自动化断言:规划与 CSV `SURG-TYPE-018` 一致
###### 预期结果
页大小切换生效;总数保持稳定。
---
#### 边界验证点
##### 【P2】【TC-UI-SURG-TYPE-019】【TP_SURG_TYPE_032】首页上一页不可用
- 前置条件:已进入第 1 页
- 操作步骤:
1. 断言「上一页」置灰或点击无效果
- 自动化断言:规划与 CSV `SURG-TYPE-019` 一致
###### 预期结果
第 1 页无法回到上一页。
---
### 术种维护 · 新增术种
#### 功能验证点
##### 【P0】【TC-UI-SURG-TYPE-020】【TP_SURG_TYPE_035】打开新增术种入口
- 前置条件:已进入术种维护页
- 操作步骤:
1. 点击「新增术种」
2. 断言新增弹窗/页面可见,含术种名称、病种名称、分类与编码相关字段
3. 断言含「取 消」「保 存」
- 自动化断言:规划与 CSV `SURG-TYPE-020` 一致
###### 预期结果
新增术种入口字段完整。
---
##### 【P0】【TC-UI-SURG-TYPE-021】【TP_SURG_TYPE_038】新增取消不落库
- 前置条件:已进入术种维护页
- 操作步骤:
1. 记录当前分页总数 `${sampleTotal}`
2. 打开新增,填写名称 `${uniqOperName}` 后点「取 消」
3. 断言列表总数不变,且无该名称行
- 自动化断言:规划与 CSV `SURG-TYPE-021` 一致
###### 预期结果
取消后不新增术种。
---
#### 异常验证点
##### 【P0】【TC-UI-SURG-TYPE-022】【TP_SURG_TYPE_040】术种名称为空拦截
- 前置条件:已打开新增术种弹窗
- 操作步骤:
1. 名称留空,点「保 存」
2. 断言必填提示,弹窗仍在,列表无新行
- 自动化断言:规划与 CSV `SURG-TYPE-022` 一致
###### 预期结果
保存被拦截;不落库。
---
### 术种维护 · 行内操作(编辑 / 停用)
#### 功能验证点
##### 【P0】【TC-UI-SURG-TYPE-023】【TP_SURG_TYPE_045】行内编辑回填
- 前置条件:列表至少 1 条数据
- 操作步骤:
1. 点击首行「编 辑」
2. 断言编辑弹窗可见且回填当前术种数据
3. 点击「取 消」关闭
- 自动化断言:规划与 CSV `SURG-TYPE-023` 一致
###### 预期结果
编辑弹窗回填正确;取消不影响数据。
---
##### 【P1】【TC-UI-SURG-TYPE-024】【TP_SURG_TYPE_046】停用状态流转
- 前置条件:列表中存在启用状态术种(优先选 `${uniqOperName}` 自建数据)
- 操作步骤:
1. 记录「停用」Tab 当前计数 `${disabledCount}`
2. 点击目标行「停用」,若有确认框则点「确 定」
3. 断言「停用」Tab 计数 +1
4. 后置:对该术种执行「启用」恢复
- 自动化断言:规划与 CSV `SURG-TYPE-024` 一致;环境禁止写则 skip
###### 预期结果
术种状态变为停用;「停用」计数 +1;结束恢复原状态。
---
#### 异常验证点
##### 【P0】【TC-UI-SURG-TYPE-025】【TP_SURG_TYPE_049】停用二次确认防误操作
- 前置条件:列表中存在启用状态术种
- 操作步骤:
1. 记录「停用」Tab 当前计数
2. 点击首行「停用」
3. 若出现确认框则点「取 消」
4. 断言计数未变化
- 自动化断言:规划与 CSV `SURG-TYPE-025` 一致
###### 预期结果
停用有二次确认;取消不改状态。
---
## 质量与覆盖说明
| 项 | 说明 |
|----|------|
| 用例数 | **25** 条(P0=13 / P1=8 / P2=4) |
| 来源 | 从 53 条测试点选取可稳定自动化的主路径与关键反向 |
| 未纳入自动化 | 未登录权限矩阵、分类新增落库、新增术种保存落库、ICD 字典一致性、停用后下游不可选联调 |
| 数据隔离 | 新增/停用使用唯一名称并恢复/清理;不改生产术种状态 |
| 单一职责 | 每条只断言一个核心业务结果 |
# 基础管理-手术套包设置-标准套包维护 UI 自动化测试用例
**来源测试点**:`testpoint/基础管理-手术套包设置-标准套包维护-测试点分析-01.md`
**执行 CSV**:`testcase/基础管理-手术套包设置-标准套包维护-UI自动化测试用例-01.csv`
**页面 URL**:`/spd/basic/operationSetting/standardMaintenance`
**定位器 YAML**:`locators/spd/surgery-std-pkg.locator.yaml`
**元素扫描**:`data/scan/surgery-std-pkg-elements.json`(61 项)
**关联规范**:`knowledge-base/08-UI专项规范库/UI-SPEC-SPD-SURG-003.md`
**版本**:2026-10-13
**自动化框架**:Playwright + TypeScript(规划 `tests/spd/surgery-std-pkg.spec.ts`,依赖 `auth.setup` 登录态)
**通用前置**:已执行 `auth.setup`,`storageState` 有效(已通过 `auth.setup` 写入,用例内不重复登录);测试账号具备「基础设置 → 手术套包设置 → 标准套包维护」权限。
**测试数据**:正例复用 `auth.setup` 写入的登录态;反例使用 mock 数据(无匹配关键字 `__NOT_EXIST_STD__99999`、空必填项),不依赖真实业务数据。
**页面约定**:整页渲染,**无报表 iframe**;左右分栏(左术种分类树 + 右标准套包构成列表);含两级嵌套弹窗。
**菜单导航**:`page.getByRole('menuitem', { name: '标准套包维护', exact: true })`(注意与「基础包维护」「术种维护」区分)。
**写操作**:涉及新增/编辑/移除构成项,用例结束按环境约定恢复/清理,禁止写死生产套包。
**动态取数约定**:
1. 打开页面后从左树读取 `${sampleOperCategoryName}`,从右侧首行读取 `${samplePkgGroupName}`、`${sampleProductCode}`、`${sampleProductName}`、`${sampleSpecModel}`、`${sampleMfrsName}`。
2. 筛选关键字使用样本占位,**禁止写死**产品/注册人名称;mock 无匹配值:`__NOT_EXIST_STD__99999`。
3. 构成列表按「包名称」分组,操作前需先**展开目标包**(`expandFilterBtn` / 包名称展开节点);断言时避免全量断言。
4. 弹窗:添加基础包 `addBasePkgSearchInput`(`请输入分类/基础包名称`)与数量步进器;添加散件 `stdPkgTreeSearchInput`(`请输入术种分类名称、术种名称、标准套包名称`)、应拣明细统计耗材品种数/耗材总数。
---
## 基础设置 · 手术套包设置
### 标准套包维护 · 页面进入
#### 功能验证点
##### 【P0】【TC-UI-SURG-STD-001】【TP_SURG_STD_001】菜单进入标准套包维护页
- 前置条件:已登录且具备手术套包设置权限
- 操作步骤:
1. 按菜单「基础设置 → 手术套包设置 → 标准套包维护」进入
2. 断言 URL 含 `/spd/basic/operationSetting/standardMaintenance`
3. 断言左侧分类树、右侧筛选区、构成列表与分页可见
- 自动化断言:规划与 CSV `SURG-STD-001` 及 `tests/spd/surgery-std-pkg.spec.ts` 一致
###### 预期结果
进入标准套包维护页;不误入基础包维护/术种维护;左右分栏渲染完整。
---
##### 【P1】【TC-UI-SURG-STD-002】【TP_SURG_STD_003】同组页签切换后返回
- 前置条件:已进入标准套包维护页
- 操作步骤:
1. 点击页内 Tab 「术种维护」,等待 URL 切换
2. 返回点击 Tab 「标准套包维护」
3. 断言 URL 回到 `standardMaintenance`,左树与构成列表重新渲染
- 自动化断言:规划与 CSV `SURG-STD-002` 一致
###### 预期结果
三页签互切正常;返回后本页数据恢复。
---
#### 异常验证点
##### 【P0】【TC-UI-SURG-STD-003】【TP_SURG_STD_005】未登录访问拦截
- 前置条件:`test.use({ storageState: { cookies: [], origins: [] } })` 无登录态
- 操作步骤:
1. 直接访问 `/spd/basic/operationSetting/standardMaintenance`
2. 断言跳转登录页或不展示套包列表数据
- 自动化断言:规划与 CSV `SURG-STD-003` 一致
###### 预期结果
未登录被拦截,不泄露套包数据。
---
### 标准套包维护 · 左侧术种分类树
#### 功能验证点
##### 【P0】【TC-UI-SURG-STD-004】【TP_SURG_STD_009】术种分类名称搜索过滤
- 前置条件:左侧树至少 1 个非空分类节点
- 操作步骤:
1. 从树读取 `${sampleOperCategoryName}`
2. 在分类搜索框填入该关键字(即时过滤或回车,以现网为准)
3. 断言树节点文本均包含该关键字
- 自动化断言:规划与 CSV `SURG-STD-004` 一致
###### 预期结果
过滤后树节点名称与关键字匹配;无未捕获异常。
---
##### 【P0】【TC-UI-SURG-STD-005】【TP_SURG_STD_010】选择分类联动构成列表
- 前置条件:左侧树至少 1 个分类节点,右侧有数据
- 操作步骤:
1. 点击 `${sampleOperCategoryName}` 节点
2. 等待右侧构成列表刷新稳定
3. 断言列表加载无报错,分页「共 N 条」与当前分类规模一致
- 自动化断言:规划与 CSV `SURG-STD-005` 一致
###### 预期结果
右侧仅展示该分类下标准套包;总数与筛选一致。
---
##### 【P2】【TC-UI-SURG-STD-006】【TP_SURG_STD_013】分类搜索清空恢复全量
- 前置条件:已用 `${sampleOperCategoryName}` 过滤
- 操作步骤:
1. 记录过滤后节点数
2. 清空分类搜索框
3. 断言节点数回到未过滤的默认集合
- 自动化断言:规划与 CSV `SURG-STD-006` 一致
###### 预期结果
清空后分类树恢复默认集合。
---
### 标准套包维护 · 筛选与构成列表
#### 功能验证点
##### 【P0】【TC-UI-SURG-STD-007】【TP_SURG_STD_017】默认展示标准套包构成
- 前置条件:已进入标准套包维护页
- 操作步骤:
1. 等待列表稳定
2. 断言按「包名称」分组出现数据行,或「暂无数据」且分页总数为 0
- 自动化断言:规划与 CSV `SURG-STD-007` 一致
###### 预期结果
加载无报错;有数据时「共 N 条」N≥1;无数据时空态明确。
---
##### 【P0】【TC-UI-SURG-STD-008】【TP_SURG_STD_018】产品名称筛选过滤
- 前置条件:默认列表至少 1 条数据
- 操作步骤:
1. 从首行读取 `${sampleProductName}`
2. 在 `productName`(`#table_search_form_keyword`)填入该关键字
3. 点击「查 询」,断言结果行产品名称均包含该关键字
- 自动化断言:规划与 CSV `SURG-STD-008` 一致
###### 预期结果
过滤结果与关键字匹配;「共 N 条」随之更新。
---
##### 【P1】【TC-UI-SURG-STD-009】【TP_SURG_STD_019】规格型号筛选过滤
- 前置条件:默认列表至少 1 条数据且含规格型号
- 操作步骤:
1. 从首行读取 `${sampleSpecModel}`
2. 在 `specModel`(`#table_search_form_goodsSpec`)填入该关键字
3. 点击「查 询」,断言结果行规格型号均包含该关键字
- 自动化断言:规划与 CSV `SURG-STD-009` 一致
###### 预期结果
按规格型号过滤生效。
---
##### 【P1】【TC-UI-SURG-STD-010】【TP_SURG_STD_020】器械注册人筛选过滤
- 前置条件:默认列表至少 1 条数据
- 操作步骤:
1. 从首行读取 `${sampleMfrsName}`
2. 在 `manufacturer`(`#table_search_form_goodsMfrsName`)填入该关键字
3. 点击「查 询」,断言结果行器械注册人均包含该关键字
- 自动化断言:规划与 CSV `SURG-STD-010` 一致
###### 预期结果
按器械注册人过滤生效。
---
##### 【P0】【TC-UI-SURG-STD-011】【TP_SURG_STD_022】构成列表核心列完整
- 前置条件:默认列表至少 1 条数据且存在分组
- 操作步骤:
1. 断言表头/首行包含包名称、包数量/每包含量、产品编号、产品名称、规格型号、器械注册人、单位、产地、耗材类型、操作
- 自动化断言:规划与 CSV `SURG-STD-011` 一致
###### 预期结果
核心列均可见,操作列含「编 辑」「移 除」。
---
##### 【P0】【TC-UI-SURG-STD-012】【TP_SURG_STD_023】包名称展开/收起子项
- 前置条件:列表中存在可展开的包分组
- 操作步骤:
1. 读取首个包分组名称 `${samplePkgGroupName}`
2. 点击展开该分组,断言出现子项行
3. 再次点击收起,断言子项行隐藏
- 自动化断言:规划与 CSV `SURG-STD-012` 一致
###### 预期结果
展开显示子项、收起隐藏子项;分组计数不受影响。
---
##### 【P1】【TC-UI-SURG-STD-013】【TP_SURG_STD_024】查询与重置
- 前置条件:已用关键字过滤
- 操作步骤:
1. 点击「重 置」
2. 断言筛选输入框被清空、列表恢复默认集合
- 自动化断言:规划与 CSV `SURG-STD-013` 一致
###### 预期结果
重置清空筛选并恢复默认列表。
---
##### 【P1】【TC-UI-SURG-STD-014】【TP_SURG_STD_025】分页与页大小切换
- 前置条件:默认列表总数大于单页行数上限
- 操作步骤:
1. 切换每页条数(如 50 → 100)
2. 断言单页行数不超过所选值,分页总数不变
- 自动化断言:规划与 CSV `SURG-STD-014` 一致
###### 预期结果
页大小切换生效;总数保持稳定。
---
#### 边界验证点
##### 【P2】【TC-UI-SURG-STD-015】【TP_SURG_STD_027】无匹配组合空态
- 前置条件:已进入标准套包维护页
- 操作步骤:
1. 在 `productName` 输入不存在关键字 `__NOT_EXIST_STD__99999`
2. 点击「查 询」
3. 断言「暂无数据」且分页总数为 0
- 自动化断言:规划与 CSV `SURG-STD-015` 一致
###### 预期结果
无匹配时空态明确,不白屏。
---
### 标准套包维护 · 添加基础包弹窗
#### 功能验证点
##### 【P0】【TC-UI-SURG-STD-016】【TP_SURG_STD_032】打开添加基础包弹窗
- 前置条件:已进入标准套包维护页
- 操作步骤:
1. 点击「添加基础包」
2. 断言弹窗可见,含左侧基础包分类树与右侧基础包明细
3. 断言含「取 消」「确定(N)」
- 自动化断言:规划与 CSV `SURG-STD-016` 一致
###### 预期结果
添加基础包弹窗字段完整;确定按钮带选择计数。
---
##### 【P0】【TC-UI-SURG-STD-017】【TP_SURG_STD_033】弹窗内筛选与选择计数联动
- 前置条件:已打开添加基础包弹窗
- 操作步骤:
1. 在 `addBasePkgSearchInput` 输入基础包关键字
2. 勾选 1 个基础包
3. 断言「确定(N)」计数由 0 变为 1
- 自动化断言:规划与 CSV `SURG-STD-017` 一致
###### 预期结果
筛选生效;选择数与确定按钮计数联动。
---
##### 【P1】【TC-UI-SURG-STD-018】【TP_SURG_STD_034】弹窗内构成数量可编辑
- 前置条件:已勾选至少 1 个基础包
- 操作步骤:
1. 定位明细行「构成数量」步进器,点击「Increase Value」
2. 断言数量 +1 且合计随之更新
- 自动化断言:规划与 CSV `SURG-STD-018` 一致
###### 预期结果
构成数量可编辑;加减生效。
---
##### 【P0】【TC-UI-SURG-STD-019】【TP_SURG_STD_036】添加基础包取消不落库
- 前置条件:已进入标准套包维护页
- 操作步骤:
1. 记录当前分页总数 `${sampleTotal}`
2. 打开添加基础包,勾选 1 个基础包后点「取 消」
3. 断言构成列表总数不变
- 自动化断言:规划与 CSV `SURG-STD-019` 一致
###### 预期结果
取消后不新增构成行。
---
#### 边界验证点
##### 【P2】【TC-UI-SURG-STD-020】【TP_SURG_STD_037】确定按钮零选禁用
- 前置条件:已打开添加基础包弹窗且未选择
- 操作步骤:
1. 断言「确定(0)」置灰或点击无效果
- 自动化断言:规划与 CSV `SURG-STD-020` 一致
###### 预期结果
未选择时确定不可用。
---
#### 异常验证点
##### 【P1】【TC-UI-SURG-STD-021】【TP_SURG_STD_038】重复添加同一基础包
- 前置条件:标准套包已含某基础包(或先添加一个)
- 操作步骤:
1. 再次打开添加基础包,选择同一基础包并确定
2. 断言按产品规则拒绝/合并/累加,不产生重复脏行
- 自动化断言:规划与 CSV `SURG-STD-021` 一致;环境禁止写则 skip
###### 预期结果
重复添加不产生重复行(策略以现网为准)。
---
### 标准套包维护 · 添加散件弹窗
#### 功能验证点
##### 【P0】【TC-UI-SURG-STD-022】【TP_SURG_STD_041】打开添加散件弹窗
- 前置条件:已进入标准套包维护页
- 操作步骤:
1. 点击「添加散件」
2. 断言弹窗可见并展示「产品列表」视图,含产品名称/规格型号/器械注册人/耗材类型筛选与分页
- 自动化断言:规划与 CSV `SURG-STD-022` 一致
###### 预期结果
添加散件弹窗产品列表视图完整。
---
##### 【P0】【TC-UI-SURG-STD-023】【TP_SURG_STD_042】产品列表筛选与选择散件
- 前置条件:已打开添加散件弹窗
- 操作步骤:
1. 在产品名称筛选框输入 `${sampleProductName}`
2. 勾选首个匹配散件
3. 断言散件进入应拣明细,计数同步变化
- 自动化断言:规划与 CSV `SURG-STD-023` 一致
###### 预期结果
筛选生效;选中散件进入应拣明细。
---
##### 【P0】【TC-UI-SURG-STD-024】【TP_SURG_STD_043】散件规格/应拣明细视图
- 前置条件:已勾选至少 1 个散件
- 操作步骤:
1. 切换到规格明细/应拣明细视图
2. 断言展示耗材品种数、耗材总数,以及应拣数量、产品编号/名称/规格/注册人/单位/耗材类型/是否收费列
- 自动化断言:规划与 CSV `SURG-STD-024` 一致
###### 预期结果
应拣明细视图字段完整。
---
##### 【P1】【TC-UI-SURG-STD-025】【TP_SURG_STD_044】明细统计与实际一致
- 前置条件:应拣明细含至少 1 个散件
- 操作步骤:
1. 读取「耗材品种数」`${itemKindCount}` 与「耗材总数」`${itemTotalCount}`
2. 断言品种数 = 明细去重产品数;总数 = 应拣数量合计
- 自动化断言:规划与 CSV `SURG-STD-025` 一致
###### 预期结果
统计口径与实际所选一致。
---
##### 【P0】【TC-UI-SURG-STD-026】【TP_SURG_STD_046】添加散件取消不落库
- 前置条件:已进入标准套包维护页
- 操作步骤:
1. 记录当前分页总数 `${sampleTotal}`
2. 打开添加散件,勾选散件后点「取 消」
3. 断言构成列表总数不变
- 自动化断言:规划与 CSV `SURG-STD-026` 一致
###### 预期结果
取消后不新增散件行。
---
#### 边界验证点
##### 【P2】【TC-UI-SURG-STD-027】【TP_SURG_STD_047】万级散件列表首屏可交互
- 前置条件:添加散件产品列表总量达万级(示例「共 16299 条」)
- 操作步骤:
1. 打开添加散件弹窗
2. 断言首屏可交互(筛选/分页可用),不卡死
3. 避免全量断言,仅校验首行与总数格式
- 自动化断言:规划与 CSV `SURG-STD-027` 一致
###### 预期结果
万级列表首屏可用;无超时白屏。
---
### 标准套包维护 · 行内操作(编辑 / 移除)
#### 功能验证点
##### 【P0】【TC-UI-SURG-STD-028】【TP_SURG_STD_052】行内编辑构成项
- 前置条件:构成列表至少 1 条数据(先展开目标包)
- 操作步骤:
1. 点击子项行「编 辑」
2. 断言编辑弹窗/表单可见并回填当前值
3. 点击「取 消」关闭
- 自动化断言:规划与 CSV `SURG-STD-028` 一致
###### 预期结果
编辑回填正确;取消不影响数据。
---
#### 异常验证点
##### 【P0】【TC-UI-SURG-STD-029】【TP_SURG_STD_055】移除二次确认防误删整包
- 前置条件:构成列表至少 1 条数据(先展开目标包)
- 操作步骤:
1. 记录当前行数
2. 点击子项行「移 除」
3. 若出现确认框则点「取 消」
4. 断言行数未变化
- 自动化断言:规划与 CSV `SURG-STD-029` 一致
###### 预期结果
移除有二次确认;取消不删除。
---
## 质量与覆盖说明
| 项 | 说明 |
|----|------|
| 用例数 | **29** 条(P0=17 / P1=8 / P2=4) |
| 来源 | 从 57 条测试点选取可稳定自动化的主路径与关键反向 |
| 未纳入自动化 | 未登录权限矩阵、添加基础包/散件保存落库、散件提交接口失败、编辑保存、跨页套包可用性联调、移除整包 |
| 数据隔离 | 新增/编辑/移除使用样本或唯一数据并恢复/清理;不改生产套包构成 |
| 单一职责 | 每条只断言一个核心业务结果 |
| 特殊说明 | 构成列表按包名称分组,操作前先展开目标包;万级散件列表避免全量断言 |
# 基础管理-流程设置-审批流实例 UI 自动化测试用例
**来源测试点**:`testpoint/基础管理-流程设置-审批流实例-测试点分析-01.md`
**执行 CSV**:`testcase/基础管理-流程设置-审批流实例-UI自动化测试用例-01.csv`
**页面 URL**:`/spd/basic/flowSet/workflow/flowCase`
**定位器 YAML**:`locators/spd/flow-inst.locator.yaml`
**元素扫描**:`data/scan/flow-inst-elements.json`(62 项)
**关联规范**:`knowledge-base/08-UI专项规范库/UI-SPEC-SPD-FLOW-002.md`
**版本**:2026-10-20
**自动化框架**:Playwright + TypeScript(规划 `tests/spd/flow-inst.spec.ts`,依赖 `auth.setup` 登录态)
**通用前置**:正例账号 `test_1` 经 `auth.setup` 写入 `storageState`(密码仅存 `.env` 的 `TEST_PASS`);具备「基础设置 → 流程设置 → 审批流实例」权限。反例筛选用 mock。
**页面约定**:整页渲染,**无报表 iframe**;定位均在 `page` 上。
**菜单导航**:菜单「基础设置 → 流程设置 → 审批流实例」;建议 `openPath('/spd/basic/flowSet/workflow/flowCase')`,不要点到审批流程设置。
**写操作**:本页只读。详情只打开后返回,不改审批人。断言「共 N 条」前先收窄日期。
**动态取数**:查询后从首行读取 `${sampleOrderNo}`、`${sampleBizType}`、`${sampleStatus}`、`${sampleSummary}`;mock:`__NOT_EXIST_FLOW__99999`。
---
## 基础设置 · 流程设置
### 审批流实例 · 页面进入
#### 功能验证点
##### 【P0】【TC-UI-FLOW-INS-001】【TP_FLOW_INS_001】菜单进入审批流实例页
- 前置条件:已进入审批流实例页
- 操作步骤:
1. 按菜单「基础设置 → 流程设置 → 审批流实例」进入,或 `openPath` 打开 `/spd/basic/flowSet/workflow/flowCase`
2. 断言 URL 含 `/spd/basic/flowSet/workflow/flowCase`
3. 断言单据编号、审批状态、发起时间、业务类型、摘要、查询、重置、列表与分页可见
- 自动化断言:规划与 CSV `FLOW-INS-001` 及 `tests/spd/flow-inst.spec.ts` 一致
###### 预期结果
进入审批流实例;不误入审批流程设置。
---
#### 异常验证点
##### 【P0】【TC-UI-FLOW-INS-002】【TP_FLOW_INS_005】未登录访问拦截
- 前置条件:已进入审批流实例页
- 操作步骤:
1. 清除登录态后直接打开 `/spd/basic/flowSet/workflow/flowCase`
2. 断言跳转登录或不展示审批单据列表
- 自动化断言:规划与 CSV `FLOW-INS-002` 及 `tests/spd/flow-inst.spec.ts` 一致
###### 预期结果
未登录不可见审批实例。
---
### 审批流实例 · 筛选与查询
#### 功能验证点
##### 【P0】【TC-UI-FLOW-INS-003】【TP_FLOW_INS_009】默认日期区间查询
- 前置条件:已进入审批流实例页
- 操作步骤:
1. 点击「查 询」并等待列表稳定
2. 断言出现数据行或空态明确,「共 N 条」与结果逻辑一致
- 自动化断言:规划与 CSV `FLOW-INS-003` 及 `tests/spd/flow-inst.spec.ts` 一致
###### 预期结果
默认查询无报错;有数据时 N≥1。
---
##### 【P0】【TC-UI-FLOW-INS-004】【TP_FLOW_INS_010】单据编号精确查询
- 前置条件:默认查询至少 1 条且单据编号非空
- 操作步骤:
1. 从首行读取 `${sampleOrderNo}`
2. 单据编号填入完整单号,点击「查 询」
3. 断言至多 1 条,且编号、业务类型与该行一致
- 自动化断言:规划与 CSV `FLOW-INS-004` 及 `tests/spd/flow-inst.spec.ts` 一致
###### 预期结果
精确单号命中当前行。
---
##### 【P0】【TC-UI-FLOW-INS-005】【TP_FLOW_INS_011】按审批状态筛选
- 前置条件:已进入审批流实例页
- 操作步骤:
1. 审批状态下拉选择「审批通过」(无该选项则选列表中已出现的状态)
2. 点击「查 询」
3. 断言结果「审批状态」列与所选一致
- 自动化断言:规划与 CSV `FLOW-INS-005` 及 `tests/spd/flow-inst.spec.ts` 一致
###### 预期结果
状态筛选生效。
---
##### 【P0】【TC-UI-FLOW-INS-006】【TP_FLOW_INS_012】按业务类型筛选
- 前置条件:默认查询至少 1 条
- 操作步骤:
1. 从首行读取 `${sampleBizType}`
2. 业务类型选择该值,点击「查 询」
3. 断言结果「业务类型」均为该类型
- 自动化断言:规划与 CSV `FLOW-INS-006` 及 `tests/spd/flow-inst.spec.ts` 一致
###### 预期结果
业务类型筛选生效。
---
##### 【P0】【TC-UI-FLOW-INS-007】【TP_FLOW_INS_013】按发起时间区间筛选
- 前置条件:已进入审批流实例页
- 操作步骤:
1. 记录当前默认起止日期
2. 点击「查 询」
3. 抽样结果行「发起时间」落在起止日内(含边界)
- 自动化断言:规划与 CSV `FLOW-INS-007` 及 `tests/spd/flow-inst.spec.ts` 一致
###### 预期结果
发起时间落在区间内。
---
##### 【P1】【TC-UI-FLOW-INS-008】【TP_FLOW_INS_014】按摘要关键字筛选
- 前置条件:已进入审批流实例页
- 操作步骤:
1. 找到摘要非 `--` 的行读取 `${sampleSummary}` 关键字;若全为 `--` 则填 mock 关键字
2. 点击「查 询」
3. 有关键字命中时摘要包含该关键字;mock 无命中时空态且 `--` 行不被命中
- 自动化断言:规划与 CSV `FLOW-INS-008` 及 `tests/spd/flow-inst.spec.ts` 一致
###### 预期结果
非空摘要可检索;`--` 不被非空关键字命中。
---
##### 【P0】【TC-UI-FLOW-INS-009】【TP_FLOW_INS_015】状态+类型组合查询
- 前置条件:默认查询至少 1 条
- 操作步骤:
1. 填写 `${sampleStatus}` 与 `${sampleBizType}` 后点击「查 询」
2. 断言抽样行同时满足全部已填条件
- 自动化断言:规划与 CSV `FLOW-INS-009` 及 `tests/spd/flow-inst.spec.ts` 一致
###### 预期结果
组合条件同时生效。
---
##### 【P1】【TC-UI-FLOW-INS-010】【TP_FLOW_INS_016】重置恢复默认
- 前置条件:已进入审批流实例页
- 操作步骤:
1. 填写单据编号等条件后点击「重 置」
2. 断言日期回到默认区间,其余条件清空,列表刷新
- 自动化断言:规划与 CSV `FLOW-INS-010` 及 `tests/spd/flow-inst.spec.ts` 一致
###### 预期结果
重置后日期与其它条件恢复默认。
---
#### 异常验证点
##### 【P1】【TC-UI-FLOW-INS-011】【TP_FLOW_INS_021】无匹配空态(mock反例)
- 前置条件:已进入审批流实例页
- 操作步骤:
1. 单据编号填入 `__NOT_EXIST_FLOW__99999`,点击「查 询」
2. 断言空态且分页总数为 0
- 自动化断言:规划与 CSV `FLOW-INS-011` 及 `tests/spd/flow-inst.spec.ts` 一致
###### 预期结果
无匹配不报错;总数为 0。
---
### 审批流实例 · 列表与分页
#### 功能验证点
##### 【P0】【TC-UI-FLOW-INS-012】【TP_FLOW_INS_024】列表核心列完整
- 前置条件:已进入审批流实例页
- 操作步骤:
1. 断言表头含序号、单据编号、业务类型、发起人、发起部门、发起时间、摘要、审批状态、操作
2. 断言行内可见「详情」
- 自动化断言:规划与 CSV `FLOW-INS-012` 及 `tests/spd/flow-inst.spec.ts` 一致
###### 预期结果
核心列完整;详情入口可见。
---
##### 【P1】【TC-UI-FLOW-INS-013】【TP_FLOW_INS_025】单据编号前缀与业务类型对应
- 前置条件:默认查询有数据
- 操作步骤:
1. 抽样 `PLAN`/`DB`/`GC`/`BUY` 前缀行(有则断言)
2. 断言 PLAN→采购计划、DB→二级库调拨、GC→产品信息变更、BUY→请领单(以现网枚举为准,缺前缀 skip 该项)
- 自动化断言:规划与 CSV `FLOW-INS-013` 及 `tests/spd/flow-inst.spec.ts` 一致
###### 预期结果
前缀与类型对应。
---
##### 【P1】【TC-UI-FLOW-INS-014】【TP_FLOW_INS_028】分页翻至第 2 页
- 前置条件:总条数大于一页,否则 skip
- 操作步骤:
1. 记录第 1 页首行单据编号
2. 翻到第 2 页
3. 断言数据更换;筛选条件保持
- 自动化断言:规划与 CSV `FLOW-INS-014` 及 `tests/spd/flow-inst.spec.ts` 一致
###### 预期结果
翻页成功;筛选不丢失。
---
### 审批流实例 · 审批详情
#### 功能验证点
##### 【P0】【TC-UI-FLOW-INS-015】【TP_FLOW_INS_036】打开详情对应当前行
- 前置条件:列表至少 1 条
- 操作步骤:
1. 记录首行 `${sampleOrderNo}`
2. 点击「详情」
3. 断言打开该单审批过程,标题或单号含 `${sampleOrderNo}`
- 自动化断言:规划与 CSV `FLOW-INS-015` 及 `tests/spd/flow-inst.spec.ts` 一致
###### 预期结果
详情单号与当前行一致。
---
##### 【P1】【TC-UI-FLOW-INS-016】【TP_FLOW_INS_038】关闭详情保留列表状态
- 前置条件:列表至少 1 条
- 操作步骤:
1. 填写单据编号查询后打开详情
2. 点返回/关闭
3. 断言筛选条件与列表仍是打开前的查询结果
- 自动化断言:规划与 CSV `FLOW-INS-016` 及 `tests/spd/flow-inst.spec.ts` 一致
###### 预期结果
返回后条件与页码保持。
---
##### 【P1】【TC-UI-FLOW-INS-017】【TP_FLOW_INS_037】详情只读
- 前置条件:列表至少 1 条
- 操作步骤:
1. 打开首行详情
2. 断言无保存审批人/改条件的提交按钮,或此类控件不可用
3. 返回列表
- 自动化断言:规划与 CSV `FLOW-INS-017` 及 `tests/spd/flow-inst.spec.ts` 一致
###### 预期结果
详情只读;改配置须到审批流程设置。
## 质量与覆盖说明
| 项 | 说明 |
|----|------|
| 用例数 | **17** 条(P0=10 / P1=7) |
| 来源 | 从 41 条测试点选取可稳定自动化的主路径与关键反向 |
| 未纳入自动化 | 改审批人、接口失败、会话过期、无菜单权限、详情与流程设置节点逐条对照(可另开集成专项) |
| 单一职责 | 每条只断言一个核心业务结果 |
| 独立性 | 每条独立 `open()`,不复用 BrowserContext;不依赖上一条写结果 |
# 基础管理-流程设置-审批流程设置 UI 自动化测试用例
**来源测试点**:`testpoint/基础管理-流程设置-审批流程设置-测试点分析-01.md`
**执行 CSV**:`testcase/基础管理-流程设置-审批流程设置-UI自动化测试用例-01.csv`
**页面 URL**:`/spd/basic/flowSet/workflow/flowSet`
**定位器 YAML**:`locators/spd/flow-def.locator.yaml`
**元素扫描**:`data/scan/flow-def-elements.json`(43 项)
**关联规范**:`knowledge-base/08-UI专项规范库/UI-SPEC-SPD-FLOW-001.md`
**版本**:2026-10-20
**自动化框架**:Playwright + TypeScript(规划 `tests/spd/flow-def.spec.ts`,依赖 `auth.setup` 登录态)
**通用前置**:正例账号 `test_1` 经 `auth.setup` 写入 `storageState`(密码仅存 `.env` 的 `TEST_PASS`);具备「基础设置 → 流程设置 → 审批流程设置」权限。反例筛选用 mock。
**页面约定**:整页渲染,**无报表 iframe**;定位均在 `page` 上。
**菜单导航**:菜单「基础设置 → 流程设置 → 审批流程设置」;建议 `openPath('/spd/basic/flowSet/workflow/flowSet')`,与「审批流实例」用 exact 区分。
**写操作**:禁止点「保 存」提交线上审批路由。新增流程/改节点后必须「重 置」或取消条件配置;必填拦截若需点保存,仅空行拦截成功后立刻重置。
**动态取数**:从左侧读取 `${sampleBizType}`(如采购计划);自定义行读取 `${sampleFlowName}`、`${sampleCondText}`;mock:`__NOT_EXIST_FLOW__99999`。
---
## 基础设置 · 流程设置
### 审批流程设置 · 页面进入
#### 功能验证点
##### 【P0】【TC-UI-FLOW-DEF-001】【TP_FLOW_DEF_001】菜单进入审批流程设置页
- 前置条件:已进入审批流程设置页
- 操作步骤:
1. 按菜单「基础设置 → 流程设置 → 审批流程设置」进入,或 `openPath` 打开 `/spd/basic/flowSet/workflow/flowSet`
2. 断言 URL 含 `/spd/basic/flowSet/workflow/flowSet`
3. 断言左侧业务类型、右侧默认审批流与自定义审批流、「保 存」「重 置」可见
- 自动化断言:规划与 CSV `FLOW-DEF-001` 及 `tests/spd/flow-def.spec.ts` 一致
###### 预期结果
进入审批流程设置;不误入审批流实例。
---
#### 异常验证点
##### 【P0】【TC-UI-FLOW-DEF-002】【TP_FLOW_DEF_005】未登录访问拦截
- 前置条件:已进入审批流程设置页
- 操作步骤:
1. 清除登录态后直接打开 `/spd/basic/flowSet/workflow/flowSet`
2. 断言跳转登录或不展示审批流配置
- 自动化断言:规划与 CSV `FLOW-DEF-002` 及 `tests/spd/flow-def.spec.ts` 一致
###### 预期结果
未登录不可见审批流配置。
---
### 审批流程设置 · 左侧业务类型
#### 功能验证点
##### 【P0】【TC-UI-FLOW-DEF-003】【TP_FLOW_DEF_009】业务类型列表可见
- 前置条件:已进入审批流程设置页
- 操作步骤:
1. 断言左侧可见采购计划等类型且有当前高亮项
2. 读取 `${sampleBizType}`
- 自动化断言:规划与 CSV `FLOW-DEF-003` 及 `tests/spd/flow-def.spec.ts` 一致
###### 预期结果
类型列表可见;当前项高亮。
---
##### 【P0】【TC-UI-FLOW-DEF-004】【TP_FLOW_DEF_010】按流程名称过滤类型
- 前置条件:已进入审批流程设置页
- 操作步骤:
1. 在「流程名称」输入 `${sampleBizType}` 关键字
2. 断言可见类型名称均匹配关键字
- 自动化断言:规划与 CSV `FLOW-DEF-004` 及 `tests/spd/flow-def.spec.ts` 一致
###### 预期结果
类型过滤与关键字匹配。
---
##### 【P1】【TC-UI-FLOW-DEF-005】【TP_FLOW_DEF_011】清空关键字恢复全量
- 前置条件:已进入审批流程设置页
- 操作步骤:
1. 记录过滤前类型数量
2. 输入关键字后再清空
3. 断言数量恢复
- 自动化断言:规划与 CSV `FLOW-DEF-005` 及 `tests/spd/flow-def.spec.ts` 一致
###### 预期结果
清空后类型列表恢复全量。
---
##### 【P0】【TC-UI-FLOW-DEF-006】【TP_FLOW_DEF_012】切换类型刷新右侧配置
- 前置条件:已进入审批流程设置页
- 操作步骤:
1. 记录当前类型默认流节点文案
2. 点选另一业务类型(仅 1 个则 skip)
3. 断言右侧默认流/自定义流已刷新,不残留上一类型节点人员
- 自动化断言:规划与 CSV `FLOW-DEF-006` 及 `tests/spd/flow-def.spec.ts` 一致
###### 预期结果
切换类型后右侧与该类型已保存配置一致。
---
#### 异常验证点
##### 【P1】【TC-UI-FLOW-DEF-007】【TP_FLOW_DEF_015】无匹配类型(mock反例)
- 前置条件:已进入审批流程设置页
- 操作步骤:
1. 流程名称填入 `__NOT_EXIST_FLOW__99999`
2. 断言左侧无匹配或空,右侧不把上一类型配置展示为当前成功配置
- 自动化断言:规划与 CSV `FLOW-DEF-007` 及 `tests/spd/flow-def.spec.ts` 一致
###### 预期结果
无匹配不报错。
---
### 审批流程设置 · 默认审批流
#### 功能验证点
##### 【P0】【TC-UI-FLOW-DEF-008】【TP_FLOW_DEF_017】默认审批流节点可见
- 前置条件:已进入审批流程设置页
- 操作步骤:
1. 选中「采购计划」(或当前默认类型)
2. 断言「默认审批流」区域可见节点卡片,含节点/账号/人员三行信息(按卡片容器取文本)
- 自动化断言:规划与 CSV `FLOW-DEF-008` 及 `tests/spd/flow-def.spec.ts` 一致
###### 预期结果
默认流节点结构可见;不点保存。
---
### 审批流程设置 · 自定义审批流
#### 功能验证点
##### 【P0】【TC-UI-FLOW-DEF-009】【TP_FLOW_DEF_022】新增流程增加一行后重置
- 前置条件:已进入审批流程设置页
- 操作步骤:
1. 记录当前自定义流行数
2. 点击「新增流程」
3. 断言行数 +1,新行含流程名称、条件、审批流程、删除
4. 点击「重 置」,断言行数回到操作前,不点「保 存」
- 自动化断言:规划与 CSV `FLOW-DEF-009` 及 `tests/spd/flow-def.spec.ts` 一致
###### 预期结果
可新增行;重置放弃未保存行。
---
#### 异常验证点
##### 【P0】【TC-UI-FLOW-DEF-010】【TP_FLOW_DEF_028】空行保存被拦截后重置
- 前置条件:已进入审批流程设置页
- 操作步骤:
1. 点击「新增流程」得到空行
2. 点击「保 存」
3. 断言出现必填拦截提示,配置未按成功态关闭
4. 点击「重 置」,放弃该空行
- 自动化断言:规划与 CSV `FLOW-DEF-010` 及 `tests/spd/flow-def.spec.ts` 一致
###### 预期结果
空名称/条件/节点不能落库;拦截后重置恢复。
---
### 审批流程设置 · 条件配置
#### 功能验证点
##### 【P0】【TC-UI-FLOW-DEF-011】【TP_FLOW_DEF_031】打开条件配置后取消
- 前置条件:当前类型至少 1 条自定义流
- 操作步骤:
1. 若无自定义行则 skip
2. 点击首条自定义流条件列「编辑」
3. 断言打开「条件配置」
4. 点「取 消」,断言行内条件文案与打开前一致
- 自动化断言:规划与 CSV `FLOW-DEF-011` 及 `tests/spd/flow-def.spec.ts` 一致
###### 预期结果
条件配置可打开;取消不改行内条件。
---
### 审批流程设置 · 保存与重置
#### 功能验证点
##### 【P0】【TC-UI-FLOW-DEF-012】【TP_FLOW_DEF_038】重置放弃未保存改动
- 前置条件:已进入审批流程设置页
- 操作步骤:
1. 点击「新增流程」增加一行
2. 点击「重 置」
3. 断言自定义流行回到上次保存结果
- 自动化断言:规划与 CSV `FLOW-DEF-012` 及 `tests/spd/flow-def.spec.ts` 一致
###### 预期结果
重置不提交;未保存行消失。
---
### 审批流程设置 · 左侧业务类型
#### 集成验证点
##### 【P1】【TC-UI-FLOW-DEF-013】【TP_FLOW_DEF_016】类型与审批流实例业务类型同源
- 前置条件:已进入审批流程设置页
- 操作步骤:
1. 记录本页左侧类型名称集合(可见范围)
2. 打开审批流实例,展开「业务类型」下拉
3. 断言选项与本页类型同源(允许按权限裁剪,本页有的关键类型如采购计划应能对应)
- 自动化断言:规划与 CSV `FLOW-DEF-013` 及 `tests/spd/flow-def.spec.ts` 一致
###### 预期结果
两页业务类型同源。
## 质量与覆盖说明
| 项 | 说明 |
|----|------|
| 用例数 | **13** 条(P0=10 / P1=3) |
| 来源 | 从 41 条测试点选取可稳定自动化的主路径与关键反向 |
| 未纳入自动化 | 真实保存审批链、自定义流持久化、条件保存落库、历史实例快照、接口失败、会话过期 |
| 单一职责 | 每条只断言一个核心业务结果 |
| 独立性 | 每条独立 `open()`,不复用 BrowserContext;不依赖上一条写结果 |
# 基础管理-用户管理-医共体用户管理 UI 自动化测试用例
**来源测试点**:`testpoint/基础管理-用户管理-医共体用户管理-测试点分析-01.md`
**执行 CSV**:`testcase/基础管理-用户管理-医共体用户管理-UI自动化测试用例-01.csv`
**页面 URL**:`/spd/basic/user/platform/personCom`
**定位器 YAML**:`locators/spd/basic-user-union.locator.yaml`
**元素扫描**:`data/scan/basic-user-union-elements.json`(221 项)
**关联规范**:`knowledge-base/08-UI专项规范库/UI-SPEC-SPD-USER-002.md`
**版本**:2026-10-20
**自动化框架**:Playwright + TypeScript(规划 `tests/spd/basic-user-union.spec.ts`,依赖 `auth.setup` 登录态)
**通用前置**:正例账号 `test_1` 经 `auth.setup` 写入 `storageState`(密码仅存 `.env` 的 `TEST_PASS`);具备「基础设置 → 用户管理 → 医共体用户管理」权限。反例筛选用 mock(`__NOT_EXIST_USER__99999` / `__NOT_EXIST_ROLE__99999`)。
**页面约定**:整页渲染,**无报表 iframe**;定位均在 `page` 上。
**菜单导航**:菜单「基础设置 → 用户管理 → 医共体用户管理」;可用 `openPath('/spd/basic/user/platform/personCom')`。
**写操作**:新增/编辑只打开后取消,不提交保存;授权与改密规则同用户管理,本页不重复真实写操作。禁止写死医院名称。
**动态取数**:查询后从首行读取 `${sampleLoginName}`、`${sampleUserName}`、`${sampleHospital}`、`${samplePhone}`;禁止写死扫描到的医院名;mock:`__NOT_EXIST_USER__99999`。
---
## 基础设置 · 用户管理
### 医共体用户管理 · 页面进入
#### 功能验证点
##### 【P0】【TC-UI-USER-UNI-001】【TP_USER_UNI_001】菜单进入医共体用户管理页
- 前置条件:已进入医共体用户管理页
- 操作步骤:
1. 按菜单「基础设置 → 用户管理 → 医共体用户管理」进入,或 `openPath` 打开 `/spd/basic/user/platform/personCom`
2. 断言 URL 含 `/spd/basic/user/platform/personCom`
3. 断言所属医院筛选、工具栏、列表列头与分页可见
- 自动化断言:规划与 CSV `USER-UNI-001` 及 `tests/spd/basic-user-union.spec.ts` 一致
###### 预期结果
进入医共体用户管理页;不误入用户管理或角色管理。
---
#### 异常验证点
##### 【P0】【TC-UI-USER-UNI-002】【TP_USER_UNI_005】未登录访问拦截
- 前置条件:已进入医共体用户管理页
- 操作步骤:
1. 清除登录态后直接打开 `/spd/basic/user/platform/personCom`
2. 断言跳转登录或不展示用户业务列表
- 自动化断言:规划与 CSV `USER-UNI-002` 及 `tests/spd/basic-user-union.spec.ts` 一致
###### 预期结果
未登录不可见医共体用户数据。
---
### 医共体用户管理 · 筛选与查询
#### 功能验证点
##### 【P0】【TC-UI-USER-UNI-003】【TP_USER_UNI_009】默认查询列表有数据或空态明确
- 前置条件:已进入医共体用户管理页
- 操作步骤:
1. 点击「查 询」并等待列表稳定
2. 断言出现数据行,或空态且分页总数为 0
- 自动化断言:规划与 CSV `USER-UNI-003` 及 `tests/spd/basic-user-union.spec.ts` 一致
###### 预期结果
查询无报错;有数据时「共 N 条」N≥1。
---
##### 【P0】【TC-UI-USER-UNI-004】【TP_USER_UNI_010】姓名或登录账号关键字查询
- 前置条件:默认查询至少 1 条
- 操作步骤:
1. 从首行读取 `${sampleUserName}` 或 `${sampleLoginName}`
2. 在「姓名」框填入关键字,点击「查 询」
3. 断言结果行姓名或登录账号匹配
- 自动化断言:规划与 CSV `USER-UNI-004` 及 `tests/spd/basic-user-union.spec.ts` 一致
###### 预期结果
查询结果与关键字匹配。
---
##### 【P0】【TC-UI-USER-UNI-005】【TP_USER_UNI_011】所属医院筛选
- 前置条件:已进入医共体用户管理页
- 操作步骤:
1. 记录当前默认 `${sampleHospital}` 与分页总数
2. 切换「所属医院」为另一可选项(仅 1 家则 skip)
3. 点击「查 询」
4. 断言结果行「所属医院」均为所选值,「共 N 条」可与默认不同
- 自动化断言:规划与 CSV `USER-UNI-005` 及 `tests/spd/basic-user-union.spec.ts` 一致
###### 预期结果
列表仅该院用户;总数随医院变化。
---
##### 【P0】【TC-UI-USER-UNI-006】【TP_USER_UNI_013】姓名+医院+联系方式组合查询
- 前置条件:默认查询至少 1 条
- 操作步骤:
1. 读取 `${sampleUserName}`、`${sampleHospital}`、`${samplePhone}`(电话非法占位如 `1` 时改用姓名+医院)
2. 填写后点击「查 询」
3. 断言结果同时满足已填条件
- 自动化断言:规划与 CSV `USER-UNI-006` 及 `tests/spd/basic-user-union.spec.ts` 一致
###### 预期结果
组合条件同时生效。
---
##### 【P1】【TC-UI-USER-UNI-007】【TP_USER_UNI_014】重置恢复默认医院
- 前置条件:已进入医共体用户管理页
- 操作步骤:
1. 更改所属医院或姓名后点击「重 置」
2. 断言所属医院恢复进入页时的默认值,列表刷新
- 自动化断言:规划与 CSV `USER-UNI-007` 及 `tests/spd/basic-user-union.spec.ts` 一致
###### 预期结果
医院等条件恢复默认。
---
##### 【P1】【TC-UI-USER-UNI-008】【TP_USER_UNI_015】展开高级筛选
- 前置条件:已进入医共体用户管理页
- 操作步骤:
1. 点击「高级筛选」
2. 断言可见所属医院、联系方式、科室、角色及「筛 选」
- 自动化断言:规划与 CSV `USER-UNI-008` 及 `tests/spd/basic-user-union.spec.ts` 一致
###### 预期结果
高级筛选含医院维度字段。
---
#### 异常验证点
##### 【P1】【TC-UI-USER-UNI-009】【TP_USER_UNI_021】无匹配空态(mock反例)
- 前置条件:已进入医共体用户管理页
- 操作步骤:
1. 姓名框填入 `__NOT_EXIST_USER__99999`,点击「查 询」
2. 断言空态且分页总数为 0
- 自动化断言:规划与 CSV `USER-UNI-009` 及 `tests/spd/basic-user-union.spec.ts` 一致
###### 预期结果
无匹配不报错;总数为 0。
---
### 医共体用户管理 · 列表与分页
#### 功能验证点
##### 【P0】【TC-UI-USER-UNI-010】【TP_USER_UNI_024】列表列顺序含所属医院
- 前置条件:已进入医共体用户管理页
- 操作步骤:
1. 断言列顺序为登录账号、姓名、联系方式、所属医院、所属科室、医院员工编号、角色、科室任职数、操作
2. 勿用用户管理页列断言(用户管理无所属医院且姓名在登录账号前)
- 自动化断言:规划与 CSV `USER-UNI-010` 及 `tests/spd/basic-user-union.spec.ts` 一致
###### 预期结果
列顺序与用户管理页不同;含所属医院。
---
##### 【P1】【TC-UI-USER-UNI-011】【TP_USER_UNI_026】分页翻至第 2 页
- 前置条件:总条数大于一页,否则 skip
- 操作步骤:
1. 记录第 1 页首行登录账号
2. 翻到第 2 页
3. 断言数据更换且所属医院筛选仍保持
- 自动化断言:规划与 CSV `USER-UNI-011` 及 `tests/spd/basic-user-union.spec.ts` 一致
###### 预期结果
翻页成功;医院条件不丢失。
---
#### 集成验证点
##### 【P1】【TC-UI-USER-UNI-012】【TP_USER_UNI_033】与用户管理页同一用户字段一致
- 前置条件:两页都能查到同一账号,否则 skip
- 操作步骤:
1. 记录本页首行 `${sampleLoginName}`、姓名、所属科室、角色
2. 打开用户管理页,按登录账号查询同一用户
3. 断言姓名、角色、所属科室一致;本页仅多「所属医院」
- 自动化断言:规划与 CSV `USER-UNI-012` 及 `tests/spd/basic-user-union.spec.ts` 一致
###### 预期结果
同一登录账号跨页字段一致。
---
### 医共体用户管理 · 新增与编辑
#### 功能验证点
##### 【P0】【TC-UI-USER-UNI-013】【TP_USER_UNI_036】打开新增弹窗
- 前置条件:已进入医共体用户管理页
- 操作步骤:
1. 点击「新 增」
2. 断言弹出用户表单,含账号、姓名、联系方式及取消/确定
- 自动化断言:规划与 CSV `USER-UNI-013` 及 `tests/spd/basic-user-union.spec.ts` 一致
###### 预期结果
新增弹窗可见。
---
##### 【P1】【TC-UI-USER-UNI-014】【TP_USER_UNI_038】新增取消不落库
- 前置条件:已进入医共体用户管理页
- 操作步骤:
1. 打开新增,账号填 `${uniqLogin}` 后点「取 消」
2. 当前医院下列表查询该账号,断言不存在
- 自动化断言:规划与 CSV `USER-UNI-014` 及 `tests/spd/basic-user-union.spec.ts` 一致
###### 预期结果
取消后当前医院列表不出现该账号。
---
#### 异常验证点
##### 【P0】【TC-UI-USER-UNI-015】【TP_USER_UNI_046】必填为空拦截
- 前置条件:已进入医共体用户管理页
- 操作步骤:
1. 打开新增,账号或姓名留空后点「确 定」
2. 断言被拦截,弹窗仍打开,不落库
- 自动化断言:规划与 CSV `USER-UNI-015` 及 `tests/spd/basic-user-union.spec.ts` 一致
###### 预期结果
必填为空不可保存。
---
#### 功能验证点
##### 【P0】【TC-UI-USER-UNI-016】【TP_USER_UNI_039】打开编辑并回填
- 前置条件:列表至少 1 条
- 操作步骤:
1. 点击首行「编辑」
2. 断言弹窗回填与该行登录账号、姓名、所属医院一致
3. 点「取 消」
- 自动化断言:规划与 CSV `USER-UNI-016` 及 `tests/spd/basic-user-union.spec.ts` 一致
###### 预期结果
编辑回填正确;本条不保存。
## 质量与覆盖说明
| 项 | 说明 |
|----|------|
| 用例数 | **16** 条(P0=10 / P1=6) |
| 来源 | 从 58 条测试点选取可稳定自动化的主路径与关键反向 |
| 未纳入自动化 | 授权/改密持久化(引用 TP_USER_USR)、真实跨院保存、Excel 导入文件、接口失败、会话过期 |
| 单一职责 | 每条只断言一个核心业务结果 |
# 基础管理-用户管理-用户管理 UI 自动化测试用例
**来源测试点**:`testpoint/基础管理-用户管理-用户管理-测试点分析-01.md`
**执行 CSV**:`testcase/基础管理-用户管理-用户管理-UI自动化测试用例-01.csv`
**页面 URL**:`/spd/basic/user/platform/person`
**定位器 YAML**:`locators/spd/basic-user.locator.yaml`
**元素扫描**:`data/scan/basic-user-elements.json`(219 项)
**关联规范**:`knowledge-base/08-UI专项规范库/UI-SPEC-SPD-USER-001.md`
**版本**:2026-10-20
**自动化框架**:Playwright + TypeScript(规划 `tests/spd/basic-user.spec.ts`,依赖 `auth.setup` 登录态)
**通用前置**:正例账号 `test_1` 经 `auth.setup` 写入 `storageState`(密码仅存 `.env` 的 `TEST_PASS`);具备「基础设置 → 用户管理 → 用户管理」权限。反例筛选用 mock(`__NOT_EXIST_USER__99999` / `__NOT_EXIST_ROLE__99999`)。
**页面约定**:整页渲染,**无报表 iframe**;定位均在 `page` 上。
**菜单导航**:一级菜单与叶子菜单均名「用户管理」,须点「基础设置 → 用户管理(子菜单)→ 用户管理(叶子)」;建议 `openPath('/spd/basic/user/platform/person')` 并断言 URL,勿误入医共体/角色管理。
**写操作**:新增/编辑只打开后取消,不提交保存;授权只打开后取消;重置密码只验证确认框后取消,不确认改密。禁止写死生产账号。
**动态取数**:查询后从首行读取 `${sampleUserName}`、`${sampleLoginName}`、`${sampleDept}`、`${sampleRole}`;科室为 `--` 时换一行;mock:`__NOT_EXIST_USER__99999`;写操作用 `${uniqLogin}`(建议 `auto.usr.${timestamp}`),取消不落库。
---
## 基础设置 · 用户管理
### 用户管理 · 页面进入
#### 功能验证点
##### 【P0】【TC-UI-USER-USR-001】【TP_USER_USR_001】菜单进入用户管理页
- 前置条件:已进入用户管理页
- 操作步骤:
1. 按菜单「基础设置 → 用户管理(子菜单)→ 用户管理(叶子)」进入,或 `openPath` 打开 `/spd/basic/user/platform/person`
2. 断言 URL 含 `/spd/basic/user/platform/person`
3. 断言筛选区、工具栏「新 增」「Excel导入」、列表列头与分页可见
- 自动化断言:规划与 CSV `USER-USR-001` 及 `tests/spd/basic-user.spec.ts` 一致
###### 预期结果
进入用户管理页;不误入医共体用户管理或角色管理;无报错遮罩。
---
#### 异常验证点
##### 【P0】【TC-UI-USER-USR-002】【TP_USER_USR_005】未登录访问拦截
- 前置条件:已进入用户管理页
- 操作步骤:
1. 清除登录态后直接打开 `/spd/basic/user/platform/person`
2. 断言跳转登录或不展示用户业务列表
- 自动化断言:规划与 CSV `USER-USR-002` 及 `tests/spd/basic-user.spec.ts` 一致
###### 预期结果
未登录不可见用户数据。
---
### 用户管理 · 筛选与查询
#### 功能验证点
##### 【P0】【TC-UI-USER-USR-003】【TP_USER_USR_009】默认查询列表有数据或空态明确
- 前置条件:已进入用户管理页
- 操作步骤:
1. 点击「查 询」并等待列表稳定
2. 断言出现数据行,或「暂无数据」且分页总数为 0
- 自动化断言:规划与 CSV `USER-USR-003` 及 `tests/spd/basic-user.spec.ts` 一致
###### 预期结果
查询无报错;有数据时分页「共 N 条」N≥1;无数据时空态明确。
---
##### 【P0】【TC-UI-USER-USR-004】【TP_USER_USR_010】姓名或登录账号关键字查询
- 前置条件:默认查询至少 1 条且姓名或登录账号非空
- 操作步骤:
1. 从首行读取 `${sampleUserName}` 或 `${sampleLoginName}` 取关键字
2. 在「姓名」框(占位「姓名、登录账号」)填入关键字,点击「查 询」
3. 断言结果行姓名或登录账号匹配该关键字
- 自动化断言:规划与 CSV `USER-USR-004` 及 `tests/spd/basic-user.spec.ts` 一致
###### 预期结果
查询结果与已填关键字匹配;无未捕获异常。
---
##### 【P0】【TC-UI-USER-USR-005】【TP_USER_USR_011】科室下拉筛选
- 前置条件:列表存在所属科室非空行,否则 skip
- 操作步骤:
1. 取首条所属科室非 `--` 的行,读取 `${sampleDept}`
2. 科室下拉选择该值,点击「查 询」
3. 断言结果行「所属科室」与所选一致,且不含未分配 `--` 行
- 自动化断言:规划与 CSV `USER-USR-005` 及 `tests/spd/basic-user.spec.ts` 一致
###### 预期结果
所属科室列与筛选条件一致。
---
##### 【P0】【TC-UI-USER-USR-006】【TP_USER_USR_013】姓名+科室+角色组合查询
- 前置条件:默认查询至少 1 条
- 操作步骤:
1. 读取 `${sampleUserName}`、`${sampleDept}`、`${sampleRole}`(角色可从该行截断前列名)
2. 填写姓名、科室、角色后点击「查 询」
3. 断言结果同时满足已填条件
- 自动化断言:规划与 CSV `USER-USR-006` 及 `tests/spd/basic-user.spec.ts` 一致
###### 预期结果
组合查询无报错;结果同时满足全部已填条件。
---
##### 【P1】【TC-UI-USER-USR-007】【TP_USER_USR_014】重置恢复默认
- 前置条件:已进入用户管理页
- 操作步骤:
1. 填写姓名等筛选条件后点击「重 置」
2. 断言筛选字段恢复默认,列表按默认规则刷新
- 自动化断言:规划与 CSV `USER-USR-007` 及 `tests/spd/basic-user.spec.ts` 一致
###### 预期结果
条件恢复默认;列表刷新。
---
##### 【P1】【TC-UI-USER-USR-008】【TP_USER_USR_015】展开高级筛选
- 前置条件:已进入用户管理页
- 操作步骤:
1. 点击「高级筛选」
2. 断言展开后面板可见姓名/科室/角色/状态及「重 置」「筛 选」
- 自动化断言:规划与 CSV `USER-USR-008` 及 `tests/spd/basic-user.spec.ts` 一致
###### 预期结果
高级筛选面板展开;关键字段与筛选按钮可见。
---
##### 【P0】【TC-UI-USER-USR-009】【TP_USER_USR_016】高级筛选按状态过滤
- 前置条件:已进入用户管理页
- 操作步骤:
1. 展开高级筛选,状态下拉选择「启用」或「禁用」
2. 点击「筛 选」
3. 断言列表仅保留对应状态用户(无匹配则空态且总数为 0)
- 自动化断言:规划与 CSV `USER-USR-009` 及 `tests/spd/basic-user.spec.ts` 一致
###### 预期结果
按状态过滤成功;无报错。
---
#### 异常验证点
##### 【P1】【TC-UI-USER-USR-010】【TP_USER_USR_022】无匹配结果空态(mock反例)
- 前置条件:已进入用户管理页
- 操作步骤:
1. 姓名框填入 `__NOT_EXIST_USER__99999`
2. 点击「查 询」
3. 断言空态或「暂无数据」,分页总数为 0
- 自动化断言:规划与 CSV `USER-USR-010` 及 `tests/spd/basic-user.spec.ts` 一致
###### 预期结果
无匹配时不报错;空态明确;总数为 0。
---
### 用户管理 · 列表与分页
#### 功能验证点
##### 【P0】【TC-UI-USER-USR-011】【TP_USER_USR_025】列表核心列完整
- 前置条件:已进入用户管理页
- 操作步骤:
1. 断言表头含序号、姓名、登录账号、联系方式、所属科室、医院员工编号、角色、科室任职数、操作
2. 断言操作列可见「编辑」「授权」「重置密码」
- 自动化断言:规划与 CSV `USER-USR-011` 及 `tests/spd/basic-user.spec.ts` 一致
###### 预期结果
核心列完整;行内三个操入口可见。
---
##### 【P1】【TC-UI-USER-USR-012】【TP_USER_USR_026】列表不含所属医院列
- 前置条件:已进入用户管理页
- 操作步骤:
1. 断言表头不含「所属医院」
- 自动化断言:规划与 CSV `USER-USR-012` 及 `tests/spd/basic-user.spec.ts` 一致
###### 预期结果
本页无所属医院列,与医共体用户管理页区分。
---
##### 【P1】【TC-UI-USER-USR-013】【TP_USER_USR_031】分页翻至第 2 页
- 前置条件:默认查询总条数大于一页,否则 skip
- 操作步骤:
1. 记录第 1 页首行登录账号
2. 点击页码「2」或「下一页」
3. 断言页码高亮为 2,首行账号与第 1 页不同
- 自动化断言:规划与 CSV `USER-USR-013` 及 `tests/spd/basic-user.spec.ts` 一致
###### 预期结果
翻页成功;数据更换。
---
### 用户管理 · 新增用户
#### 功能验证点
##### 【P0】【TC-UI-USER-USR-014】【TP_USER_USR_041】打开新增用户弹窗
- 前置条件:已进入用户管理页
- 操作步骤:
1. 点击「新 增」
2. 断言弹出用户表单,可见账号、姓名、联系方式、医院员工编号、启用/禁用、「取 消」「确 定」
- 自动化断言:规划与 CSV `USER-USR-014` 及 `tests/spd/basic-user.spec.ts` 一致
###### 预期结果
新增弹窗可见;关键字段与按钮齐全。
---
##### 【P1】【TC-UI-USER-USR-015】【TP_USER_USR_043】新增取消不落库
- 前置条件:已进入用户管理页
- 操作步骤:
1. 打开新增,账号填 `${uniqLogin}`,姓名填任意合法值
2. 点击「取 消」
3. 按账号查询,断言无该记录
- 自动化断言:规划与 CSV `USER-USR-015` 及 `tests/spd/basic-user.spec.ts` 一致
###### 预期结果
弹窗关闭;列表不出现 `${uniqLogin}`。
---
#### 异常验证点
##### 【P0】【TC-UI-USER-USR-016】【TP_USER_USR_047】必填为空拦截
- 前置条件:已进入用户管理页
- 操作步骤:
1. 打开新增,账号或姓名留空后点击「确 定」
2. 断言出现必填提示,弹窗仍打开
- 自动化断言:规划与 CSV `USER-USR-016` 及 `tests/spd/basic-user.spec.ts` 一致
###### 预期结果
确定被拦截;不落库;弹窗不关闭。
---
##### 【P0】【TC-UI-USER-USR-017】【TP_USER_USR_048】登录账号重复拦截
- 前置条件:默认查询至少 1 条且登录账号非空
- 操作步骤:
1. 打开新增,账号填入已存在的 `${sampleLoginName}`,补齐其它必填后点「确 定」
2. 断言保存失败并提示,弹窗仍打开
3. 查询该账号,断言原用户未被覆盖
- 自动化断言:规划与 CSV `USER-USR-017` 及 `tests/spd/basic-user.spec.ts` 一致
###### 预期结果
重复账号被拒绝;不覆盖原用户。
---
### 用户管理 · 编辑用户
#### 功能验证点
##### 【P0】【TC-UI-USER-USR-018】【TP_USER_USR_054】打开编辑用户弹窗并回填
- 前置条件:列表至少 1 条
- 操作步骤:
1. 点击首行「编辑」
2. 断言弹窗标题含「编辑用户」
3. 断言账号、姓名与该行 `${sampleLoginName}`、`${sampleUserName}` 一致(允许规范化空白)
- 自动化断言:规划与 CSV `USER-USR-018` 及 `tests/spd/basic-user.spec.ts` 一致
###### 预期结果
编辑弹窗可见;回填与列表行一致。
---
##### 【P1】【TC-UI-USER-USR-019】【TP_USER_USR_058】编辑取消不保存
- 前置条件:列表至少 1 条
- 操作步骤:
1. 打开首行编辑,记录原姓名
2. 将姓名改为临时值后点「取 消」
3. 再次打开编辑,断言姓名仍为原值
- 自动化断言:规划与 CSV `USER-USR-019` 及 `tests/spd/basic-user.spec.ts` 一致
###### 预期结果
取消后列表与回看均为修改前姓名。
---
#### 边界验证点
##### 【P1】【TC-UI-USER-USR-020】【TP_USER_USR_061】编辑时账号只读
- 前置条件:列表至少 1 条
- 操作步骤:
1. 打开首行编辑
2. 断言登录账号不可改(disabled/readonly 或无法输入)
- 自动化断言:规划与 CSV `USER-USR-020` 及 `tests/spd/basic-user.spec.ts` 一致
###### 预期结果
编辑态登录账号只读。
---
#### 功能验证点
##### 【P1】【TC-UI-USER-USR-021】【TP_USER_USR_056】编辑弹窗可见签名图片
- 前置条件:列表至少 1 条
- 操作步骤:
1. 打开首行编辑
2. 断言可见「签名图片」区域(有图则展示,无图则上传入口可见)
3. 点「取 消」,不保存
- 自动化断言:规划与 CSV `USER-USR-021` 及 `tests/spd/basic-user.spec.ts` 一致
###### 预期结果
签名图片控件可见;本条不上传、不保存。
---
### 用户管理 · 授权
#### 功能验证点
##### 【P0】【TC-UI-USER-USR-022】【TP_USER_USR_068】打开授权后取消不生效
- 前置条件:列表至少 1 条
- 操作步骤:
1. 点击首行「授权」
2. 断言打开授权层(弹窗或权限树),可见可勾选菜单/功能
3. 如可勾选则改一处勾选后点取消/关闭
4. 再次打开同一用户授权,断言勾选与操作前一致
- 自动化断言:规划与 CSV `USER-USR-022` 及 `tests/spd/basic-user.spec.ts` 一致
###### 预期结果
授权层可打开;取消后勾选不落库。
---
### 用户管理 · 重置密码
#### 功能验证点
##### 【P0】【TC-UI-USER-USR-023】【TP_USER_USR_075】行内重置密码确认后取消
- 前置条件:列表至少 1 条
- 操作步骤:
1. 点击首行「重置密码」
2. 断言出现确认框或密码表单,含取消/关闭
3. 点取消/关闭
4. 断言仍停留本页且该行仍在
- 自动化断言:规划与 CSV `USER-USR-023` 及 `tests/spd/basic-user.spec.ts` 一致
###### 预期结果
重置需确认;取消后不改密。本条不点确定,避免污染账号。
## 质量与覆盖说明
| 项 | 说明 |
|----|------|
| 用例数 | **23** 条(P0=14 / P1=9) |
| 来源 | 从 81 条测试点选取可稳定自动化的主路径与关键反向 |
| 未纳入自动化 | 真实保存用户、禁用后登录、真实改密、Excel 导入文件、接口失败注入、会话过期、无菜单权限 |
| 单一职责 | 每条只断言一个核心业务结果 |
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