# 入场隔离登记 — 测试用例 > 依据:`入场隔离登记功能需求.md`、`入场隔离登记技术方案.md` > **接口 Base Path**:`/tradeMarket/entryIsolation`;鉴权与若依一致(Cookie / Token)。 **通用前置(无特殊说明)**:具备本模块权限的账号已登录(`tradeMarket:entryIsolation:list|query|add|edit|remove`)。关联主数据宜预置: | 类型 | 样本 | 要点 | | --- | --- | --- | | 供应商 `biz_supplier` | **S1** `id=1` 扎西牧民合作社 | `del_flag=0` | | 圈位 `biz_isolation_pen` | **P1** `01`、**P2** `02` | `del_flag=0` | | 全局隔离天数 | **7** 天 | `biz_isolation_setting.default_days=7`(无则前端兜底 3) | **合法新增 Body 示例**(2 头、分 2 圈): ```json { "entryTime": "2026-05-20 10:00:00", "supplierId": 1, "certNo": "QZ20260520001", "quantity": 2, "earTagList": ["E001", "E002"], "isolationDays": 7, "penAllocList": [ { "penId": 1, "earTagList": ["E001"] }, { "penId": 2, "earTagList": ["E002"] } ] } ``` **界面(UI)测试**:**Playwright** + **Chromium**(`channel: 'chrome'` 使用本机 **Google Chrome**)。 --- ## 一、单元测试用例 | 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 | | --- | --- | --- | --- | --- | --- | --- | --- | --- | | ZCZX-RCGLDJ-UT-001 | 耳标解析 | 英文逗号拆分 | 单元测试 | JUnit5 | §2.5 | 无 | `EarTagCodec.parse("A,B,C")` | `["A","B","C"]` | | ZCZX-RCGLDJ-UT-002 | 耳标解析 | 中文逗号 | 单元测试 | JUnit5 | §2.3 | 无 | `parse("A,B")` | 2 段 | | ZCZX-RCGLDJ-UT-003 | 耳标解析 | trim 与空段 | 单元测试 | JUnit5 | §2.3 | 无 | `parse(" A , , B ")` | `["A","B"]` | | ZCZX-RCGLDJ-UT-004 | 耳标解析 | 去重拒绝 | 单元测试 | JUnit5 | §2.3 | 无 | `parse("E1,E1")` | 抛异常或返回需校验失败 | | ZCZX-RCGLDJ-UT-005 | 耳标解析 | 单段超长 | 单元测试 | JUnit5 | §2.5 | 无 | 33 字符耳标 | 校验失败 | | ZCZX-RCGLDJ-UT-006 | 解除日期 | 自然日相加 | 单元测试 | JUnit5 | §2.5 | 无 | `calc("2026-05-20 10:00:00",7)` | `2026-05-27` | | ZCZX-RCGLDJ-UT-007 | 解除日期 | 跨月 | 单元测试 | JUnit5 | §2.5 | 无 | `entry=2026-05-28`,`days=5` | `2026-06-02` | | ZCZX-RCGLDJ-UT-008 | 一致性 | R1 数量=耳标数 | 单元测试 | JUnit5 | §2.6 | 无 | `quantity=3`,耳标 2 个 | 失败 | | ZCZX-RCGLDJ-UT-009 | 一致性 | R2 分圈数量之和 | 单元测试 | JUnit5 | §2.6 | 总量 2 | 分圈 1+2 | 失败 | | ZCZX-RCGLDJ-UT-010 | 一致性 | R3 耳标遗漏 | 单元测试 | JUnit5 | §2.6 | 主表 E1,E2 | 分圈仅 E1 | 失败 | | ZCZX-RCGLDJ-UT-011 | 一致性 | R4 跨圈重复耳标 | 单元测试 | JUnit5 | §2.6 | 主表 E1,E2 | 两圈均含 E1 | 失败 | | ZCZX-RCGLDJ-UT-012 | 一致性 | R5 本圈数量 | 单元测试 | JUnit5 | §2.6 | 无 | 圈行 quantity=2,耳标 1 个 | 失败 | | ZCZX-RCGLDJ-UT-013 | 一致性 | 合法全量 | 单元测试 | JUnit5 | §2.6 | 合法 Body | `validate(saveDto)` | 通过 | | ZCZX-RCGLDJ-UT-014 | 一致性 | 分圈为空 | 单元测试 | JUnit5 | §5.1 | 无 | `penAllocList=[]` | 失败 | | ZCZX-RCGLDJ-UT-015 | 一致性 | 同登记重复圈位 | 单元测试 | JUnit5 | §5.1.3 | 无 | 两条 `penId=1` | 失败 | | ZCZX-RCGLDJ-UT-016 | 外键 | 供应商已删 | 单元测试 | JUnit5+Mockito | §2.8 | `del_flag=2` | `validate` | 失败 | | ZCZX-RCGLDJ-UT-017 | 外键 | 圈位已删 | 单元测试 | JUnit5+Mockito | §2.8 | 圈位已删 | `validate` | 失败 | | ZCZX-RCGLDJ-UT-018 | 字段校验 | 检疫证号长度 | 单元测试 | JUnit5 | §5.1 | 无 | 空、51 字、50 字 | 空/51 失败;50 通过 | | ZCZX-RCGLDJ-UT-019 | 字段校验 | 隔离天数范围 | 单元测试 | JUnit5 | §5.1 | 无 | `0`、`1`、`3650`、`3651` | 0/3651 失败;1/3650 通过 | | ZCZX-RCGLDJ-UT-020 | 文件校验 | 检疫证后缀 | 单元测试 | JUnit5 | §2.7 | 无 | `.exe`、`.pdf`、`.PDF` | exe 失败;pdf 通过 | | ZCZX-RCGLDJ-UT-021 | Service | 新增主从落库 | 单元测试 | JUnit5+Mockito | §3.3 | Mock Mapper | `insert` 合法样本 | 主表 `del_flag=0`;子表 2 行;`expected_release_date` 已算 | | ZCZX-RCGLDJ-UT-022 | Service | 修改覆盖分圈 | 单元测试 | JUnit5+Mockito | §3.3 | 已有 2 条子表 | `update` 新 `penAllocList` | 旧子表删净;新子表插入 | | ZCZX-RCGLDJ-UT-023 | Service | 逻辑删除 | 单元测试 | JUnit5+Mockito | §3.4 | Mock | `remove(id)` | 主表 `del_flag=2` | | ZCZX-RCGLDJ-UT-024 | Service | 删除有关联 | 单元测试 | JUnit5+Mockito | §2.9 | `hasReference=true` | `remove` | 抛 `ServiceException` | --- ## 二、接口测试用例 | 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 | | --- | --- | --- | --- | --- | --- | --- | --- | --- | | ZCZX-RCGLDJ-API-001 | 列表 | 默认分页排序 | 接口测试 | Postman | §3.1 | 有登记数据 | `GET /list` | `code=200`;≤20 条;`entryTime` 倒序 | | ZCZX-RCGLDJ-API-002 | 列表 | 进场日期区间 | 接口测试 | Postman | §5.2.1 | 已知进场日 | `entryDateStart/End` 含该日 | 命中;区间外不出现 | | ZCZX-RCGLDJ-API-003 | 列表 | 检疫证号模糊 | 接口测试 | Postman | §5.2.1 | 证号 `QZ2026` | `certNo=QZ2026` | 含片段行 | | ZCZX-RCGLDJ-API-004 | 列表 | 供应商精确 | 接口测试 | Postman | §5.2.1 | S1、S2 各有登记 | `supplierId=S1` | 仅 S1 记录 | | ZCZX-RCGLDJ-API-005 | 列表 | 组合筛选 | 接口测试 | Postman | 多条件 | 已登录 | 日期+证号+供应商 | 同时满足才命中 | | ZCZX-RCGLDJ-API-006 | 列表 | 不含已删除 | 接口测试 | Postman | 逻辑删除 | 某 id 已删 | `GET /list` | 无该 id | | ZCZX-RCGLDJ-API-007 | 新增 | 合法全量 | 接口测试 | Postman | §5.1 | S1、P1/P2 | `POST` 合法 Body | `code=200`;`expectedReleaseDate=2026-05-27` | | ZCZX-RCGLDJ-API-008 | 新增 | 含检疫证文件 | 接口测试 | Postman | §2.7 | 已 `/common/upload` pdf | Body 带 `certFileUrl/Path` | 成功;详情可下载 | | ZCZX-RCGLDJ-API-009 | 新增 | 缺供应商 | 接口测试 | Postman | 异常 | 已登录 | 无 `supplierId` | 失败 | | ZCZX-RCGLDJ-API-010 | 新增 | 缺检疫证号 | 接口测试 | Postman | 异常 | 已登录 | 空 `certNo` | 失败 | | ZCZX-RCGLDJ-API-011 | 新增 | R1 数量≠耳标数 | 接口测试 | Postman | §2.6 R1 | 已登录 | `quantity=2`,耳标 1 个 | 失败;msg 含数量/耳标 | | ZCZX-RCGLDJ-API-012 | 新增 | R2 分圈数量之和 | 接口测试 | Postman | §2.6 R2 | 总量 2 | 分圈 2+1 | 失败 | | ZCZX-RCGLDJ-API-013 | 新增 | R3 未分圈耳标 | 接口测试 | Postman | §2.6 R3 | 主表 E1,E2 | 分圈仅 E1 | 失败 | | ZCZX-RCGLDJ-API-014 | 新增 | R4 耳标跨圈重复 | 接口测试 | Postman | §2.6 R4 | 主表 E1,E2 | 两圈均 E1 | 失败 | | ZCZX-RCGLDJ-API-015 | 新增 | 重复圈位 | 接口测试 | Postman | §5.1.3 | 已登录 | 两条相同 `penId` | 失败 | | ZCZX-RCGLDJ-API-016 | 新增 | 无效供应商 | 接口测试 | Postman | §2.8 | 已删供应商 id | `POST` | 失败 | | ZCZX-RCGLDJ-API-017 | 新增 | 无效圈位 | 接口测试 | Postman | §2.8 | 已删 `penId` | `POST` | 失败 | | ZCZX-RCGLDJ-API-018 | 新增 | 检疫证后缀非法 | 接口测试 | Postman | §2.7 | 已登录 | `certFilePath` 为 `.exe` | 失败 | | ZCZX-RCGLDJ-API-019 | 新增 | 隔离天数非法 | 接口测试 | Postman | §5.1 | 已登录 | `isolationDays=0`/`3651` | 失败 | | ZCZX-RCGLDJ-API-020 | 新增 | 主表耳标重复 | 接口测试 | Postman | §2.3 | 已登录 | `earTagList=["E1","E1"]` | 失败 | | ZCZX-RCGLDJ-API-021 | 新增 | 分圈耳标超集 | 接口测试 | Postman | §5.1.3 | 主表 E1 | 分圈含 E9 | 失败 | | ZCZX-RCGLDJ-API-022 | 详情 | 有效 id | 接口测试 | Postman | §5.4 | 有登记 E1 | `GET /{id}` | 含 `supplierName`、`earTagList`、`penAllocList` | | ZCZX-RCGLDJ-API-023 | 详情 | 无效/已删 id | 接口测试 | Postman | 异常 | 已登录 | 不存在或已删 | 失败或 `data` 空 | | ZCZX-RCGLDJ-API-024 | 修改 | 改证号与分圈 | 接口测试 | Postman | §5.3 | 有 E1 | `PUT` 改 `certNo`、重排分圈 | 成功;子表全量覆盖 | | ZCZX-RCGLDJ-API-025 | 修改 | 进场时间联动日期 | 接口测试 | Postman | §2.5 | 有 E1 | `PUT` `entryTime`+`isolationDays` | `expectedReleaseDate` 重算 | | ZCZX-RCGLDJ-API-026 | 修改 | 违反 R1 | 接口测试 | Postman | §2.6 | 有 E1 | `PUT` 数量与耳标不一致 | 失败 | | ZCZX-RCGLDJ-API-027 | 修改 | 不存在 id | 接口测试 | Postman | 异常 | 已登录 | 伪造 id `PUT` | 失败 | | ZCZX-RCGLDJ-API-028 | 删除 | 单条逻辑删 | 接口测试 | Postman | §5.5 | 无关联新行 | `DELETE /{id}` | 成功;列表不可见 | | ZCZX-RCGLDJ-API-029 | 删除 | 有关联拒绝 | 接口测试 | Postman | §2.9 | `hasReference=true` | `DELETE` | 失败;提示关联 | | ZCZX-RCGLDJ-API-030 | 删除 | 重复删除 | 接口测试 | Postman | 幂等 | 已删 id | 再次 `DELETE` | 失败或不存在 | | ZCZX-RCGLDJ-API-031 | 端到端 | CRUD 串联 | 接口测试 | Postman | §4 | 已登录 | `POST`→`list`→`GET`→`PUT`→`DELETE` | 每步 `code=200` | | ZCZX-RCGLDJ-API-032 | 鉴权 | 未登录 | 接口测试 | curl | 安全 | 无 Token | `GET /list` | 401 或统一未登录 | | ZCZX-RCGLDJ-API-033 | 权限 | 无新增权限 | 接口测试 | Postman | §6 | 仅 list | `POST` | 无权限失败 | | ZCZX-RCGLDJ-API-034 | 权限 | 无删除权限 | 接口测试 | Postman | §6 | 无 remove | `DELETE` | 无权限失败 | | ZCZX-RCGLDJ-API-035 | 响应 | 失败可读 | 接口测试 | Postman | §8 | 已登录 | 触发 R1、重复圈位 | `msg` 可区分场景 | --- ## 三、界面测试用例(UI) **测试工具**:**Playwright** + **Chromium**(`channel: 'chrome'` 使用本机 **Google Chrome**)。 | 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 | | --- | --- | --- | --- | --- | --- | --- | --- | --- | | ZCZX-RCGLDJ-UI-001 | 列表 | 默认展示 | UI 测试 | Playwright+Chrome | §5.2.3 | 已登录;有数据 | 进入「入场隔离登记」 | 含进场时间、供应商、检疫证号、数量、圈位分配、隔离天数、解除日期、操作 | | ZCZX-RCGLDJ-UI-002 | 列表 | 进场日期筛选 | UI 测试 | Playwright+Chrome | §5.2.1 | 已知日期登记 | 选日期范围→搜索 | 仅范围内记录 | | ZCZX-RCGLDJ-UI-003 | 列表 | 检疫证号模糊 | UI 测试 | Playwright+Chrome | §5.2.1 | 有证号含 QZ | 填片段→搜索 | 命中对应行 | | ZCZX-RCGLDJ-UI-004 | 列表 | 供应商筛选 | UI 测试 | Playwright+Chrome | §5.2.1 | 多供应商数据 | 下拉选 S1→搜索 | 仅 S1 | | ZCZX-RCGLDJ-UI-005 | 列表 | 重置 | UI 测试 | Playwright+Chrome | §5.2 | 已筛选 | 搜索→重置 | 条件清空;列表恢复 | | ZCZX-RCGLDJ-UI-006 | 列表 | 圈位分配表 | UI 测试 | Playwright+Chrome | §5.2.3 | 有分圈数据 | 点击「圈位分配表」 | 弹窗展示圈位编号、数量、耳标 | | ZCZX-RCGLDJ-UI-007 | 新增 | 进场时间默认 | UI 测试 | Playwright+Chrome | §5.1 | 有 add 权限 | 打开新增弹窗 | 进场时间≈当前时刻 | | ZCZX-RCGLDJ-UI-008 | 新增 | 供应商模糊选 | UI 测试 | Playwright+Chrome | §2.8 | 有 S1 | 供应商输入关键字→选 S1 | 选中后展示名称 | | ZCZX-RCGLDJ-UI-009 | 新增 | 隔离天数默认 | UI 测试 | Playwright+Chrome | §2.5 | 全局 7 天 | 打开新增 | 隔离天数默认 7 | | ZCZX-RCGLDJ-UI-010 | 新增 | 预计解除日期联动 | UI 测试 | Playwright+Chrome | §2.5 | 新增弹窗 | 改进场日期或隔离天数 | 解除日期自动更新 | | ZCZX-RCGLDJ-UI-011 | 新增 | 上传检疫证合法 | UI 测试 | Playwright+Chrome | §2.7 | 有 pdf≤30MB | 上传 pdf | 成功;可预览/删除 | | ZCZX-RCGLDJ-UI-012 | 新增 | 上传格式/大小非法 | UI 测试 | Playwright+Chrome | §2.7 | 有 exe 或超大文件 | 选择上传 | 提示格式或 10/30MB 限制 | | ZCZX-RCGLDJ-UI-013 | 新增 | 添加分圈成功 | UI 测试 | Playwright+Chrome | §5.1.3 | 主表耳标 E1,E2 | 添加分圈→P1 选 E1→P2 选 E2→确定 | 表格 2 行;数量各 1 | | ZCZX-RCGLDJ-UI-014 | 新增 | 分圈耳标不可重复选 | UI 测试 | Playwright+Chrome | §5.1.3 R4 | 已分圈 E1 | 再添加分圈 | 下拉无 E1 或选后校验失败 | | ZCZX-RCGLDJ-UI-015 | 新增 | 同圈位不可重复 | UI 测试 | Playwright+Chrome | §5.1.3 | 已占 P1 | 再添加 P1 | 提示圈位已添加 | | ZCZX-RCGLDJ-UI-016 | 新增 | 保存合法全流程 | UI 测试 | Playwright+Chrome | §4.2 | 权限齐备 | 填主表+分圈→确定 | 成功提示;列表新行数据正确 | | ZCZX-RCGLDJ-UI-017 | 新增 | R1 前端校验 | UI 测试 | Playwright+Chrome | §2.6 | 新增 | 数量 2、耳标 1 个→保存 | 校验失败;不提交 | | ZCZX-RCGLDJ-UI-018 | 新增 | 未分圈保存 | UI 测试 | Playwright+Chrome | §5.1 | 新增 | 填主表无分圈→保存 | 提示须添加分圈 | | ZCZX-RCGLDJ-UI-019 | 新增 | 取消 | UI 测试 | Playwright+Chrome | §5.1.4 | 新增 | 填数据→取消 | 弹窗关;无新行 | | ZCZX-RCGLDJ-UI-020 | 查看 | 只读含分圈 | UI 测试 | Playwright+Chrome | §5.4 | 有登记 | 点击查看 | 主表只读;分圈表只读;有检疫证链接 | | ZCZX-RCGLDJ-UI-021 | 编辑 | 改分圈保存 | UI 测试 | Playwright+Chrome | §5.3 | 有登记 | 编辑→删一行分圈→重分圈→确定 | 列表/详情已更新 | | ZCZX-RCGLDJ-UI-022 | 编辑 | 分圈行删除 | UI 测试 | Playwright+Chrome | §5.1.2 | 编辑 | 分圈表点删除 | 行移除 | | ZCZX-RCGLDJ-UI-023 | 删除 | 确认删除 | UI 测试 | Playwright+Chrome | §5.5 | 无关联行 | 删除→确认 | 行消失 | | ZCZX-RCGLDJ-UI-024 | 删除 | 取消删除 | UI 测试 | Playwright+Chrome | §5.5 | 任意行 | 删除→取消 | 行仍在 | | ZCZX-RCGLDJ-UI-025 | 端到端 | 全流程 | UI 集成 | Playwright+Chrome | §4 | 权限齐备 | 新增→筛选→圈位表→查看→编辑→删除 | 无报错;数据一致 | | ZCZX-RCGLDJ-UI-026 | 权限 | 只读角色 | UI 测试 | Playwright+Chrome | §6 | 仅 list/query | 进入模块 | 无新增/编辑/删除按钮 | | ZCZX-RCGLDJ-UI-027 | 查看 | 从详情进编辑 | UI 测试 | Playwright+Chrome | §5.4 | 查看弹窗 | 点「编辑」 | 进入编辑弹窗;数据回显 | --- ## Playwright 与谷歌浏览器(实施提示) - 安装:`npm i -D @playwright/test`;`npx playwright install chrome`。 - 配置:`use: { channel: 'chrome', locale: 'zh-CN', baseURL: 'http://localhost:80' }`;`storageState` 复用登录态。 - 路由:`page.goto('/tradeMarket/entryIsolation')`(以菜单 `component` 为准)。 - 新增:`page.getByRole('button', { name: '新增' }).click()` → 填进场时间、选供应商、检疫证号、数量、耳标 → `getByRole('button', { name: '添加分圈' })` 完成分圈 → 确定。 - 分圈子窗:`page.getByLabel('圈位编号').click()` 选圈位 → 耳标多选 → 确定。 - 列表筛选:`page.getByLabel('进场日期')` 用 `daterange`;`getByRole('button', { name: '搜索' }).click()`。 --- ## 覆盖对照 | 类别 | 单元 UT | 接口 API | 界面 UI | | --- | --- | --- | --- | | 正常流程 | UT-013、021~022 | API-007~008、022、024~025、031 | UI-006~011、013、016、020~021、025 | | 异常流程 | UT-004、008~012、014~017、024 | API-009~010、011~021、023、026~030 | UI-012、017~018、023~024 | | 业务约束 R1~R5 | UT-008~015 | API-011~015、020~021、026 | UI-013~018 | | 解除日期计算 | UT-006~007 | API-007、025 | UI-009~010 | | 耳标解析 | UT-001~005 | API-020 | UI-013~014 | | 关联主数据 | UT-016~017 | API-016~017 | UI-008 | | 检疫证文件 | UT-020 | API-008、018 | UI-011~012 | | 列表筛选 | — | API-002~005 | UI-002~005 | | 逻辑删除 | UT-023 | API-006、028~030 | UI-023 | | 权限/鉴权 | — | API-032~034 | UI-026 | --- ## 功能需求追溯(自查) | 需求章节 | 要点 | 主要对应用例 | | --- | --- | --- | | §5.1 新增 | 主表+分圈、校验 | UT-008~015、021;API-007~021;UI-007~019 | | §5.2 列表 | 日期/证号/供应商 | API-002~005;UI-002~006 | | §5.3 修改 | 全量可改、重算日期 | UT-022;API-024~026;UI-021~022 | | §5.4 查看 | 只读、圈位分配表 | API-022;UI-006、020、027 | | §5.5 删除 | 逻辑删、关联 | UT-023~024;API-028~030;UI-023~024 | | §2.6 一致性 | R1~R5 | UT-008~015;API-011~015;UI-013~018 | | §2.5 解除日期 | 自动计算 | UT-006~007;API-007、025;UI-010 | | §2.7 检疫证 | 后缀/大小 | UT-020;API-008、018;UI-011~012 | | §2.8 关联 | 供应商/圈位 | UT-016~017;API-016~017;UI-008 | | §6 权限 | 按钮级 | API-032~034;UI-026 | --- ## 修订记录 | 版本 | 说明 | | --- | --- | | 1.0 | 初版:单元 24、接口 35、UI 27;覆盖 R1~R5、主从表 CRUD、筛选、检疫证、Playwright+Chrome;前缀 **ZCZX-RCGLDJ** |