# 实验室检测 — 测试用例

> 依据：`实验室检测功能需求.md`、`实验室检测技术方案.md`  
> **接口 Base Path（示例）**：`/diseaseDetection/labDetection`；若含 `context-path` 或网关前缀须补齐。鉴权与若依一致（Cookie / Token）。

**通用前置（无特殊说明）**：具备本模块菜单与按钮权限的账号已登录。**样本来源枚举**：`1` 场地抽检 / `2` 疫情上报送检 / `3` 调运检疫 / `4` 日常检测。**检出率**：服务端计算 `positiveCount ÷ testQuantity`（`testQuantity=0` 时为 `0`），比值存库；前端 ×100 展示为百分比（建议 2 位小数）。**客户端不得**在新增/修改 Body 中写入 `detectionRate` 生效。

**界面（UI）测试**：借助 **Playwright** 启动 **Chromium**（与 **Google Chrome 同源内核**）；可配置 `channel: 'chrome'` 调用本机已安装的谷歌浏览器。

---

## 一、单元测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| SYJC-UT-001 | 参数校验 | 样本来源枚举 | 单元测试 | JUnit5 | 1～4 合法 | 无 | 传 1、4、0、5 | 1、4 通过；0、5 失败 |
| SYJC-UT-002 | 参数校验 | 检测日期格式 | 单元测试 | JUnit5 | YYYY-MM-DD | 无 | `2026-05-01` 通过；`20260501`、空 失败 | 与 §3.2 一致 |
| SYJC-UT-003 | 参数校验 | 检测量非负整数 | 单元测试 | JUnit5 | ≥0 整数 | 无 | 传 0、100、-1、1.5 | 0、100 通过；-1、1.5 失败 |
| SYJC-UT-004 | 参数校验 | 阳性数非负整数 | 单元测试 | JUnit5 | ≥0 整数 | 无 | 传 0、10、-1、2.3 | 0、10 通过；-1、2.3 失败 |
| SYJC-UT-005 | 数量约束 | 阳性不大于检测量 | 单元测试 | JUnit5 | §5.1 | 无 | `testQuantity=10, positiveCount=11` / `10` | 前者失败；后者通过 |
| SYJC-UT-006 | 数量约束 | 零检测量 | 单元测试 | JUnit5 | §5.1 | 无 | `testQuantity=0, positiveCount=1` / `0` | 前者失败；后者通过 |
| SYJC-UT-007 | 检出率计算 | 常规比值 | 单元测试 | JUnit5 | §2.3 | 无 | `calcRate(100, 12)` | 返回 `0.1200`（与 decimal(8,4) 一致） |
| SYJC-UT-008 | 检出率计算 | 零检测量 | 单元测试 | JUnit5 | §2.3 | 无 | `calcRate(0, 0)` | 返回 `0` |
| SYJC-UT-009 | 检出率计算 | 全阴性 | 单元测试 | JUnit5 | 边界 | 无 | `calcRate(50, 0)` | 返回 `0` |
| SYJC-UT-010 | Service | 新增忽略客户端检出率 | 单元测试 | JUnit5+Mockito | §3.3.1 | 合法 Body 且 `detectionRate=0.99` | `insert` 前清洗并重算 | 落库 `detection_rate` 按数量计算，非 0.99 |
| SYJC-UT-011 | Service | 修改重算检出率 | 单元测试 | JUnit5+Mockito | §3.4 | 已有记录 10/2→0.2 | 改为 `testQuantity=20, positiveCount=4` 后 `update` | 库中 `detection_rate=0.2` |
| SYJC-UT-012 | Service | 修改无状态限制 | 单元测试 | JUnit5+Mockito | §5.3 | 任意有效记录 | `update` 改 `sampleSource` | 成功 |
| SYJC-UT-013 | Service | 列表筛选 SQL | 单元测试 | JUnit5 | §3.1.1 | 无 | `sampleSource=3` | XML 含 `sample_source = 3` |
| SYJC-UT-014 | Service | 列表排序 | 单元测试 | JUnit5 | 技术方案 | 无 | 检查 ORDER BY | `test_date DESC`, `create_time DESC` |
| SYJC-UT-015 | Service | 删除无状态限制 | 单元测试 | JUnit5+Mockito | §5.4 | 任意记录 | `deleteById` | 成功 |
| SYJC-UT-016 | 检疫点 | 必填 | 单元测试 | JUnit5 | §5.1 | 无 | `quarantineStationId=null` | 失败 |
| SYJC-UT-017 | 检疫点 | 仅正常运营 | 单元测试 | JUnit5+Mockito | §2.5 | Mock 停业站 | `validateQuarantineStationId` | 失败；正常站通过 |
| SYJC-UT-018 | 检疫点 | 列表 SQL 筛选 | 单元测试 | JUnit5 | §3.1.1 | 无 | 检查 Mapper XML | 含 `quarantine_station_id = #{quarantineStationId}` |

---

## 二、接口测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| SYJC-API-001 | 列表 | 默认分页排序 | 接口测试 | Postman/curl | §5.2 | 已登录；有多条 | `GET .../labDetection/list` | `rows`≤20；`testDate` 倒序 |
| SYJC-API-002 | 列表 | 样本来源筛选 | 接口测试 | Postman | 精确 | 含来源 1、2 各一条 | `sampleSource=2` | 仅「疫情上报送检」 |
| SYJC-API-003 | 列表 | 未选来源不过滤 | 接口测试 | Postman | 可空 | 多种来源 | 不传 `sampleSource` | 返回全部 |
| SYJC-API-004 | 新增 | 合法全字段 | 接口测试 | Postman | §5.1 | 已登录 | `POST` `testDate`、`sampleSource=1`、`testQuantity=100`、`positiveCount=5` | 成功；`detectionRate=0.05` |
| SYJC-API-005 | 新增 | 零检测量合法 | 接口测试 | Postman | §5.1 | 已登录 | `testQuantity=0, positiveCount=0` | 成功；`detectionRate=0` |
| SYJC-API-006 | 新增 | 非法样本来源 | 接口测试 | Postman | §3.2 | 已登录 | `sampleSource=9` | 失败 |
| SYJC-API-007 | 新增 | 必填缺失 | 接口测试 | Postman | 必填 | 已登录 | 缺 `testDate` | 失败 |
| SYJC-API-008 | 新增 | 阳性大于检测量 | 接口测试 | Postman | §5.1 | 已登录 | `testQuantity=10, positiveCount=11` | 失败 |
| SYJC-API-009 | 新增 | 零检测量阳性非零 | 接口测试 | Postman | §5.1 | 已登录 | `testQuantity=0, positiveCount=1` | 失败 |
| SYJC-API-010 | 新增 | 客户端检出率被忽略 | 接口测试 | Postman | §3.3.1 | 已登录 | `POST` 带 `detectionRate=0.99`，实际 10/1 | 成功；详情 `detectionRate=0.1` |
| SYJC-API-011 | 详情 | 有效 id | 接口测试 | Postman | §5.5 | 已登录 | `GET .../labDetection/{id}` | 含 `testDate`、`sampleSource`、数量、`detectionRate`、审计字段 |
| SYJC-API-012 | 详情 | 无效 id | 接口测试 | Postman | 异常 | 已登录 | 不存在 id | 404 或业务失败 |
| SYJC-API-013 | 修改 | 合法修改并重算率 | 接口测试 | Postman | §5.3 | 记录 100/10 | `PUT` 改 `testQuantity=50, positiveCount=5` | 成功；`detectionRate=0.1` |
| SYJC-API-014 | 修改 | 修改后阳性超量 | 接口测试 | Postman | §3.2 | 有效记录 | `PUT` `positiveCount` 大于 `testQuantity` | 失败；数据不变 |
| SYJC-API-015 | 修改 | 携带检出率被忽略 | 接口测试 | Postman | §3.3.1 | 有效记录 | `PUT` 带 `detectionRate=0.5`，数量 10/2 | 成功；`detectionRate=0.2` |
| SYJC-API-016 | 删除 | 单条删除 | 接口测试 | Postman | §5.4 | 已登录 | `DELETE .../{id}` | 成功；详情不可查 |
| SYJC-API-017 | 删除 | 批量删除 | 接口测试 | Postman | 批量 | 多条 id | `DELETE id1,id2` | 均不可查 |
| SYJC-API-018 | 端到端 | 登记至删除 | 接口测试 | Postman | §4 | 已登录 | 新增→列表→详情→改→再详情→删 | 各步成功；删除后列表无该条 |
| SYJC-API-019 | 鉴权 | 未登录 | 接口测试 | curl | 安全 | 无 Token | `GET .../list` | 401 或统一未登录 |
| SYJC-API-020 | 权限 | 无写权限 | 接口测试 | Postman | 越权 | 仅 list 权限 | `POST` / `PUT` / `DELETE` | 无权限失败 |
| SYJC-API-021 | 响应 | 失败可读 | 接口测试 | Postman | §8 | 已登录 | 触发 API-008、009、014 | `code`、`msg` 可区分场景 |
| SYJC-API-022 | 列表 | 检疫点精确筛选 | 接口测试 | Postman | §5.2 | 两检疫点各一条 | `quarantineStationId=2` | 仅该站记录 |
| SYJC-API-023 | 下拉 | 检疫点选项 | 接口测试 | Postman | §3.6 | 库有正常/停业站 | `GET .../quarantineStationOptions` | 仅 `operate_status=1`；含 `id`、`stationName` |
| SYJC-API-024 | 新增 | 检疫点必填 | 接口测试 | Postman | §5.1 | 已登录 | `POST` 缺 `quarantineStationId` | 失败 |
| SYJC-API-025 | 新增 | 非正常检疫站 | 接口测试 | Postman | §2.5 | 停业站 id=3 | `quarantineStationId=3` | 失败 |

---

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

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

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| SYJC-UI-001 | 列表 | 默认加载排序 | UI 测试 | Playwright+Chrome | §5.2 | 已登录；有数据 | 进入「实验室检测」 | 分页默认 20；检测日期新在前 |
| SYJC-UI-002 | 列表 | 样本来源筛选 | UI 测试 | Playwright+Chrome | 精确 | 含多种来源 | 选「调运检疫」→搜索 | 仅对应行 |
| SYJC-UI-003 | 列表 | 重置筛选 | UI 测试 | Playwright+Chrome | 恢复 | 已筛选 | 点「重置」 | 条件清空；显示全部 |
| SYJC-UI-004 | 列表 | 操作列完整 | UI 测试 | Playwright+Chrome | §6 | 任意有效行 | 查看操作列 | 查看、编辑、删除可见（按权限） |
| SYJC-UI-005 | 新增 | 合法提交 | UI 测试 | Playwright+Chrome | §5.1 | 已登录 | 新增→填日期、来源、检测量 100、阳性 8→确定 | 成功；列表检出率显示 8.00%（或 8%） |
| SYJC-UI-006 | 新增 | 必填校验 | UI 测试 | Playwright+Chrome | 必填 | 已登录 | 漏选样本来源或空检测量→提交 | 校验失败，未提交 |
| SYJC-UI-007 | 新增 | 阳性大于检测量 | UI 测试 | Playwright+Chrome | §5.1 | 已登录 | 检测量 10、阳性 11→提交 | 提示「阳性检出数不能大于检测量」等 |
| SYJC-UI-008 | 新增 | 检出率只读 | UI 测试 | Playwright+Chrome | §2.3 | 已登录 | 打开新增表单；改检测量/阳性 | 检出率自动变化且不可手输 |
| SYJC-UI-009 | 编辑 | 修改成功并重算率 | UI 测试 | Playwright+Chrome | §5.3 | 已有行 | 编辑→检测量改 200、阳性 20→保存 | 列表检出率 10.00% |
| SYJC-UI-010 | 编辑 | 任意记录可编辑 | UI 测试 | Playwright+Chrome | §5.3 | 旧数据行 | 点「编辑」并保存 | 无「已结案不可改」类拦截 |
| SYJC-UI-011 | 删除 | 单条确认删除 | UI 测试 | Playwright+Chrome | §5.4 | 任意行 | 删除→确认 | 行消失 |
| SYJC-UI-012 | 删除 | 取消确认 | UI 测试 | Playwright+Chrome | 确认框 | 任意行 | 删除→取消 | 行仍在 |
| SYJC-UI-013 | 删除 | 批量删除 | UI 测试 | Playwright+Chrome | 批量 | 多条 | 勾选→批量删→确认 | 选中均消失 |
| SYJC-UI-014 | 详情 | 字段完整 | UI 测试 | Playwright+Chrome | §5.5 | 任意记录 | 点「查看」 | 含日期、来源、检测量、阳性、检出率、创建时间等 |
| SYJC-UI-015 | 端到端 | 全流程 | UI 集成 | Playwright+Chrome | §4 | 可新增 | 新增→筛选→编辑→查看→删除 | 与需求一致 |
| SYJC-UI-016 | 权限 | 只读账号 | UI 测试 | Playwright+Chrome | §9 | 无 add/edit/remove | 登录进模块 | 无对应按钮或操作拒绝 |
| SYJC-UI-017 | 错误提示 | 业务失败可读 | UI 测试 | Playwright+Chrome | §8 | 已登录 | 触发阳性超量提交 | Message 含明确原因 |
| SYJC-UI-018 | 列表 | 列展示单位 | UI 测试 | Playwright+Chrome | §2.2 | 有数据 | 查看列表检测量/阳性列 | 带「份」或与需求一致的单位展示 |

---

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

- 安装：`npm i -D @playwright/test`；`npx playwright install chromium`；配置 `use: { channel: 'chrome' }`。  
- 导航：`page.getByText('实验室检测')` 或 `goto('/diseaseDetection/labDetection')`（以实际路由为准）。  
- 筛选：`el-select` 选样本来源后点「搜索」。  
- 检出率：新增/编辑表单输入检测量、阳性后 `expect(rateInput).toBeDisabled()` 且文案含 `%`；如 `100` + `8` → `8.00%`。  
- 删除：行内「删除」→ `el-message-box` 确认；批量勾选后点工具栏删除。

---

## 覆盖对照

| 类别 | 单元 UT | 接口 API | 界面 UI |
| --- | --- | --- | --- |
| 正常流程 | UT-007～012、014 | API-001～005、011、013、016～018 | UI-001～006、009～011、014～015 |
| 异常流程 | UT-001～006 | API-006～009、012、014、019～021 | UI-006～007、012、017 |
| 业务约束 | UT-005～010、015 | API-002～003、008～010、015 | UI-002～004、008、018 |

---

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

| 需求章节 | 要点 | 主要对应用例 |
| --- | --- | --- |
| §5.1 新增 | 四字段必填、检出率系统算 | UT-001～010；API-004～010；UI-005～008 |
| §5.2 列表 | 来源筛选、排序 | UT-013～014；API-001～003；UI-001～003 |
| §5.3 修改 | 均可改、重算率 | UT-011～012；API-013～015；UI-009～010 |
| §5.4 删除 | 均可删、批量 | UT-015；API-016～017；UI-011～013 |
| §5.5 详情 | 全字段含检出率 | API-011；UI-014 |
| §2.3 检出率 | 公式、零检测量、只读 | UT-006～009；API-005、010；UI-008 |
| §6 矩阵 | 查看/改/删 | UI-004、010 | 
| §8 错误 | 可读提示 | API-021；UI-017 |

---

## 修订记录

| 版本 | 说明 |
| --- | --- |
| 1.0 | 初版：单元 15、接口 21、UI 18；Playwright+Chrome；Base `/diseaseDetection/labDetection` |
