# 隔离圈位管理 — 测试用例

> 依据：`隔离圈位管理功能需求.md`、`隔离圈位管理技术方案.md`  
> **接口 Base Path**：`/tradeMarket/isolationPen`；鉴权与若依一致（Cookie / Token）。

**通用前置（无特殊说明）**：具备本模块权限的账号已登录（`tradeMarket:isolationPen:list|query|add|edit|remove|config`）。`biz_isolation_pen` 宜预置（`del_flag=0`）：

| 样本 | 编号 | 备注 | 要点 |
| --- | --- | --- | --- |
| **P1** | `01` | 东侧一号栏 | 有备注 |
| **P2** | `02` | （空） | 无备注 |
| **P3** | `03` | 西侧临时圈 | 用于模糊/修改 |

**合法新增圈位 Body**：`{"remark":"测试圈位甲"}` 或 `{}`（无备注）。

**合法保存配置 Body**：`{"defaultDays":7,"remark":"常规检疫默认7天"}`。

**界面（UI）测试**：**Playwright** + **Chromium**（`channel: 'chrome'` 使用本机 **Google Chrome**）。

---

## 一、单元测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-GLQWGL-UT-001 | 编号生成 | 首条编号 | 单元测试 | JUnit5 | §2.5 | 无未删圈位 | `PenCodeGenerator.next()` | 返回 `01` |
| ZCZX-GLQWGL-UT-002 | 编号生成 | 递增补零 | 单元测试 | JUnit5 | §2.5 | 最大号 `08` | `next()` | 返回 `09` |
| ZCZX-GLQWGL-UT-003 | 编号生成 | 上限拒绝 | 单元测试 | JUnit5 | §2.5 | 最大号 `99` | `next()` | 抛异常；提示编号上限 |
| ZCZX-GLQWGL-UT-004 | 圈位校验 | 备注长度 | 单元测试 | JUnit5 | §3.1 | 无 | 51 字、50 字、空、仅空白 | 51 失败；50/空通过 |
| ZCZX-GLQWGL-UT-005 | 配置校验 | 默认天数下界 | 单元测试 | JUnit5 | §3.2 | 无 | `0`、`1`、`-1` | `0`/负失败；`1` 通过 |
| ZCZX-GLQWGL-UT-006 | 配置校验 | 默认天数上界 | 单元测试 | JUnit5 | §3.2 | 无 | `3650`、`3651` | 3651 失败；3650 通过 |
| ZCZX-GLQWGL-UT-007 | 配置校验 | 非整数天数 | 单元测试 | JUnit5 | §3.2 | 无 | `7.5`、`null`、非数字 | 均失败 |
| ZCZX-GLQWGL-UT-008 | 配置校验 | 配置备注长度 | 单元测试 | JUnit5 | §3.2 | 无 | 51 字、50 字 | 51 失败；50 通过 |
| ZCZX-GLQWGL-UT-009 | Service | 新增圈位落库 | 单元测试 | JUnit5+Mockito | 正常 | Mock Mapper | `insert` 合法行 | `del_flag=0`；`pen_code` 非空 |
| ZCZX-GLQWGL-UT-010 | Service | 修改禁改编号 | 单元测试 | JUnit5 | §3.1 | 记录 `01` | 入参 `penCode=99` 更新 | 库仍为 `01` |
| ZCZX-GLQWGL-UT-011 | Service | 逻辑删除圈位 | 单元测试 | JUnit5+Mockito | §3.1 | Mock | `remove(id)` | `del_flag=2` |
| ZCZX-GLQWGL-UT-012 | Service | 删除有关联 | 单元测试 | JUnit5+Mockito | §3.1 | `hasReference=true` | `remove` | 抛 `ServiceException` |
| ZCZX-GLQWGL-UT-013 | Service | 配置首次保存 | 单元测试 | JUnit5+Mockito | §3.2 | 无 `id=1` 行 | `saveSetting` | `INSERT`；`id=1` |
| ZCZX-GLQWGL-UT-014 | Service | 配置覆盖更新 | 单元测试 | JUnit5+Mockito | §3.2 | 已有 7 天 | `saveSetting(14)` | 仅一行；`default_days=14` |
| ZCZX-GLQWGL-UT-015 | Mapper | 模糊筛选 SQL | 单元测试 | JUnit5 | §3.3 | 无 | 检查 XML | `LIKE CONCAT('%',…,'%')`；`del_flag=0` |
| ZCZX-GLQWGL-UT-016 | Mapper | 列表排序 | 单元测试 | JUnit5 | §3.1 | 无 | 检查 XML | `pen_code ASC, id ASC` |

---

## 二、接口测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-GLQWGL-API-001 | 列表 | 默认分页排序 | 接口测试 | Postman | §3.1 | 有 P1～P3 | `GET /list` | `code=200`；≤20 条；`penCode` 升序 |
| ZCZX-GLQWGL-API-002 | 列表 | 编号模糊 | 接口测试 | Postman | §2.6 | 有 P1 `01` | `penCode=1` | 含 P1；`penCode=01` 亦命中 |
| ZCZX-GLQWGL-API-003 | 列表 | 模糊无匹配 | 接口测试 | Postman | §2.6 | 已登录 | `penCode=不存在xyz` | `rows` 为空 |
| ZCZX-GLQWGL-API-004 | 列表 | 不含已删除 | 接口测试 | Postman | 逻辑删除 | 某 id 已删 | `GET /list` | 无该 id |
| ZCZX-GLQWGL-API-005 | 新增 | 有备注 | 接口测试 | Postman | §5.1 | 已登录 | `POST` `remark=测试圈位` | `code=200`；返回 2 位 `penCode` |
| ZCZX-GLQWGL-API-006 | 新增 | 无备注 | 接口测试 | Postman | §5.1 | 已登录 | `POST` `{}` | 成功；`remark` 为空 |
| ZCZX-GLQWGL-API-007 | 新增 | 备注超长 | 接口测试 | Postman | §5.1.3 | 已登录 | `remark` 51 字 | `code≠200`；`msg` 含长度 |
| ZCZX-GLQWGL-API-008 | 新增 | 传编号无效 | 接口测试 | Postman | §3.1 | 已登录 | `POST` 含 `penCode=88` | 忽略入参；按规则生成编号 |
| ZCZX-GLQWGL-API-009 | 详情 | 有效 id | 接口测试 | Postman | §5.4 | 有 P1 | `GET /{id}` | 含 `penCode`、`remark`、审计字段 |
| ZCZX-GLQWGL-API-010 | 详情 | 无效/已删 id | 接口测试 | Postman | 异常 | 已登录 | 不存在或已删 id | 失败或 `data` 为空 |
| ZCZX-GLQWGL-API-011 | 修改 | 改备注 | 接口测试 | Postman | §5.3 | 有 P2 | `PUT` 改 `remark` | 成功；`penCode` 仍为 `02` |
| ZCZX-GLQWGL-API-012 | 修改 | 传编号无效 | 接口测试 | Postman | §3.1 | 有 P1 | `PUT` `penCode=99` | 库仍为 `01` |
| ZCZX-GLQWGL-API-013 | 修改 | 不存在 id | 接口测试 | Postman | 异常 | 已登录 | 伪造 id `PUT` | 失败 |
| ZCZX-GLQWGL-API-014 | 删除 | 单条逻辑删 | 接口测试 | Postman | §5.5 | 无关联新行 | `DELETE /{id}` | 成功；列表不可见 |
| ZCZX-GLQWGL-API-015 | 删除 | 有关联拒绝 | 接口测试 | Postman | §5.5 | 预置 `hasReference` | `DELETE` | 失败；提示关联 |
| ZCZX-GLQWGL-API-016 | 删除 | 重复删除 | 接口测试 | Postman | 幂等 | 已删 id | 再次 `DELETE` | 失败或不存在 |
| ZCZX-GLQWGL-API-017 | 配置 | 未配置查询 | 接口测试 | Postman | §5.6.3 | 无 setting 行 | `GET /setting` | `data` 为空或字段 null |
| ZCZX-GLQWGL-API-018 | 配置 | 首次保存 | 接口测试 | Postman | §5.6 | 无配置 | `PUT /setting` `defaultDays=7` | 成功；再 `GET` 为 7 |
| ZCZX-GLQWGL-API-019 | 配置 | 覆盖更新 | 接口测试 | Postman | §5.6 | 已有 7 天 | `PUT` `defaultDays=14` | 成功；仅一条；值为 14 |
| ZCZX-GLQWGL-API-020 | 配置 | 缺默认天数 | 接口测试 | Postman | §5.6.5 | 已登录 | `PUT` 无 `defaultDays` | 失败 |
| ZCZX-GLQWGL-API-021 | 配置 | 天数非法 | 接口测试 | Postman | §5.6.5 | 已登录 | `0`/`3651`/`7.5` 各测 | 均失败 |
| ZCZX-GLQWGL-API-022 | 配置 | 备注超长 | 接口测试 | Postman | §5.6.5 | 已登录 | `remark` 51 字 | 失败 |
| ZCZX-GLQWGL-API-023 | 端到端 | 圈位 CRUD | 接口测试 | Postman | §4 | 已登录 | `POST`→`list`→`GET`→`PUT`→`DELETE` | 每步 `code=200` |
| ZCZX-GLQWGL-API-024 | 鉴权 | 未登录 | 接口测试 | curl | 安全 | 无 Token | `GET /list` | 401 或统一未登录 |
| ZCZX-GLQWGL-API-025 | 权限 | 无新增权限 | 接口测试 | Postman | §6 | 仅 list | `POST` 圈位 | 无权限失败 |
| ZCZX-GLQWGL-API-026 | 权限 | 无配置权限 | 接口测试 | Postman | §6 | 无 config | `PUT /setting` | 无权限失败 |
| ZCZX-GLQWGL-API-027 | 权限 | 无删除权限 | 接口测试 | Postman | §6 | 无 remove | `DELETE` | 无权限失败 |
| ZCZX-GLQWGL-API-028 | 响应 | 失败可读 | 接口测试 | Postman | §8 | 已登录 | 触发备注超长、天数非法 | `msg` 可区分场景 |

---

## 三、界面测试用例（UI）

**测试工具**：**Playwright** + **Chromium**（`channel: 'chrome'` 使用本机 **Google Chrome**）。

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-GLQWGL-UI-001 | 列表 | 默认展示 | UI 测试 | Playwright+Chrome | §5.2.3 | 已登录；有 P1～P3 | 进入「隔离圈位管理」 | 含圈位编号、备注、操作；有「设置隔离天数」 |
| ZCZX-GLQWGL-UI-002 | 列表 | 编号模糊筛选 | UI 测试 | Playwright+Chrome | §2.6 | 有 P1 `01` | 编号填 `1`→搜索 | 列表含 P1 |
| ZCZX-GLQWGL-UI-003 | 列表 | 无结果 | UI 测试 | Playwright+Chrome | §2.6 | 已登录 | 输入不存在编号→搜索 | 空列表或空状态 |
| ZCZX-GLQWGL-UI-004 | 列表 | 重置 | UI 测试 | Playwright+Chrome | §5.2 | 已筛选 | 搜索→重置 | 条件清空；列表恢复 |
| ZCZX-GLQWGL-UI-005 | 新增圈位 | 有备注保存 | UI 测试 | Playwright+Chrome | §5.1 | 有 add 权限 | 新增→填备注→确定 | 成功提示；列表新行有 2 位编号 |
| ZCZX-GLQWGL-UI-006 | 新增圈位 | 无备注保存 | UI 测试 | Playwright+Chrome | §5.1 | 已登录 | 新增→备注留空→确定 | 成功；备注列为空或「—」 |
| ZCZX-GLQWGL-UI-007 | 新增圈位 | 备注超长 | UI 测试 | Playwright+Chrome | §5.1.3 | 新增 | 输入超 50 字或保存 | 无法输入或校验失败 |
| ZCZX-GLQWGL-UI-008 | 新增圈位 | 编号只读 | UI 测试 | Playwright+Chrome | §2.2 | 打开新增 | 查看圈位编号控件 | 禁用/占位「保存后自动生成」 |
| ZCZX-GLQWGL-UI-009 | 新增圈位 | 取消 | UI 测试 | Playwright+Chrome | §5.1.2 | 新增 | 填备注→取消 | 弹窗关闭；无新行 |
| ZCZX-GLQWGL-UI-010 | 详情 | 只读展示 | UI 测试 | Playwright+Chrome | §5.4 | 有 P1 | 点击查看 | 编号、备注只读；含审计信息 |
| ZCZX-GLQWGL-UI-011 | 编辑 | 改备注 | UI 测试 | Playwright+Chrome | §5.3 | 有 P3 | 编辑→改备注→确定 | 列表备注已更新；编号不变 |
| ZCZX-GLQWGL-UI-012 | 编辑 | 编号不可改 | UI 测试 | Playwright+Chrome | §5.3 | 编辑 P1 | 查看编号控件 | 只读 |
| ZCZX-GLQWGL-UI-013 | 删除 | 确认删除 | UI 测试 | Playwright+Chrome | §5.5 | 无关联行 | 删除→确认 | 行消失 |
| ZCZX-GLQWGL-UI-014 | 删除 | 取消删除 | UI 测试 | Playwright+Chrome | §5.5 | 任意行 | 删除→取消 | 行仍在 |
| ZCZX-GLQWGL-UI-015 | 配置 | 首次设置天数 | UI 测试 | Playwright+Chrome | §5.6 | 无配置；有 config | 设置隔离天数→填 7→确定 | 成功提示；再次打开回显 7 |
| ZCZX-GLQWGL-UI-016 | 配置 | 覆盖更新天数 | UI 测试 | Playwright+Chrome | §5.6 | 已配置 7 天 | 改为 14→确定 | 再次打开为 14 |
| ZCZX-GLQWGL-UI-017 | 配置 | 天数必填/非法 | UI 测试 | Playwright+Chrome | §5.6.5 | 打开配置弹窗 | 留空或填 0→确定 | 前端校验失败 |
| ZCZX-GLQWGL-UI-018 | 配置 | 取消 | UI 测试 | Playwright+Chrome | §5.6.4 | 已配置 | 改天数→取消 | 不保存；再打开仍为原值 |
| ZCZX-GLQWGL-UI-019 | 端到端 | 全流程 | UI 集成 | Playwright+Chrome | §4 | 权限齐备 | 设天数→新增→模糊查→看→改→删 | 无报错 |
| ZCZX-GLQWGL-UI-020 | 权限 | 只读角色 | UI 测试 | Playwright+Chrome | §6 | 仅 list/query | 进入模块 | 无新增/编辑/删除/设置隔离天数 |
| ZCZX-GLQWGL-UI-021 | 详情 | 从详情编辑 | UI 测试 | Playwright+Chrome | §5.4 | 查看 P1 | 点「编辑」 | 进入编辑弹窗；编号只读 |

---

## Playwright 与谷歌浏览器（实施提示）

- 安装：`npm i -D @playwright/test`；`npx playwright install chrome`。  
- 配置：`use: { channel: 'chrome', locale: 'zh-CN', baseURL: 'http://localhost:80' }`；`storageState` 复用登录态。  
- 路由：`page.goto('/tradeMarket/isolationPen')`（以菜单 `component` 为准）。  
- 模糊搜索：`page.getByLabel('圈位编号').fill('1')` 后 `page.getByRole('button', { name: '搜索' }).click()`。  
- 设置隔离天数：`page.getByRole('button', { name: '设置隔离天数' }).click()` → `page.getByLabel('默认隔离天数').fill('7')` → 确定。

---

## 覆盖对照

| 类别 | 单元 UT | 接口 API | 界面 UI |
| --- | --- | --- | --- |
| 正常流程 | UT-009、013～014 | API-005～006、009、011、017～019、023 | UI-005～006、010～012、015～016、019 |
| 异常流程 | UT-003～008 | API-007、010、013、015～016、020～022 | UI-007、013～014、017 |
| 业务约束 | UT-001～004、010 | API-002～004、008、012、021 | UI-002～004、008、012 |
| 编号 01～99 | UT-001～003 | API-005、008、012 | UI-008、012 |
| 模糊筛选 | UT-015 | API-002～003 | UI-002～003 |
| 逻辑删除 | UT-011 | API-004、014～016 | UI-013 |
| 默认隔离天数 | UT-005～008、013～014 | API-017～022 | UI-015～018 |
| 权限/鉴权 | — | API-024～027 | UI-020 |

---

## 功能需求追溯（自查）

| 需求章节 | 要点 | 主要对应用例 |
| --- | --- | --- |
| §5.1 新增圈位 | 备注、编号自动 | UT-004、009；API-005～008；UI-005～009 |
| §5.2 列表 | 编号模糊、分页 | UT-015～016；API-001～004；UI-001～004 |
| §5.3 修改 | 仅备注、编号不可改 | UT-010；API-011～013；UI-011～012 |
| §5.4 详情 | 只读 | API-009～010；UI-010、021 |
| §5.5 删除 | 逻辑删、关联 | UT-011～012；API-014～016；UI-013～014 |
| §5.6 设置隔离天数 | 全局单份配置 | UT-005～008、013～014；API-017～022；UI-015～018 |
| §2.2 编号 | 2 位自动 | UT-001～003；API-005；UI-008 |
| §6 权限 | 含 config | API-024～027；UI-020 |

---

## 修订记录

| 版本 | 说明 |
| --- | --- |
| 1.0 | 初版：单元 16、接口 28、UI 21；覆盖圈位 CRUD、模糊筛选、全局隔离天数、权限；Playwright+Chrome；前缀 **ZCZX-GLQWGL** |
