# 草场使用记录 — 测试用例

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

**通用前置（无特殊说明）**：具备本模块菜单与按钮权限的账号已登录；库中已有有效**草场**（`biz_grassland`，`del_flag=0`，如总面积 `100` 亩）与**养殖主体**（`biz_pasture`，`del_flag=0`）。**放牧方式**：`1` 轮牧、`2` 自由放牧、`3` 季节性放牧。

**合法 Body 示例**：`grasslandId`/`pastureId` 为有效主键；`usageAreaMu=50`；`useStartDate=2025-06-01`、`useEndDate=2025-06-03` → 服务端 `actualUseDays=3`；`grazingHeadCount=100`；`grazingMethod=1`。

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

---

## 一、单元测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-CCSYJL-UT-001 | 参数校验 | 使用面积 | 单元测试 | JUnit5 | >0 且 ≤草场总面积 | 草场 `area_mu=100` | `usageAreaMu` 为 50、0、101、null | 50 通过；0/101/null 失败 |
| ZCZX-CCSYJL-UT-002 | 参数校验 | 使用日期区间 | 单元测试 | JUnit5 | §2.5 | 无 | 开始晚于结束；缺一端；同日合法 | 颠倒/缺一端失败；`06-01`～`06-01` 通过 |
| ZCZX-CCSYJL-UT-003 | 天数计算 | 实际使用天数 | 单元测试 | JUnit5 | 含起止日 | 无 | `resolveActualUseDays(06-01,06-01)`→1；(06-01,06-03)→3 | 与技术方案 §3.4 一致 |
| ZCZX-CCSYJL-UT-004 | 参数校验 | 放牧数量 | 单元测试 | JUnit5 | ≥1 整数 | 无 | 0、负数、1、100 | 0/负失败；正整数通过 |
| ZCZX-CCSYJL-UT-005 | 参数校验 | 放牧方式枚举 | 单元测试 | JUnit5 | 1～3 | 无 | 值为 1/3 通过；0、4、null 失败 | 与技术方案 §2.2 一致 |
| ZCZX-CCSYJL-UT-006 | 参数校验 | 主数据 id | 单元测试 | JUnit5 | 非空 | 无 | `grasslandId`/`pastureId` 为 null | 失败 |
| ZCZX-CCSYJL-UT-007 | 列表查询 | 创建日期区间 | 单元测试 | JUnit5 | 预约日期筛选 | 无 | `validateDateRangeForList`：`12-01`>`06-01`；单端；合法区间 | 颠倒失败；合法通过 |
| ZCZX-CCSYJL-UT-008 | 参数校验 | 全量保存（Mock 主数据） | 单元测试 | JUnit5 | `validateRowForSave` | Mock 草场/主体有效 | 合法 `BizGrasslandUsageRecord` | 通过；`actualUseDays` 已写入 |
| ZCZX-CCSYJL-UT-009 | 参数校验 | 主数据已删除 | 单元测试 | JUnit5 | §5.1 | Mock 草场 `del_flag=2` | `validateRowForSave` | 失败；提示主数据失效类 |
| ZCZX-CCSYJL-UT-010 | Service | 新增落库 | 单元测试 | JUnit5+Mockito | 正常登记 | Mock 主数据+Mapper | `insert(record)` | `del_flag=0`；`actual_use_days` 为计算值 |
| ZCZX-CCSYJL-UT-011 | Service | 忽略客户端天数 | 单元测试 | JUnit5+Mockito | §3.3.1 | 入参 `actualUseDays=99` | `insert` 日期 06-01～06-03 | 落库 `actual_use_days=3` 非 99 |
| ZCZX-CCSYJL-UT-012 | Service | 修改全字段 | 单元测试 | JUnit5+Mockito | §5.3 | 已存在 id | `update` 换草场/主体/面积/日期/放牧信息 | 成功；重算天数 |
| ZCZX-CCSYJL-UT-013 | Service | 修改不存在 | 单元测试 | JUnit5+Mockito | 异常 | `selectById` null | `update` | 抛 `ServiceException` |
| ZCZX-CCSYJL-UT-014 | Service | 逻辑删除 | 单元测试 | JUnit5+Mockito | §5.4 | Mock Mapper | `remove([id], updateBy)` | `logicDelete`；`del_flag=2` |
| ZCZX-CCSYJL-UT-015 | Service | 列表日期非法 | 单元测试 | JUnit5+Mockito | §3.1.1 | 无 | `selectList` 且 `startDate>endDate` | 抛异常；不调 Mapper |
| ZCZX-CCSYJL-UT-016 | Mapper | JOIN 与删除过滤 | 单元测试 | JUnit5 | 技术方案 §3.5 | 无 | 检查 `BizGrasslandUsageRecordMapper.xml` | 含 `biz_grassland`/`biz_pasture` JOIN；`del_flag='0'`；`create_time desc` |

---

## 二、接口测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-CCSYJL-API-001 | 列表 | 默认分页排序 | 接口测试 | Postman/curl | §5.2 | 已登录；有多条 | `GET /dataModel/grasslandUsage/list` | `rows`≤20；`createTime` 新在前；含 `grasslandName` |
| ZCZX-CCSYJL-API-002 | 列表 | 关键字-草场名称 | 接口测试 | Postman | 名称模糊 | 已登录 | `keyword=` 草场名称片段 | 命中关联草场名含片段的记录 |
| ZCZX-CCSYJL-API-003 | 列表 | 预约日期-创建日区间 | 接口测试 | Postman | 创建日期 | 有已知 `create_time` 记录 | `startDate`+`endDate` 闭区间 | 均在区间内 |
| ZCZX-CCSYJL-API-004 | 列表 | 组合查询 | 接口测试 | Postman | 多条件 | 已登录 | `keyword`+`startDate`+`endDate` | 同时满足 |
| ZCZX-CCSYJL-API-005 | 列表 | 创建日期区间非法 | 接口测试 | Postman | 校验 | 已登录 | `startDate=2025-12-01&endDate=2025-01-01` | 失败；`msg` 可区分 |
| ZCZX-CCSYJL-API-006 | 列表 | 不含已删除 | 接口测试 | Postman | 逻辑删除 | 已知 id 已删 | `GET list` | 列表无该 id |
| ZCZX-CCSYJL-API-007 | 新增 | 合法全字段 | 接口测试 | Postman | §5.1 | 有效草场/主体 id | `POST` Body 合法 | 成功；详情 `actualUseDays` 正确 |
| ZCZX-CCSYJL-API-008 | 新增 | 同日使用 | 接口测试 | Postman | §2.5 | 已登录 | `useStartDate=useEndDate=2025-06-01` | 成功；`actualUseDays=1` |
| ZCZX-CCSYJL-API-009 | 新增 | 三种放牧方式 | 接口测试 | Postman | §2.2 | 已登录 | 分别 `grazingMethod` 1/2/3 各 POST 一条 | 均成功 |
| ZCZX-CCSYJL-API-010 | 新增 | 忽略客户端天数 | 接口测试 | Postman | §3.3.1 | 已登录 | Body 传 `actualUseDays=999` 且日期 3 天跨度 | 成功；详情天数为 3 非 999 |
| ZCZX-CCSYJL-API-011 | 新增 | 使用面积超限 | 接口测试 | Postman | ≤草场总面积 | 草场 100 亩 | `usageAreaMu=101` | 失败 |
| ZCZX-CCSYJL-API-012 | 新增 | 使用日期颠倒 | 接口测试 | Postman | 日期 | 已登录 | `useStartDate`>`useEndDate` | 失败 |
| ZCZX-CCSYJL-API-013 | 新增 | 主数据无效 | 接口测试 | Postman | 关联 | 草场或主体 id 不存在/已删 | `POST` | 失败 |
| ZCZX-CCSYJL-API-014 | 新增 | 放牧数量非法 | 接口测试 | Postman | ≥1 | 已登录 | `grazingHeadCount=0` | 失败 |
| ZCZX-CCSYJL-API-015 | 新增 | 放牧方式非法 | 接口测试 | Postman | 1～3 | 已登录 | `grazingMethod=9` | 失败 |
| ZCZX-CCSYJL-API-016 | 新增 | 缺必填关联 id | 接口测试 | Postman | 必填 | 已登录 | 缺 `grasslandId` 或 `pastureId` | 失败 |
| ZCZX-CCSYJL-API-017 | 详情 | 有效 id | 接口测试 | Postman | §5.5 | 已登录 | `GET /dataModel/grasslandUsage/{id}` | 含名称、面积、主体、日期、天数、放牧信息、审计字段 |
| ZCZX-CCSYJL-API-018 | 详情 | 无效/已删 id | 接口测试 | Postman | 异常 | 已登录 | 不存在或已删 id | `data` 空或业务失败 |
| ZCZX-CCSYJL-API-019 | 修改 | 合法修改 | 接口测试 | Postman | §5.3 | 有记录 | `PUT` 改面积、日期、放牧数量 | 成功；天数随日期更新 |
| ZCZX-CCSYJL-API-020 | 修改 | 更换草场重校面积 | 接口测试 | Postman | §5.3 | 原草场 100 亩 | `PUT` 换 50 亩草场且 `usageAreaMu=60` | 失败 |
| ZCZX-CCSYJL-API-021 | 修改 | 校验失败 | 接口测试 | Postman | 全量校验 | 有记录 | `PUT` `grazingHeadCount=0` | 失败；库不变 |
| ZCZX-CCSYJL-API-022 | 删除 | 单条逻辑删除 | 接口测试 | Postman | §5.4 | 已登录 | `DELETE /dataModel/grasslandUsage/{id}` | 成功；列表不可见 |
| ZCZX-CCSYJL-API-023 | 删除 | 批量删除 | 接口测试 | Postman | 批量 | 已登录 | `DELETE id1,id2` | 均不可查 |
| ZCZX-CCSYJL-API-024 | 端到端 | CRUD 串联 | 接口测试 | Postman | §4 | 主数据齐备 | `POST`→`list`→`GET/{id}`→`PUT`→`DELETE` | 每步成功 |
| ZCZX-CCSYJL-API-025 | 主数据 | 草场下拉复用 | 接口测试 | Postman | §3 主数据 | 已登录 | `GET /dataModel/grassland/list?keyword=` | 返回有效草场供选择 |
| ZCZX-CCSYJL-API-026 | 主数据 | 主体下拉复用 | 接口测试 | Postman | §3 主数据 | 已登录 | `GET /dataModel/pasture/list?keyword=` | 返回有效主体供选择 |
| ZCZX-CCSYJL-API-027 | 鉴权 | 未登录 | 接口测试 | curl | 安全 | 无 Token | `GET .../grasslandUsage/list` | 401 或统一未登录 |
| ZCZX-CCSYJL-API-028 | 权限 | 无写权限 | 接口测试 | Postman | 越权 | 仅 list 权限 | `POST .../grasslandUsage` | 无权限失败 |
| ZCZX-CCSYJL-API-029 | 响应 | 失败可读 | 接口测试 | Postman | §7 | 已登录 | 触发面积超限、日期颠倒、主数据无效 | `code`、`msg` 可区分 |

---

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

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

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-CCSYJL-UI-001 | 列表 | 默认分页排序 | UI 测试 | Playwright+Chrome | §5.2 | 已登录；数据>20 | 进入「草场使用记录」菜单 | 默认每页 20；创建时间新在前 |
| ZCZX-CCSYJL-UI-002 | 列表 | 关键字-草场名称 | UI 测试 | Playwright+Chrome | 名称模糊 | 有样本 | 输入草场名称→搜索 | 表格含匹配行 |
| ZCZX-CCSYJL-UI-003 | 列表 | 预约日期筛选 | UI 测试 | Playwright+Chrome | 创建日期 | 有样本 | 选预约日期起止→搜索 | 结果在区间内 |
| ZCZX-CCSYJL-UI-004 | 列表 | 组合与重置 | UI 测试 | Playwright+Chrome | 恢复条件 | 已筛选 | 搜索→「重置」 | 条件清空；默认列表 |
| ZCZX-CCSYJL-UI-005 | 列表 | 展示列完整 | UI 测试 | Playwright+Chrome | §5.2 | 有数据 | 查看表头与首行 | 含草场名、面积、主体、起止日、天数、数量、方式、操作 |
| ZCZX-CCSYJL-UI-006 | 新增 | 合法登记 | UI 测试 | Playwright+Chrome | §5.1 | 主数据存在 | 新增→下拉选草场/主体→填面积与日期等→确定 | 成功；列表新行 |
| ZCZX-CCSYJL-UI-007 | 新增 | 下拉模糊搜索 | UI 测试 | Playwright+Chrome | §2.1 | 已登录 | 草场/主体下拉输入关键字 | 选项列表过滤正确 |
| ZCZX-CCSYJL-UI-008 | 新增 | 使用天数自动计算 | UI 测试 | Playwright+Chrome | §2.5 | 新增弹窗 | 改开始/结束日期 | 「实际使用天数」只读且随日期更新（如 3 天） |
| ZCZX-CCSYJL-UI-009 | 新增 | 使用面积上限提示 | UI 测试 | Playwright+Chrome | ≤总面积 | 选 100 亩草场 | 使用面积填 101→确定 | 校验失败并提示不超过总面积 |
| ZCZX-CCSYJL-UI-010 | 新增 | 日期颠倒 | UI 测试 | Playwright+Chrome | 日期约束 | 已登录 | 结束早于开始→确定 | 校验失败 |
| ZCZX-CCSYJL-UI-011 | 新增 | 未选草场或主体 | UI 测试 | Playwright+Chrome | 必选 | 已登录 | 不选下拉直接确定 | 校验失败 |
| ZCZX-CCSYJL-UI-012 | 新增 | 放牧数量/方式非法 | UI 测试 | Playwright+Chrome | 必填枚举 | 已登录 | 数量 0 或未选放牧方式→确定 | 校验失败 |
| ZCZX-CCSYJL-UI-013 | 详情 | 字段完整 | UI 测试 | Playwright+Chrome | §5.5 | 任意记录 | 点「查看」 | 各业务字段与列表一致 |
| ZCZX-CCSYJL-UI-014 | 修改 | 编辑成功 | UI 测试 | Playwright+Chrome | §5.3 | 有记录 | 编辑→改使用面积与放牧数量→保存 | 列表/详情已更新 |
| ZCZX-CCSYJL-UI-015 | 修改 | 换草场重算面积校验 | UI 测试 | Playwright+Chrome | §5.3 | 有记录 | 换更小面积草场且使用面积仍过大→保存 | 校验失败 |
| ZCZX-CCSYJL-UI-016 | 修改 | 改期重算天数 | UI 测试 | Playwright+Chrome | 天数联动 | 有记录 | 编辑延长结束日期→保存 | 详情 `actualUseDays` 增大 |
| ZCZX-CCSYJL-UI-017 | 删除 | 确认删除 | UI 测试 | Playwright+Chrome | §5.4 | 有记录 | 删除→确认 | 列表无该行 |
| ZCZX-CCSYJL-UI-018 | 删除 | 取消删除 | UI 测试 | Playwright+Chrome | 确认框 | 有记录 | 删除→取消 | 记录仍在 |
| ZCZX-CCSYJL-UI-019 | 删除 | 批量删除 | UI 测试 | Playwright+Chrome | 批量 | 勾选多条 | 批量删除→确认 | 选中行消失 |
| ZCZX-CCSYJL-UI-020 | 端到端 | CRUD 串联 | UI 集成 | Playwright+Chrome | §4 | 主数据齐备 | 新增→搜索→查看→编辑→删除 | 全流程无报错 |
| ZCZX-CCSYJL-UI-021 | 权限 | 只读账号 | UI 测试 | Playwright+Chrome | §6 | 无 add/edit/remove | 进入模块 | 无新增/编辑/删除或拒绝 |
| ZCZX-CCSYJL-UI-022 | 导出 | 导出（可选） | 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/grasslandUsage')`（以菜单 `component` 为准）。  
- 下拉：`page.locator('.el-select').filter({ hasText: '草场名称' }).click()` 后 `page.getByText('示范草场')`；支持 `fill` 关键字过滤。  
- 日期：预约日期、使用起止用日期组件或 `fill('YYYY-MM-DD')`。  
- 只读天数：断言 `实际使用天数` 输入框 `disabled` 或文案随日期变化。

---

## 覆盖对照

| 类别 | 单元 UT | 接口 API | 界面 UI |
| --- | --- | --- | --- |
| 正常流程 | UT-003、008、010～012、016 | API-001～004、007～010、017、019、024～026 | UI-001～008、013～016、020 |
| 异常流程 | UT-001～002、006～007、009、013、015 | API-005、011～016、018、021、027～029 | UI-009～012、018 |
| 业务约束 | UT-001、004～006、011 | API-010～015、020 | UI-008～012、015～016 |
| 主数据关联 | UT-006、009 | API-013、025～026 | UI-007、011 |
| 天数计算 | UT-003、011 | API-008、010 | UI-008、016 |
| 逻辑删除 | UT-014、016 | API-006、022～023 | UI-017～019 |
| 权限/导出 | — | API-027～028 | UI-021～022 |

---

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

| 需求章节 | 要点 | 主要对应用例 |
| --- | --- | --- |
| §5.1 新增 | 主数据、面积上限、日期、放牧 | UT-001～011；API-007～016；UI-006～012 |
| §2.5 天数 | 自动计算、忽略客户端 | UT-003、011；API-008、010；UI-008、016 |
| §5.2 列表 | 草场名关键字、创建日区间 | API-001～006；UI-001～005 |
| §5.3 修改 | 全字段、换草场校验 | UT-012；API-019～021；UI-014～016 |
| §5.4 删除 | 逻辑删除 | UT-014；API-022～023；UI-017～019 |
| §5.5 详情 | 全字段 | API-017；UI-013 |
| §6～§7 | 权限、错误提示 | API-027～029；UI-021 |

---

## 修订记录

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