# 牧场管理 — 测试用例

> 依据：`牧场管理功能需求.md`、`牧场管理技术方案.md`  
> **接口 Base Path（示例）**：`/dataModel/pasture`；若含 `context-path` 或网关前缀须补齐。鉴权与若依一致（Cookie / Token）。

**通用前置（无特殊说明）**：具备本模块菜单与按钮权限的账号已登录；可先调 `POST /common/upload` 取得照片 `url`、`fileName`（作 `photoFilePath`）。**牧场性质**：`1` 个体、`2` 企业。**经营状态**：`1` 正常、`2` 停业、`3` 注销（新建默认 `1`）。**测试数据**：合法个体身份证（如 `11010519491231002X`）、合法企业主体识别号（18 位）、11 位手机号、省/市/县三级选全；照片白名单 `jpg`/`jpeg`/`png`（≤10MB）。

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

---

## 一、单元测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-MCGL-UT-001 | 参数校验 | 牧场名称长度 | 单元测试 | JUnit5 | 1～10 字 | 无 | 空串、1 字、10 字、21 字 | 空/21 失败；1～10 通过 |
| ZCZX-MCGL-UT-002 | 参数校验 | 简介字数 | 单元测试 | JUnit5 | 选填≤50 | 无 | null/空通过；51 字失败 | 符合 §5.1 |
| ZCZX-MCGL-UT-003 | 参数校验 | 牧场性质枚举 | 单元测试 | JUnit5 | 仅 1～2 | 无 | `pastureNature` 为 1/2 通过；0、3、null 失败 | 与 §2.2 一致 |
| ZCZX-MCGL-UT-004 | 参数校验 | 个体身份证 | 单元测试 | JUnit5 | §2.3 | `pastureNature=1` | 合法 18 位、17 位、校验位错误 | 仅合法通过；错误提示含「身份证」 |
| ZCZX-MCGL-UT-005 | 参数校验 | 企业主体识别号 | 单元测试 | JUnit5 | §2.3 | `pastureNature=2` | 合法 18 位、15 位、含非法字符 | 仅合法通过；错误提示含「主体识别号」类 |
| ZCZX-MCGL-UT-006 | 参数校验 | 联系电话 | 单元测试 | JUnit5 | 大陆手机号 | 无 | 合法 11 位、10 位、非 1 开头 | 仅合法通过 |
| ZCZX-MCGL-UT-007 | 参数校验 | 所属区域 | 单元测试 | JUnit5 | 须选至县 | 无 | 缺省/市/县任一 code 或 name | 失败；六级齐全通过 |
| ZCZX-MCGL-UT-008 | 参数校验 | 详细地址/负责人 | 单元测试 | JUnit5 | 选填上限 | 无 | 地址 51 字、负责人 11 字 | 失败；合法长度通过 |
| ZCZX-MCGL-UT-009 | 参数校验 | 经营状态枚举 | 单元测试 | JUnit5 | 1～3 | 无 | `bizStatus` 为 1/3 通过；0、4 失败 | 与技术方案一致 |
| ZCZX-MCGL-UT-010 | 附件校验 | 照片后缀 | 单元测试 | JUnit5 | 白名单 | 无 | `.jpg` 通过；`.exe`、`.bmp` 失败 | 与 §5.1 一致 |
| ZCZX-MCGL-UT-011 | 附件校验 | 照片成对 | 单元测试 | JUnit5 | url/path | 无 | 仅 url 无 path；二者齐全或皆空 | 单字段失败；成对/皆空通过 |
| ZCZX-MCGL-UT-012 | 业务默认 | 缺省经营状态 | 单元测试 | JUnit5 | 新增默认正常 | 无 | `resolveBizStatus(null)` 或 insert 未传 | 结果为 `1` |
| ZCZX-MCGL-UT-013 | 证件联动 | 性质切换校验 | 单元测试 | JUnit5 | §2.3 | 无 | 个体证号+企业性质 / 企业证号+个体性质 | 均失败 |
| ZCZX-MCGL-UT-014 | Service | 新增落库 | 单元测试 | JUnit5+Mockito | 正常登记 | 合法实体 | `insert(pasture)` | `del_flag=0`；`biz_status` 正确 |
| ZCZX-MCGL-UT-015 | Service | 修改全字段 | 单元测试 | JUnit5+Mockito | §5.3 | 已存在 id | `update` 改名称、状态、区划 | 更新成功 |
| ZCZX-MCGL-UT-016 | Service | 经营状态互改 | 单元测试 | JUnit5+Mockito | 1↔2↔3 | 原 `biz_status=2` | `update` 改为 `1` 或 `3` | 成功（默认允许） |
| ZCZX-MCGL-UT-017 | Service | 逻辑删除 | 单元测试 | JUnit5+Mockito | §5.4 | Mock Mapper | `remove([id])` | 调用 `del_flag=2`；非物理 DELETE |
| ZCZX-MCGL-UT-018 | Service | 删除清照片 | 单元测试 | JUnit5+Mockito | 删文件 | 有 `photo_file_path` | `remove([id])` | Mock 验证 `deleteFile(path)` |
| ZCZX-MCGL-UT-019 | Service | 换照片删旧 | 单元测试 | JUnit5+Mockito | §5.3 | 旧 path 已知 | `update` 换新 `photoFilePath` | Mock 验证删除旧 path |
| ZCZX-MCGL-UT-020 | Mapper | 列表排序与删除过滤 | 单元测试 | JUnit5 | 技术方案 | 无 | 检查 XML：`ORDER BY` 与 `del_flag='0'` | 含 `create_time desc`；列表带 `del_flag=0` |

---

## 二、接口测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-MCGL-API-001 | 列表 | 默认分页排序 | 接口测试 | Postman/curl | §5.2 | 已登录；有多条记录 | `GET /dataModel/pasture/list` | `rows`≤20；`createTime` 新在前 |
| ZCZX-MCGL-API-002 | 列表 | 关键字-名称 | 接口测试 | Postman | 名称模糊 | 已登录 | `keyword=` 唯一名称片段 | 命中含该片段记录 |
| ZCZX-MCGL-API-003 | 列表 | 性质筛选-个体 | 接口测试 | Postman | 精确 | 已登录 | `pastureNature=1` | 均为个体 |
| ZCZX-MCGL-API-004 | 列表 | 性质筛选-企业 | 接口测试 | Postman | 精确 | 已登录 | `pastureNature=2` | 均为企业 |
| ZCZX-MCGL-API-005 | 列表 | 经营状态筛选 | 接口测试 | Postman | 精确 | 有停业样本 | `bizStatus=2` | 均为停业 |
| ZCZX-MCGL-API-006 | 列表 | 组合查询 | 接口测试 | Postman | 多条件 | 已登录 | keyword+pastureNature+bizStatus | 同时满足 |
| ZCZX-MCGL-API-007 | 列表 | 不含已删除 | 接口测试 | Postman | 逻辑删除 | 已知 id 已删 | `GET list` | 列表无该 id |
| ZCZX-MCGL-API-008 | 新增 | 合法全字段 | 接口测试 | Postman | §5.1 | 已登录；已上传照片 | `POST` Body 合法 | `code` 成功；详情字段齐全 |
| ZCZX-MCGL-API-009 | 新增 | 最小必填无照片 | 接口测试 | Postman | 选填照片 | 已登录 | `POST` 必填项齐全、无照片/简介 | 成功；`bizStatus` 为 `1` 或入参值 |
| ZCZX-MCGL-API-010 | 新增 | 缺省经营状态 | 接口测试 | Postman | 默认正常 | 已登录 | `POST` 不传 `bizStatus` | 落库 `bizStatus=1` |
| ZCZX-MCGL-API-011 | 新增 | 个体+身份证 | 接口测试 | Postman | §2.3 | 已登录 | `pastureNature=1`+合法身份证 | 成功 |
| ZCZX-MCGL-API-012 | 新增 | 企业+识别号 | 接口测试 | Postman | §2.3 | 已登录 | `pastureNature=2`+合法主体号 | 成功 |
| ZCZX-MCGL-API-013 | 新增 | 名称非法 | 接口测试 | Postman | 1～10 | 已登录 | 名称空/11 字 | 失败；无新记录 |
| ZCZX-MCGL-API-014 | 新增 | 性质非法 | 接口测试 | Postman | 枚举 | 已登录 | `pastureNature=0` | 失败 |
| ZCZX-MCGL-API-015 | 新增 | 个体证号非法 | 接口测试 | Postman | 校验 | 已登录 | `pastureNature=1`+错误证号 | 失败；`msg` 可区分 |
| ZCZX-MCGL-API-016 | 新增 | 手机号非法 | 接口测试 | Postman | 校验 | 已登录 | 10 位手机号 | 失败 |
| ZCZX-MCGL-API-017 | 新增 | 区划未选全 | 接口测试 | Postman | 至县级 | 已登录 | 缺 `countyCode` | 失败 |
| ZCZX-MCGL-API-018 | 新增 | 照片仅 url | 接口测试 | Postman | 成对 | 已登录 | 有 url 无 path | 失败 |
| ZCZX-MCGL-API-019 | 详情 | 有效 id | 接口测试 | Postman | §5.5 | 已登录 | `GET /dataModel/pasture/{id}` | 含区划、状态、照片及审计字段 |
| ZCZX-MCGL-API-020 | 详情 | 无效/已删 id | 接口测试 | Postman | 异常 | 已登录 | 不存在或 `del_flag=2` 的 id | 业务失败或空数据 |
| ZCZX-MCGL-API-021 | 修改 | 合法修改 | 接口测试 | Postman | §5.3 | 已登录；有记录 | `PUT` 改名称、负责人 | 成功；详情已更新 |
| ZCZX-MCGL-API-022 | 修改 | 性质变更重校证件 | 接口测试 | Postman | §2.3 | 个体记录 | `PUT` 改 `pastureNature=2` 且证号仍为身份证 | 失败 |
| ZCZX-MCGL-API-023 | 修改 | 经营状态变更 | 接口测试 | Postman | 1↔2↔3 | 有记录 | `PUT` `bizStatus` 从 1→3 | 成功 |
| ZCZX-MCGL-API-024 | 修改 | 替换照片 | 接口测试 | Postman | 删旧 | 有旧照片 path | `PUT` 换新 photo 成对 | 成功；旧 URL 不可访问（抽查） |
| ZCZX-MCGL-API-025 | 删除 | 单条逻辑删除 | 接口测试 | Postman | §5.4 | 已登录 | `DELETE /dataModel/pasture/{id}` | 成功；列表/详情不可见 |
| ZCZX-MCGL-API-026 | 删除 | 批量删除 | 接口测试 | Postman | 批量 | 已登录 | `DELETE id1,id2` | 均不可查 |
| ZCZX-MCGL-API-027 | 端到端 | CRUD 串联 | 接口测试 | Postman | §4 | 已登录 | 新增(个体)→列表→详情→改企业证号→删 | 每步成功（改企业须换合法主体号） |
| ZCZX-MCGL-API-028 | 鉴权 | 未登录 | 接口测试 | curl | 安全 | 无 Token | `GET .../list` | 401 或统一未登录 |
| ZCZX-MCGL-API-029 | 权限 | 无写权限 | 接口测试 | Postman | 越权 | 仅 list 权限 | `POST .../pasture` | 无权限失败 |
| ZCZX-MCGL-API-030 | 响应 | 失败可读 | 接口测试 | Postman | §7 | 已登录 | 触发名称空、证号错等 | Body 含 `code`、`msg` 且可区分 |

---

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

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

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-MCGL-UI-001 | 列表 | 默认分页排序 | UI 测试 | Playwright+Chrome | §5.2 | 已登录；数据>20 | 进入「牧场管理」菜单 | 默认每页 20；创建时间新在前 |
| ZCZX-MCGL-UI-002 | 列表 | 关键字查询 | UI 测试 | Playwright+Chrome | 名称模糊 | 有名称含关键词记录 | 输入牧场名称→搜索 | 表格含该行 |
| ZCZX-MCGL-UI-003 | 列表 | 牧场性质筛选 | UI 测试 | Playwright+Chrome | 精确 | 个体/企业均有 | 选「个体」→搜索 | 性质列均为个体 |
| ZCZX-MCGL-UI-004 | 列表 | 经营状态筛选 | UI 测试 | Playwright+Chrome | 精确 | 多状态均有 | 选「停业」→搜索 | 状态列均为停业 |
| ZCZX-MCGL-UI-005 | 列表 | 组合与重置 | UI 测试 | Playwright+Chrome | 恢复条件 | 已多条件筛选 | 搜索→点「重置」 | 条件清空；恢复默认列表 |
| ZCZX-MCGL-UI-006 | 列表 | 操作列与地图 | UI 测试 | Playwright+Chrome | §5.6 不做 | 有数据行 | 查看操作列 | 有查看/编辑/删除；**无**地图标点或置灰提示 |
| ZCZX-MCGL-UI-007 | 新增 | 合法全字段 | UI 测试 | Playwright+Chrome | §5.1 | 已登录 | 新增→填必填+选区划至县+上传 jpg→确定 | 成功；列表出现新记录 |
| ZCZX-MCGL-UI-008 | 新增 | 无照片无简介 | UI 测试 | Playwright+Chrome | 选填 | 已登录 | 仅必填项→确定 | 成功 |
| ZCZX-MCGL-UI-009 | 新增 | 默认经营状态 | UI 测试 | Playwright+Chrome | 默认正常 | 已登录 | 打开新增弹窗 | 经营状态默认「正常」 |
| ZCZX-MCGL-UI-010 | 新增 | 个体与企业证件 | UI 测试 | Playwright+Chrome | §2.3 | 已登录 | 分别选个体/企业并填对应证件→保存 | 均成功；错误证号有区分提示 |
| ZCZX-MCGL-UI-011 | 新增 | 名称空或超长 | UI 测试 | Playwright+Chrome | 1～10 | 已登录 | 名称留空或 11 字→确定 | 校验失败 |
| ZCZX-MCGL-UI-012 | 新增 | 区划未选至县 | UI 测试 | Playwright+Chrome | 三级 | 已登录 | 仅选省/市→确定 | 提示须选至县级 |
| ZCZX-MCGL-UI-013 | 新增 | 手机号非法 | UI 测试 | Playwright+Chrome | 校验 | 已登录 | 填 10 位手机→确定 | 校验失败 |
| ZCZX-MCGL-UI-014 | 新增 | 照片格式非法 | UI 测试 | Playwright+Chrome | §5.1 | 准备 .bmp | `setInputFiles` 上传→确定 | 拒绝或明确错误 |
| ZCZX-MCGL-UI-015 | 新增 | 性质切换证件 | UI 测试 | Playwright+Chrome | 联动 | 新增弹窗 | 先选个体填身份证→改企业→确定 | 提示重新填写/校验主体号 |
| ZCZX-MCGL-UI-016 | 详情 | 字段完整 | UI 测试 | Playwright+Chrome | §5.5 | 任意记录 | 点「查看」 | 名称、性质、证件、区划、地址、负责人、手机、状态、照片齐全 |
| ZCZX-MCGL-UI-017 | 修改 | 编辑成功 | UI 测试 | Playwright+Chrome | §5.3 | 有记录 | 编辑→改牧场名称→确定 | 列表/详情已更新 |
| ZCZX-MCGL-UI-018 | 修改 | 经营状态变更 | UI 测试 | Playwright+Chrome | 状态互改 | 正常记录 | 改为「注销」→保存 | 列表显示注销 |
| ZCZX-MCGL-UI-019 | 修改 | 替换照片 | UI 测试 | Playwright+Chrome | §5.3 | 有照片 | 编辑→换 png→保存 | 详情为新图 |
| ZCZX-MCGL-UI-020 | 删除 | 确认删除 | UI 测试 | Playwright+Chrome | §5.4 | 有记录 | 删除→确认 | 列表无该行 |
| ZCZX-MCGL-UI-021 | 删除 | 取消删除 | UI 测试 | Playwright+Chrome | 确认框 | 有记录 | 删除→取消 | 记录仍在 |
| ZCZX-MCGL-UI-022 | 删除 | 批量删除 | UI 测试 | Playwright+Chrome | 批量 | 勾选多条 | 批量删除→确认 | 选中行均消失 |
| ZCZX-MCGL-UI-023 | 端到端 | CRUD 串联 | UI 集成 | Playwright+Chrome | §4 | 可新增 | 新增→搜索→查看→编辑→删除 | 全流程无报错 |
| ZCZX-MCGL-UI-024 | 权限 | 只读账号 | UI 测试 | Playwright+Chrome | §6 | 无 add/edit/remove | 登录进模块 | 无新增/编辑/删除或操作拒绝 |
| ZCZX-MCGL-UI-025 | 导出 | 导出（可选） | UI 测试 | Playwright+Chrome | 技术方案 | 有 export 权限 | 点「导出」 | 下载 Excel 或成功提示 |

---

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

- 安装：`npm i -D @playwright/test`；`npx playwright install chromium`；本机 Chrome：`npx playwright install chrome`。  
- `playwright.config.ts` 示例：`use: { channel: 'chrome', headless: false, locale: 'zh-CN', baseURL: 'http://localhost:80' }`；`storageState` 复用登录态。  
- 路由：`page.goto('/dataModel/pasture')`（以菜单 `component` 配置为准）。  
- 区划：`page.locator('.el-cascader').click()` 后逐级选择省/市/县（按项目组件封装调整）。  
- 上传：`page.locator('input[type=file]').setInputFiles('fixtures/pasture.jpg')`。  
- 确认框：`page.getByRole('button', { name: /确定|确认/ })`。

---

## 覆盖对照

| 类别 | 单元 UT | 接口 API | 界面 UI |
| --- | --- | --- | --- |
| 正常流程 | UT-012～016、020 | API-001～012、019、021、023～027 | UI-001～010、016～019、023 |
| 异常流程 | UT-001～002、008 | API-013～018、020、029 | UI-011～014、021 |
| 业务约束 | UT-003～011、013 | API-003～005、015～018、022 | UI-003～004、009～010、012～013、015、018 |
| 逻辑删除/附件 | UT-017～019、020 | API-007、024～026 | UI-019～022 |
| 地图（不做） | — | — | UI-006 |
| 权限/导出 | — | API-028～029 | UI-024～025 |

---

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

| 需求章节 | 要点 | 主要对应用例 |
| --- | --- | --- |
| §5.1 新增 | 字段、证件联动、照片选填 | UT-001～013；API-008～018；UI-007～015 |
| §5.2 列表 | 关键字、性质/状态、逻辑删除不可见 | API-001～007；UI-001～006 |
| §5.3 修改 | 全字段、换图、性质变更 | UT-015～016、019；API-021～024；UI-017～019 |
| §5.4 删除 | 逻辑删除、确认 | UT-017～018；API-025～026；UI-020～022 |
| §5.5 详情 | 全字段 | API-019；UI-016 |
| §5.6 地图 | 本期不做 | UI-006 |
| §6～§7 | 权限、错误提示 | API-028～030；UI-024 |

---

## 修订记录

| 版本 | 说明 |
| --- | --- |
| 1.0 | 初版：单元 20、接口 30、UI 25；对齐功能/技术方案；Playwright+Chrome；编号前缀 ZCZX-MCGL |
