# 草场管理 — 测试用例

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

**通用前置（无特殊说明）**：具备本模块菜单与按钮权限的账号已登录。**退化等级**：`1` 未退化、`2` 轻度、`3` 中度、`4` 重度、`5` 极重度。**利用类型**：`1` 禁牧、`2` 轮牧、`3` 全年放牧。**合法样本（示例）**：名称「示范草场」、面积 `100.5`、亩产草量 `350`、利用率 `0.65`、禁牧 `2025-01-01`～`2025-03-31`、轮牧小区 `4`、放牧天数 `7`、轮牧周期 `28`、备注可空。

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

---

## 一、单元测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-CCGL-UT-001 | 参数校验 | 草场名称长度 | 单元测试 | JUnit5 | 1～10 字 | 无 | 空串、1 字、10 字、11 字 | 空/11 失败；1～10 通过 |
| ZCZX-CCGL-UT-002 | 参数校验 | 备注字数 | 单元测试 | JUnit5 | 选填≤100 | 无 | null/空通过；101 字失败 | 符合功能需求 §5.1 |
| ZCZX-CCGL-UT-003 | 参数校验 | 退化等级枚举 | 单元测试 | JUnit5 | 仅 1～5 | 无 | 值为 1/5 通过；0、6、null 失败 | 与技术方案 §2.2 一致 |
| ZCZX-CCGL-UT-004 | 参数校验 | 利用类型枚举 | 单元测试 | JUnit5 | 仅 1～3 | 无 | 值为 1/3 通过；0、4、null 失败 | 与技术方案 §2.2 一致 |
| ZCZX-CCGL-UT-005 | 参数校验 | 面积/亩产草量 | 单元测试 | JUnit5 | 正数 | 无 | 面积 0、负数；亩产草量 0 | 均失败；合法正数通过 |
| ZCZX-CCGL-UT-006 | 参数校验 | 利用率区间 | 单元测试 | JUnit5 | 0～1 闭区间 | 无 | `-0.1`、`1.1`、`0`、`1` | 越界失败；0 与 1 通过 |
| ZCZX-CCGL-UT-007 | 参数校验 | 禁牧日期区间 | 单元测试 | JUnit5 | 起止成对 | 无 | 开始晚于结束；仅一端；合法区间 | 颠倒/缺一端失败；`start≤end` 通过 |
| ZCZX-CCGL-UT-008 | 参数校验 | 轮牧三项整数 | 单元测试 | JUnit5 | ≥1 整数 | 无 | 小区数/放牧天数/周期为 0、小数、负数 | 失败；正整数通过 |
| ZCZX-CCGL-UT-009 | 参数校验 | 全量保存校验 | 单元测试 | JUnit5 | `validateRowForSave` | 合法 `BizGrassland` | 调用校验后写库字段 | 各字段 trim/枚举/数值符合 §3.5 |
| ZCZX-CCGL-UT-010 | Service | 新增落库 | 单元测试 | JUnit5+Mockito | 正常登记 | 合法实体 | `insert(grassland)` | `del_flag='0'`；数值与入参一致 |
| ZCZX-CCGL-UT-011 | Service | 修改全字段 | 单元测试 | JUnit5+Mockito | §5.3 | Mock 已存在 id | `update` 改名称、面积、退化等级、日期、轮牧参数 | 更新成功；Mapper `update` 被调用 |
| ZCZX-CCGL-UT-012 | Service | 利用类型互改 | 单元测试 | JUnit5+Mockito | 1↔2↔3 | 原 `utilization_type=1` | `update` 改为 `2` 或 `3` 且指标仍合法 | 成功（本期不因类型豁免字段） |
| ZCZX-CCGL-UT-013 | Service | 修改不存在 | 单元测试 | JUnit5+Mockito | 异常 | `selectById` 返回 null | `update` | 抛 `ServiceException`；不调用 `update` |
| ZCZX-CCGL-UT-014 | Service | 逻辑删除 | 单元测试 | JUnit5+Mockito | §5.4 | Mock Mapper | `remove([id], updateBy)` | 调用 `logicDelete`；`del_flag='2'`；非物理 DELETE |
| ZCZX-CCGL-UT-015 | Service | 删除空 id 数组 | 单元测试 | JUnit5+Mockito | 边界 | 无 | `remove([])` 或全 null | 返回 0；不调用 Mapper 删除 |
| ZCZX-CCGL-UT-016 | Mapper | 列表排序与删除过滤 | 单元测试 | JUnit5 | 技术方案 §3.4 | 无 | 检查 `BizGrasslandMapper.xml` | 含 `create_time desc`、`id desc`；列表/详情/更新带 `del_flag='0'` |

---

## 二、接口测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-CCGL-API-001 | 列表 | 默认分页排序 | 接口测试 | Postman/curl | §5.2 | 已登录；有多条记录 | `GET /dataModel/grassland/list` | `code=200`；`rows`≤20；`createTime` 新在前 |
| ZCZX-CCGL-API-002 | 列表 | 关键字-名称 | 接口测试 | Postman | 名称模糊 | 已登录 | `keyword=` 唯一名称片段 | 命中含该片段记录 |
| ZCZX-CCGL-API-003 | 列表 | 利用类型筛选 | 接口测试 | Postman | 精确 | 有禁牧/轮牧样本 | `utilizationType=1` 或 `2` | 返回记录利用类型与条件一致 |
| ZCZX-CCGL-API-004 | 列表 | 退化等级筛选 | 接口测试 | Postman | 可选筛选项 | 有多档退化样本 | `degradationLevel=3` | 均为中度（与入参一致） |
| ZCZX-CCGL-API-005 | 列表 | 组合查询 | 接口测试 | Postman | 多条件 | 已登录 | `keyword`+`utilizationType`（+`degradationLevel`） | 同时满足 |
| ZCZX-CCGL-API-006 | 列表 | 不含已删除 | 接口测试 | Postman | 逻辑删除 | 已知 id 已删 | `GET list` | 列表无该 id |
| ZCZX-CCGL-API-007 | 列表 | 分页参数 | 接口测试 | Postman | 分页 | 已登录 | `pageNum=2&pageSize=10` | 返回第 2 页；条数≤10 |
| ZCZX-CCGL-API-008 | 新增 | 合法全字段 | 接口测试 | Postman | §5.1 | 已登录 | `POST` Body 含备注等全部合法字段 | `code` 成功；`GET` 详情字段一致 |
| ZCZX-CCGL-API-009 | 新增 | 最小必填无备注 | 接口测试 | Postman | 备注选填 | 已登录 | `POST` 不传 `remark` | 成功；详情备注为空 |
| ZCZX-CCGL-API-010 | 新增 | 利用类型-禁牧 | 接口测试 | Postman | §2.2 | 已登录 | `utilizationType=1`+合法指标 | 成功 |
| ZCZX-CCGL-API-011 | 新增 | 利用类型-轮牧 | 接口测试 | Postman | §2.2 | 已登录 | `utilizationType=2`+合法轮牧参数 | 成功 |
| ZCZX-CCGL-API-012 | 新增 | 利用类型-全年放牧 | 接口测试 | Postman | §2.2 | 已登录 | `utilizationType=3` | 成功 |
| ZCZX-CCGL-API-013 | 新增 | 名称非法 | 接口测试 | Postman | 1～10 | 已登录 | 名称空或 11 字 | 失败；列表无新记录 |
| ZCZX-CCGL-API-014 | 新增 | 枚举非法 | 接口测试 | Postman | 枚举 | 已登录 | `degradationLevel=0` 或 `utilizationType=9` | 失败；`msg` 可区分 |
| ZCZX-CCGL-API-015 | 新增 | 面积/亩产草量非法 | 接口测试 | Postman | 正数 | 已登录 | `areaMu=0` 或 `grassYieldPerMu=-1` | 失败 |
| ZCZX-CCGL-API-016 | 新增 | 利用率越界 | 接口测试 | Postman | 0～1 | 已登录 | `utilizationRate=1.5` 或 `-0.01` | 失败 |
| ZCZX-CCGL-API-017 | 新增 | 禁牧日期颠倒 | 接口测试 | Postman | 日期约束 | 已登录 | `grazingBanStartDate`>`grazingBanEndDate` | 失败 |
| ZCZX-CCGL-API-018 | 新增 | 轮牧参数非法 | 接口测试 | Postman | 正整数 | 已登录 | `rotationPlotCount=0` | 失败 |
| ZCZX-CCGL-API-019 | 新增 | 备注超长 | 接口测试 | Postman | ≤100 | 已登录 | `remark` 101 字 | 失败 |
| ZCZX-CCGL-API-020 | 详情 | 有效 id | 接口测试 | Postman | §5.5 | 已登录 | `GET /dataModel/grassland/{id}` | 含名称、面积、退化/利用类型、指标、禁牧日期、轮牧参数、审计字段 |
| ZCZX-CCGL-API-021 | 详情 | 无效/已删 id | 接口测试 | Postman | 异常 | 已登录 | 不存在或已逻辑删除的 id | `data` 为空或业务失败（与实现一致） |
| ZCZX-CCGL-API-022 | 修改 | 合法修改 | 接口测试 | Postman | §5.3 | 有记录 | `PUT` 改名称、面积、负责人相关指标 | 成功；详情已更新 |
| ZCZX-CCGL-API-023 | 修改 | 利用类型变更 | 接口测试 | Postman | §5.3 | 禁牧记录 | `PUT` `utilizationType` 改为 `2` 且指标合法 | 成功 |
| ZCZX-CCGL-API-024 | 修改 | 禁牧日期变更 | 接口测试 | Postman | 日期 | 有记录 | `PUT` 调整起止日期且 `start≤end` | 成功 |
| ZCZX-CCGL-API-025 | 修改 | 校验失败 | 接口测试 | Postman | 全量校验 | 有记录 | `PUT` 利用率 `2` | 失败；库内数据不变 |
| ZCZX-CCGL-API-026 | 删除 | 单条逻辑删除 | 接口测试 | Postman | §5.4 | 已登录 | `DELETE /dataModel/grassland/{id}` | 成功；列表/详情不可见 |
| ZCZX-CCGL-API-027 | 删除 | 批量删除 | 接口测试 | Postman | 批量 | 已登录 | `DELETE id1,id2` | 成功；两条均不可查 |
| ZCZX-CCGL-API-028 | 端到端 | CRUD 串联 | 接口测试 | Postman | §4 流程 | 已登录 | `POST`→`GET list`→`GET/{id}`→`PUT`→`DELETE` | 每步 `code` 成功 |
| ZCZX-CCGL-API-029 | 鉴权 | 未登录 | 接口测试 | curl | 安全 | 无 Token | `GET .../grassland/list` | 401 或统一未登录响应 |
| ZCZX-CCGL-API-030 | 权限 | 无写权限 | 接口测试 | Postman | 越权 | 仅 `list` 权限账号 | `POST /dataModel/grassland` | 无权限失败（403 或业务码） |
| ZCZX-CCGL-API-031 | 响应 | 失败可读 | 接口测试 | Postman | §7 | 已登录 | 分别触发名称空、日期颠倒、利用率越界 | Body 含 `code`、`msg` 且可区分 |

---

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

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

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-CCGL-UI-001 | 列表 | 默认分页排序 | UI 测试 | Playwright+Chrome | §5.2 | 已登录；数据>20 | 进入「草场管理」菜单 | 默认每页 20；创建时间新在前 |
| ZCZX-CCGL-UI-002 | 列表 | 关键字查询 | UI 测试 | Playwright+Chrome | 名称模糊 | 有含关键词记录 | 输入草场名称→搜索 | 表格含该行 |
| ZCZX-CCGL-UI-003 | 列表 | 利用类型筛选 | UI 测试 | Playwright+Chrome | 精确 | 多类型均有 | 选「轮牧」→搜索 | 利用类型列均为轮牧 |
| ZCZX-CCGL-UI-004 | 列表 | 退化等级筛选 | UI 测试 | Playwright+Chrome | 可选 | 界面有该筛选项 | 选「重度」→搜索 | 退化等级列均为重度 |
| ZCZX-CCGL-UI-005 | 列表 | 组合与重置 | UI 测试 | Playwright+Chrome | 恢复条件 | 已多条件筛选 | 搜索→点「重置」 | 条件清空；恢复默认列表 |
| ZCZX-CCGL-UI-006 | 列表 | 操作列与地图 | UI 测试 | Playwright+Chrome | §5.6 不做 | 有数据行 | 查看操作列 | 有查看/编辑/删除；**无**地图标点或置灰「暂未开放」 |
| ZCZX-CCGL-UI-007 | 新增 | 合法全字段 | UI 测试 | Playwright+Chrome | §5.1 | 已登录 | 新增→填全部必填+备注→确定 | 成功提示；列表出现新记录 |
| ZCZX-CCGL-UI-008 | 新增 | 最小必填无备注 | UI 测试 | Playwright+Chrome | 备注选填 | 已登录 | 仅必填项→确定 | 成功 |
| ZCZX-CCGL-UI-009 | 新增 | 三种利用类型 | UI 测试 | Playwright+Chrome | §2.2 | 已登录 | 分别新增禁牧/轮牧/全年放牧各一条 | 均成功；列表类型正确 |
| ZCZX-CCGL-UI-010 | 新增 | 名称空或超长 | UI 测试 | Playwright+Chrome | 1～10 | 已登录 | 名称留空或超 10 字→确定 | 字段校验失败，不提交 |
| ZCZX-CCGL-UI-011 | 新增 | 数值非法 | UI 测试 | Playwright+Chrome | 正数/区间 | 已登录 | 面积填 0 或利用率填 1.2→确定 | 校验失败并提示 |
| ZCZX-CCGL-UI-012 | 新增 | 禁牧日期非法 | UI 测试 | Playwright+Chrome | 日期约束 | 已登录 | 结束日期早于开始日期→确定 | 校验失败 |
| ZCZX-CCGL-UI-013 | 新增 | 枚举未选 | UI 测试 | Playwright+Chrome | 必选 | 已登录 | 退化等级或利用类型不选→确定 | 校验失败 |
| ZCZX-CCGL-UI-014 | 新增 | 轮牧参数非法 | UI 测试 | Playwright+Chrome | 正整数 | 已登录 | 轮牧小区数量填 0→确定 | 校验失败 |
| ZCZX-CCGL-UI-015 | 详情 | 字段完整 | UI 测试 | Playwright+Chrome | §5.5 | 任意记录 | 点「查看」 | 名称、面积、退化/利用类型、产草指标、禁牧日期、轮牧参数、备注齐全 |
| ZCZX-CCGL-UI-016 | 修改 | 编辑成功 | UI 测试 | Playwright+Chrome | §5.3 | 有记录 | 编辑→改草场名称与面积→确定 | 列表/详情已更新 |
| ZCZX-CCGL-UI-017 | 修改 | 利用类型与退化变更 | UI 测试 | Playwright+Chrome | 互改 | 有记录 | 改利用类型为「全年放牧」、退化等级为「轻度」→保存 | 列表展示已更新 |
| ZCZX-CCGL-UI-018 | 修改 | 禁牧日期变更 | UI 测试 | Playwright+Chrome | 日期 | 有记录 | 修改禁牧起止日期→保存 | 详情日期为新值 |
| ZCZX-CCGL-UI-019 | 删除 | 确认删除 | UI 测试 | Playwright+Chrome | §5.4 | 有记录 | 删除→确认 | 列表无该行 |
| ZCZX-CCGL-UI-020 | 删除 | 取消删除 | UI 测试 | Playwright+Chrome | 确认框 | 有记录 | 删除→取消 | 记录仍在 |
| ZCZX-CCGL-UI-021 | 删除 | 批量删除 | UI 测试 | Playwright+Chrome | 批量 | 勾选多条 | 批量删除→确认 | 选中行均消失 |
| ZCZX-CCGL-UI-022 | 端到端 | CRUD 串联 | UI 集成 | Playwright+Chrome | §4 | 可新增 | 新增→搜索→查看→编辑→删除 | 全流程无报错 |
| ZCZX-CCGL-UI-023 | 权限 | 只读账号 | UI 测试 | Playwright+Chrome | §6 | 无 add/edit/remove | 登录进模块 | 无新增/编辑/删除或点击拒绝 |
| ZCZX-CCGL-UI-024 | 导出 | 导出（可选） | UI 测试 | Playwright+Chrome | 技术方案 §4 | 有 `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/grassland')`（以菜单 `component` 配置为准）。  
- 日期：禁牧起止使用日期范围组件，`page.getByPlaceholder(/开始|结束/)` 或项目封装的选择器填写 `YYYY-MM-DD`。  
- 下拉：`page.locator('.el-select').filter({ hasText: '退化等级' })` 等选择枚举项。  
- 确认框：`page.getByRole('button', { name: /确定|确认/ })`。

---

## 覆盖对照

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

---

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

| 需求章节 | 要点 | 主要对应用例 |
| --- | --- | --- |
| §5.1 新增 | 字段、数值、日期、轮牧参数、备注 | UT-001～009；API-008～019；UI-007～014 |
| §5.2 列表 | 关键字、利用类型、逻辑删除不可见 | API-001～007；UI-001～006 |
| §5.3 修改 | 全字段、类型/日期变更 | UT-011～012；API-022～025；UI-016～018 |
| §5.4 删除 | 逻辑删除、确认 | UT-014～015；API-026～027；UI-019～021 |
| §5.5 详情 | 全字段 | API-020；UI-015 |
| §5.6 地图 | 本期不做 | UI-006 |
| §6～§7 | 权限、错误提示 | API-029～031；UI-023 |

---

## 修订记录

| 版本 | 说明 |
| --- | --- |
| 1.0 | 初版：单元 16、接口 31、UI 24；对齐功能/技术方案；Playwright+Chrome；编号前缀 **ZCZX-CCGL** |
