# 实验室检测 — 测试用例 > 依据:`实验室检测功能需求.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` |