# 草畜平衡计算 — 测试用例 > 依据:`草畜平衡计算功能需求.md`、`草蓄平衡计算技术方案.md` > **接口 Base Path(示例)**:`/dataModel/grassLivestockBalance`;草场主数据 `/dataModel/grassland`。鉴权与若依一致(Cookie / Token)。 **通用前置(无特殊说明)**:已登录且具备 `dataModel:grassLivestockBalance:query`;草场下拉另需 `dataModel:grassland:list`、`dataModel:grassland:query`。库中存在有效草场(`biz_grassland`,`del_flag=0`),示例:**示范草场** `id=1`,面积 `100` 亩、亩产草量 `350` kg/亩、利用率 `0.65`。 **标准测算样本(用于核对公式)**:`areaMu=100`,`grassYieldPerMu=350`,`utilizationRate=0.65` → 可利用饲草量 `22750` kg;`sheepUnitAnnualForageKg=160` → 理论载畜量 `142.19` SU(保留 2 位);`breedingHeadCount=100`,`sheepUnitConvertCoeff=4` → 实际载畜量 `400` SU;平衡指数约 `2.81`;超载率约 `181.41%`;等级 **严重超载(4)**。 **界面(UI)测试**:**Playwright** + **Chromium**(`channel: 'chrome'` 使用本机 **Google Chrome**)。 --- ## 一、单元测试用例 | 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 | | --- | --- | --- | --- | --- | --- | --- | --- | --- | | ZCZX-CXPH-UT-001 | 公式计算 | 可利用饲草量 | 单元测试 | JUnit5 | 公式 1 | 无 | `calc(100,350,0.65)` | `22750.00` kg | | ZCZX-CXPH-UT-002 | 公式计算 | 理论/实际载畜量 | 单元测试 | JUnit5 | 公式 2、3 | 样本入参 | 理论、实际 SU | `142.19`、`400.00` SU(2 位小数) | | ZCZX-CXPH-UT-003 | 公式计算 | 指数与超载率 | 单元测试 | JUnit5 | 公式 4、5 | 样本入参 | 指数、超载率 | 指数约 `2.81`;超载率约 `181.41%` | | ZCZX-CXPH-UT-004 | 公式计算 | 需草量/缺口/适宜头数 | 单元测试 | JUnit5 | 公式 7~10 | 样本入参 | 全年需草、缺口、适宜放牧 | 需草 `64000`;缺口 `41250`;适宜头约 `35.55` | | ZCZX-CXPH-UT-005 | 公式计算 | 实际超载数量 | 单元测试 | JUnit5 | 公式 11 | 养殖 100、适宜约 35.55 | `actualOverloadHeads` | `64`(100−适宜,未超载为 0) | | ZCZX-CXPH-UT-006 | 等级判定 | 四档边界 | 单元测试 | JUnit5 | §2.5、§3.2 | 无 | R=0、0.10、0.15、0.20、0.50、0.51 | 未超载/基本平衡/超载/严重超载与边界一致 | | ZCZX-CXPH-UT-007 | 等级判定 | 指数=1 | 单元测试 | JUnit5 | 未超载 | 构造实际=理论 | `resolveLevel` | R=0%;等级 **未超载** | | ZCZX-CXPH-UT-008 | 参数校验 | 面积与利用率 | 单元测试 | JUnit5 | §5.1 | 无 | `areaMu` 0/-1;`utilizationRate` -0.1/1.1 | 均失败 | | ZCZX-CXPH-UT-009 | 参数校验 | 羊单位参数 | 单元测试 | JUnit5 | >0 | 无 | 年需草量、折算系数为 0 或负 | 失败 | | ZCZX-CXPH-UT-010 | 参数校验 | 养殖数量 | 单元测试 | JUnit5 | ≥0 整数 | 无 | -1、1.5、0 | -1/小数失败;0 通过 | | ZCZX-CXPH-UT-011 | 参数校验 | 草场 id | 单元测试 | JUnit5 | 有效草场 | Mock 草场 null/已删 | `validateForCalculate` | 失败 | | ZCZX-CXPH-UT-012 | 边界 | 存栏为 0 | 单元测试 | JUnit5 | §5.5 | 样本产草参数;头数 0 | 计算 | 实际载畜量 0;超载率 -100%;等级未超载;超载头数 0 | | ZCZX-CXPH-UT-013 | 边界 | 理论载畜量为 0 | 单元测试 | JUnit5 | §3.4 | 亩产草量 0;头数>0 | 计算 | `warning` 含无饲草供给;等级严重超载或指数 null | | ZCZX-CXPH-UT-014 | 边界 | 理论为 0 且存栏 0 | 单元测试 | JUnit5 | §3.4 | 亩产草量 0;头数 0 | 计算 | 指数 0;等级未超载 | | ZCZX-CXPH-UT-015 | 展示舍入 | 2 位小数 | 单元测试 | JUnit5 | §5.4 | 产生多位小数结果 | `scale2` | 四舍五入 2 位 | --- ## 二、接口测试用例 | 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 | | --- | --- | --- | --- | --- | --- | --- | --- | --- | | ZCZX-CXPH-API-001 | 计算 | 标准样本成功 | 接口测试 | Postman | 正常流程 | 已登录;有效 `grasslandId` | `POST .../calculate` Body 标准样本 | `code=200`;11 项结果与 **UT-001~005** 一致;`balanceLevel=4` | | ZCZX-CXPH-API-002 | 计算 | 未超载样本 | 接口测试 | Postman | 等级 1 | 已登录 | 降低养殖数量使指数≤1 | `balanceLevel=1`;`balanceLevelName=未超载` | | ZCZX-CXPH-API-003 | 计算 | 基本平衡样本 | 接口测试 | Postman | 等级 2 | 已登录 | 构造 00 | 成功;含 `warning` 或等级 4 | | ZCZX-CXPH-API-014 | 默认值 | GET defaults | 接口测试 | Postman | §3.2 | 已配置 sys_config | `GET .../defaults` | `code=200`;含年需草量、折算系数默认值 | | ZCZX-CXPH-API-015 | 主数据 | 草场列表复用 | 接口测试 | Postman | §3.3 | 草场 list 权限 | `GET .../grassland/list` | 返回有效草场供下拉 | | ZCZX-CXPH-API-016 | 主数据 | 草场详情带出 | 接口测试 | Postman | §3.4 | 草场 query 权限 | `GET .../grassland/{id}` | 含 `areaMu`、`grassYieldPerMu`、`utilizationRate` | | ZCZX-CXPH-API-017 | 鉴权 | 未登录 | 接口测试 | curl | 安全 | 无 Token | `POST .../calculate` | 401 或统一未登录 | | ZCZX-CXPH-API-018 | 权限 | 无 query 权限 | 接口测试 | Postman | §6 | 无本模块权限 | `POST .../calculate` | 无权限失败 | | ZCZX-CXPH-API-019 | 范围 | 无保存接口 | 接口测试 | Postman | 本期无 | 已登录 | `GET/PUT/DELETE` 测算记录类路径 | 404/405 或无路由 | | ZCZX-CXPH-API-020 | 响应 | 失败可读 | 接口测试 | Postman | §7 | 已登录 | 触发面积、利用率、羊单位非法 | `code`、`msg` 可区分 | --- ## 三、界面测试用例(UI) **测试工具**:**Playwright** + **Chromium**(`channel: 'chrome'` 使用本机 **Google Chrome**)。 | 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 | | --- | --- | --- | --- | --- | --- | --- | --- | --- | | ZCZX-CXPH-UI-001 | 页面 | 布局与公式区 | UI 测试 | Playwright+Chrome | §5.7 | 已登录 | 进入「草畜平衡计算」 | 见基础参数、计算结果、公式说明(若有) | | ZCZX-CXPH-UI-002 | 草场 | 下拉选择带出 | UI 测试 | Playwright+Chrome | §5.2 | 有草场数据 | 选择「示范草场」 | 面积、亩产草量、利用率自动填入 | | ZCZX-CXPH-UI-003 | 草场 | 切换清空结果 | UI 测试 | Playwright+Chrome | §5.2 | 已算出结果 | 换选另一草场 | 参数更新;原结果区清空或「—」 | | ZCZX-CXPH-UI-004 | 计算 | 标准样本成功 | UI 测试 | Playwright+Chrome | §5.3 | 已选草场 | 补全羊单位参数与养殖数量→点「计算」 | 11 项结果展示;等级 **严重超载**(样本) | | ZCZX-CXPH-UI-005 | 计算 | 结果只读 | UI 测试 | Playwright+Chrome | §5.4 | 已计算 | 尝试编辑结果区 | 不可编辑 | | ZCZX-CXPH-UI-006 | 计算 | 未计算前占位 | UI 测试 | Playwright+Chrome | §5.4 | 刚进页面 | 查看结果区 | 空或「—」 | | ZCZX-CXPH-UI-007 | 校验 | 未选草场 | UI 测试 | Playwright+Chrome | §5.1 | 已登录 | 不选草场直接计算 | 提示必选;结果不更新 | | ZCZX-CXPH-UI-008 | 校验 | 面积非法 | UI 测试 | Playwright+Chrome | §5.1 | 已登录 | 面积填 0→计算 | 校验失败提示 | | ZCZX-CXPH-UI-009 | 校验 | 利用率越界 | UI 测试 | Playwright+Chrome | §5.1 | 界面为 % | 填 120%→计算 | 失败或自动限制在 0~100% | | ZCZX-CXPH-UI-010 | 校验 | 羊单位≤0 | UI 测试 | Playwright+Chrome | §5.5 | 已登录 | 年需草量 0→计算 | 校验失败 | | ZCZX-CXPH-UI-011 | 计算 | 存栏为 0 | UI 测试 | Playwright+Chrome | §5.5 | 已登录 | 养殖数量 0→计算 | 实际载畜量 0;等级未超载 | | ZCZX-CXPH-UI-012 | 清空 | 重置表单 | UI 测试 | Playwright+Chrome | §5.6 | 已填参并计算 | 点「清空」 | 输入与结果全部清空 | | ZCZX-CXPH-UI-013 | 计算 | 修改参数再算 | UI 测试 | Playwright+Chrome | §4 | 已计算一次 | 改养殖数量→再计算 | 结果随新参数变化 | | ZCZX-CXPH-UI-014 | 范围 | 无保存/历史 | UI 测试 | Playwright+Chrome | §3 | 已登录 | 浏览页面按钮 | 无保存、导出、历史列表 | | ZCZX-CXPH-UI-015 | 权限 | 无菜单 | UI 测试 | Playwright+Chrome | §6 | 无本模块角色 | 登录后找菜单 | 无「草畜平衡计算」入口 | | ZCZX-CXPH-UI-016 | 端到端 | 选草场-计算-清空 | UI 集成 | Playwright+Chrome | §4 | 权限齐备 | 选草场→计算→清空 | 全流程无报错 | --- ## 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/grassLivestockBalance')`(以菜单 `component` 为准)。 - 草场:`page.locator('.el-select').filter({ hasText: '草场名称' }).click()` 后选择选项。 - 计算:`page.getByRole('button', { name: '计算' })`;断言结果区含「可利用饲草量」「草畜平衡等级」。 - 清空:`page.getByRole('button', { name: '清空' })`。 --- ## 覆盖对照 | 类别 | 单元 UT | 接口 API | 界面 UI | | --- | --- | --- | --- | | 正常流程 | UT-001~007 | API-001~005、012、014~016 | UI-002、004、013、016 | | 异常流程 | UT-008~011 | API-006~011、017~018 | UI-007~010 | | 业务约束/公式 | UT-001~007、015 | API-001~004 | UI-004、005 | | 边界 | UT-012~014 | API-012、013 | UI-011 | | 草场联动 | UT-011 | API-015~016 | UI-002、003 | | 清空/无落库 | — | API-019 | UI-012、014 | | 权限 | — | API-017~018 | UI-015 | --- ## 功能需求追溯(自查) | 需求章节 | 要点 | 主要对应用例 | | --- | --- | --- | | §5.1 参数校验 | 必填、范围 | UT-008~011;API-006~010;UI-007~010 | | §5.2 草场联动 | 带出、切换清结果 | API-015~016;UI-002、003 | | §5.3 公式 | 11 项指标 | UT-001~005;API-001;UI-004 | | §2.5 等级 | 四档 | UT-006~007;API-002~004 | | §5.5 边界 | 0 存栏、0 产草 | UT-012~014;API-012、013;UI-011 | | §5.6 清空 | 前端重置 | UI-012 | | §3 范围外 | 无保存 | API-019;UI-014 | --- ## 修订记录 | 版本 | 说明 | | --- | --- | | 1.0 | 初版:单元 15、接口 20、UI 16;对齐功能/技术方案;Playwright+Chrome;编号前缀 **ZCZX-CXPH** |