# 养殖标准管理 — 测试用例

> 依据：`养殖标准管理功能需求.md`、`养殖标准管理技术方案.md`  
> **执行方式**：均在管理后台通过菜单进入「养殖标准管理」及相关页面完成操作（登录、上传、查询、弹窗确认、列表操作等）。知识库异常类用例通过**临时停服务、断网或错误配置**后在页面触发并观察提示。

**通用前置（无特殊说明）**：具备本模块菜单及对应按钮权限的账号已登录；知识库可用；`biz_information_category` 已种子化。正文白名单后缀任选其一：`pdf/md/doc/docx/xls/xlsx/ppt/pptx`（≤30MB）；封面：`jpg/jpeg/png`（≤10MB）。**标准类型编码**：`001001` 繁育作业、`001002` 饲养工作、`001003` 免疫程序、`001004` 环境调控（`parentCode=001`，`categoryType=1`）。

**测试类型说明（表内简称）**：功能测试＝正向与主流程；异常测试＝非法输入、服务失败、附件不合规等；业务规则测试＝状态机、按钮显隐与操作禁忌（不重在必填报错）；权限测试＝角色与越权；集成测试＝跨模块/端到端串联。**测试工具**：默认指 **Chrome 或 Edge 浏览器** 访问管理后台。

本文档包含三部分：**单元测试**（Service/校验纯逻辑，JUnit5 + Mockito）、**接口测试**（HTTP，Postman / Swagger / curl / RestAssured + 有效 Token）、**界面（UI）测试**（浏览器操作后台页面）。Base Path 以技术方案 **`/breedingStandards/breedingManage`** 为准；若项目带 `context-path` 或网关前缀，须在请求 URL 中补上。

---

## 一、单元测试用例

**说明**：针对 **无 Spring 容器** 的工具方法，或对 Service 内分支 **Mock** `Mapper`、知识库 Client 后断言；覆盖状态校验、参数校验、非法组合拒绝（与需求矩阵一致）。

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置/Mock | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| YZ-BZ-UT-001 | 状态校验 | 合法组合 | 单元测试 | JUnit5 | 仅三种稳态 (publish,kb) | 静态方法或枚举 | 遍历 publish∈{0,1}、kb∈{0,1} | **合法**：(0,0)(0,1)(1,1)；**非法**：(1,0) 等其余组合；非法须 reject |
| YZ-BZ-UT-002 | 状态校验 | 禁止编辑 | 单元测试 | JUnit5 | 仅已发布不可改 | — | `canEdit` 仅 `publish_status=0` 为 true | `publish=1` 时 false（无单独「已下架」编辑禁忌） |
| YZ-BZ-UT-003 | 状态校验 | 手动同步前置 | 单元测试 | JUnit5 | 同步仅未发布未同步 | — | `canSyncKb(0,0)` true；`(0,1)(1,1)` false | 与需求矩阵一致 |
| YZ-BZ-UT-004 | 状态校验 | 移出前置 | 单元测试 | JUnit5 | 仅未发布已同步 | — | `canRemoveKb(0,1)` true；其余 false | 与矩阵一致 |
| YZ-BZ-UT-005 | 状态校验 | 发布前置 | 单元测试 | JUnit5 | 仅未发布已同步 | — | `canPublish(0,1)` true；`(0,0)(1,1)` false | 与矩阵一致 |
| YZ-BZ-UT-006 | 状态校验 | 下架前置 | 单元测试 | JUnit5 | 仅已发布 | — | `canOffline(1)` true；`publish=0` false | 与矩阵一致 |
| YZ-BZ-UT-007 | 状态校验 | 删除前置 | 单元测试 | JUnit5 | 仅未发布可删 | — | `canDelete(0,0)`、`(0,1)` true；已发布 false | 与需求 §4.4 一致；Service 对「未发布已同步」一键删含内置移出 |
| YZ-BZ-UT-008 | 参数校验 | 标准名称长度 | 单元测试 | JUnit5 | 1～20 | — | 传入「」「甲」「12」「…20字」「…21字」调用校验 | 空失败；1 字与 2 字及 20 字成功；21 字失败 |
| YZ-BZ-UT-009 | 参数校验 | 简介长度 | 单元测试 | JUnit5 | 选填 ≤50 | — | null/空串通过；51 字失败 | 符合需求 |
| YZ-BZ-UT-010 | 参数校验 | 标准类型编码 | 单元测试 | JUnit5 | 有效资讯编码 | Mock 子集含 001001～001004 | 空、`999999` 失败；001001 等合法编码通过 | 与技术方案 §2.3 一致 |
| YZ-BZ-UT-011 | 附件校验 | 正文后缀白名单 | 单元测试 | JUnit5 | pdf/md/doc… | — | `validateContentSuffix("a.pdf")` true；`.exe` false | 与白名单一致 |
| YZ-BZ-UT-012 | 附件校验 | 封面后缀 | 单元测试 | JUnit5 | jpg/jpeg/png | — | `.bmp` false | 与白名单一致 |
| YZ-BZ-UT-013 | Service | 修改已发布抛业务异常 | 单元测试 | JUnit5+Mockito | 守卫分支 | Mock 查库 publish=1 | 调用 `update(...)` | 抛 ServiceException 或返回失败，不写库 |
| YZ-BZ-UT-014 | Service | 同步成功写 kb | 单元测试 | JUnit5+Mockito | 调知识库+更新状态 | Mock KB 成功、Mapper update | `syncKb(id)` | `kb_sync_status=1`，`kb_doc_id` 非空 |
| YZ-BZ-UT-015 | Service | 同步失败不翻转状态 | 单元测试 | JUnit5+Mockito | KB 抛错 | Mock KB 失败 | `syncKb(id)` | 仍为未同步，无 docId |

---

## 二、接口测试用例

**说明**：HTTP **状态码**一般为 **200**（若依多为 200 + Body 内 `code`）；下列「预期」同时约定 Body：**成功** `code=200`（或与项目统一的「操作成功」码）；**参数错** `code≠200` 且 `msg` 可读；**状态非法**业务失败同理。**鉴权**：Header 携带登录后 Token/Cookie（与 RuoYi 一致）；无权限返回 **401** 或业务无权限码（依项目）。

| 用例编号 | 接口路径（示例） | HTTP | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 请求要点 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| YZ-BZ-API-001 | `/breeding/standard/list` | GET | 接口测试 | Postman/curl | 默认分页 | Token；库内有数据 | 不传 pageSize | `rows`≤20；默认排序倒序 |
| YZ-BZ-API-002 | `/breeding/standard/list` | GET | 接口测试 | Postman | keyword + type | Token | `keyword=xxx&standardType=001003` | 结果均为免疫程序（编码精确） |
| YZ-BZ-API-003 | `/breeding/standard` | POST | 接口测试 | Postman | 新增成功 | Token；先 `/common/upload` 拿 url/path/name | JSON Body 合法字段 | `code` 成功；库中 publish=0,kb=0 |
| YZ-BZ-API-004 | `/breeding/standard` | POST | 接口测试 | Postman | 名称非法 | Token | 名称留空或超 21 字或缺其它必填 | `code` 失败；无新记录 |
| YZ-BZ-API-005 | `/breeding/standard/{id}` | GET | 接口测试 | Postman | 详情字段 | Token；有效 id | Path id | `data` 含 contentFileName、双维状态 |
| YZ-BZ-API-006 | `/breeding/standard/{id}` | GET | 接口测试 | Postman | 不存在 | Token | id=999999 | 404 或业务失败码 |
| YZ-BZ-API-007 | `/breeding/standard` | PUT | 接口测试 | Postman | 未发布可改 | Token；草稿 id | 合法 JSON | 成功；详情字段更新 |
| YZ-BZ-API-008 | `/breeding/standard` | PUT | 接口测试 | Postman | 已发布禁止 | Token；已发布 id | 任意合法 Body | 失败；库记录不变 |
| YZ-BZ-API-009 | `/breeding/standard/{ids}` | DELETE | 接口测试 | Postman | 未同步可删 | Token；未同步 id | DELETE | 成功；记录不存在 |
| YZ-BZ-API-010 | `/breeding/standard/{ids}` | DELETE | 接口测试 | Postman | 已发布禁止 | Token | 已发布 id | 失败 |
| YZ-BZ-API-011 | `/breeding/standard/syncKb/{id}` | POST | 接口测试 | Postman | 首次同步 | Token；未发布未同步 id | POST | 成功；kb=1 |
| YZ-BZ-API-012 | `/breeding/standard/syncKb/{id}` | POST | 接口测试 | Postman | 已同步拒绝 | Token；已同步 id | POST | 失败 |
| YZ-BZ-API-013 | `/breeding/standard/removeKb/{id}` | POST | 接口测试 | Postman | 移出 | Token；未发布已同步 | POST | 成功；kb=0 |
| YZ-BZ-API-014 | `/breeding/standard/publish/{id}` | POST | 接口测试 | Postman | 发布 | Token；未发布已同步 | POST | publish=1 |
| YZ-BZ-API-015 | `/breeding/standard/publish/{id}` | POST | 接口测试 | Postman | 未同步禁止 | Token；未同步 id | POST | 失败 |
| YZ-BZ-API-016 | `/breeding/standard/offline/{id}` | POST | 接口测试 | Postman | 下架回流 | Token；已发布 id | POST | **publish=0；kb=1**；`offline_time` 有值；与需求下架语义一致 |
| YZ-BZ-API-017 | `/breeding/standard/offline/{id}` | POST | 接口测试 | Postman | 非已发布禁止 | Token；草稿 id | POST | 失败 |
| YZ-BZ-API-018 | `/breeding/standard/list` | GET | 接口测试 | Postman | 未登录 | 无 Token | GET | 401 或跳转登录（依安全配置） |
| YZ-BZ-API-019 | `/breeding/standard` | POST | 接口测试 | Postman/自动化 | 无 `breeding:standard:add` | 仅有 list 权限账号 | POST | 无权限失败 |

---

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

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| YZ-BZ-001 | 列表查询 | 默认分页与排序 | 功能测试 | 浏览器（后台） | 默认每页 20 条、创建时间倒序 | 列表有若干条 | 1. 进入列表；2. 不改分页看第 1 页；3. 总条数>20 时翻第 2 页 | 默认每页 20；当前页按创建时间新→旧；>20 条时第 2 页有数据 |
| YZ-BZ-002 | 列表查询 | 关键字-名称 | 功能测试 | 浏览器（后台） | 名称模糊 OR | 存在名称含唯一词「名称关键字A」的记录 | 关键字填「名称关键字A」→查询 | 结果含该记录 |
| YZ-BZ-003 | 列表查询 | 关键字-简介 | 功能测试 | 浏览器（后台） | 简介模糊 OR | 存在简介含「简介词B」、名称不含该词的记录 | 关键字填「简介词B」→查询 | 结果含该记录 |
| YZ-BZ-004 | 列表查询 | 标准类型筛选 | 功能测试 | 浏览器（后台） | 类型精确匹配 | 存在不同类型各至少 1 条 | 类型选「免疫程序」→查询 | 结果均为免疫程序 |
| YZ-BZ-005 | 列表查询 | 关键字+类型 | 功能测试 | 浏览器（后台） | 组合条件 | 有同时满足的数据 | 输入关键字并选类型→查询 | 结果同时满足两条件 |
| YZ-BZ-006 | 列表查询 | 重置条件 | 功能测试 | 浏览器（后台） | 恢复列表 | 已设置查询条件 | 点「重置」或清空后再查 | 恢复默认条件下的列表展示 |
| YZ-BZ-007 | 新增 | 完整合法提交 | 功能测试 | 浏览器（后台）+ 本地附件 | 正常新增主流程 | 无 | 新增→名称(合法长度)、类型、简介(可填)、上传正文、上传封面→提交 | 成功；列表为未发布、未同步；详情可下载正文/看封面 |
| YZ-BZ-008 | 新增 | 简介与封面选填 | 功能测试 | 浏览器（后台）+ 本地附件 | 业务约束 | 无 | 新增→名称、类型、正文必填齐；简介空、封面不传→提交 | 成功；简介为空展示；无封面 |
| YZ-BZ-009 | 新增 | 名称必填/超长 | 异常测试 | 浏览器（后台）+ 本地附件 | 约束：1～20 字 | 无 | 名称留空或超过 20 字→其余合法→提交 | 校验失败；不落库 |
| YZ-BZ-010 | 新增 | 名称过长 | 异常测试 | 浏览器（后台）+ 本地附件 | 约束：≤20 字 | 无 | 名称 21 字→提交 | 校验失败 |
| YZ-BZ-011 | 新增 | 类型必选 | 异常测试 | 浏览器（后台）+ 本地附件 | 约束 | 无 | 不选类型→提交 | 提示必选类型 |
| YZ-BZ-012 | 新增 | 正文必填 | 异常测试 | 浏览器（后台） | 约束 | 无 | 不上传正文→提交 | 提示需正文；不落库 |
| YZ-BZ-013 | 新增 | 简介超长 | 异常测试 | 浏览器（后台）+ 本地附件 | 约束：≤50 字 | 无 | 简介≥51 字→提交 | 校验失败 |
| YZ-BZ-014 | 新增 | 正文格式/大小 | 异常测试 | 浏览器（后台）+ 本地附件 | 白名单与≤30MB | 准备非法后缀或>30MB 文件（若有） | 作为正文上传或提交 | 拒绝或明确错误提示；不落库 |
| YZ-BZ-015 | 新增 | 封面格式/大小 | 异常测试 | 浏览器（后台）+ 本地附件 | 白名单与≤10MB | 非法后缀或>10MB 图片 | 上传封面 | 拒绝或错误提示；合法小图可成功 |
| YZ-BZ-016 | 新增 | 单正文单封面 | 业务规则测试 | 浏览器（后台）+ 本地附件 | 单附件约束 | 无 | 正文上传两次（若 UI 为替换则确认仅保留最后一次） | 最终仅一份正文；封面同理 |
| YZ-BZ-017 | 详情 | 字段展示 | 功能测试 | 浏览器（后台） | 名称/类型/简介/正文/封面及附件名 | 任意一条记录 | 点详情 | 字段齐全；正文有下载/预览入口；**正文附件展示名**与上传时原始文件名一致（或与产品约定展示规则一致） |
| YZ-BZ-018 | 详情 | 已发布只读 | 业务规则测试 | 浏览器（后台） | 约束 | 已发布记录 | 打开详情 | 无保存类编辑或按钮不可用 |
| YZ-BZ-019 | 详情 | 下架回流后可编辑 | 业务规则测试 | 浏览器（后台） | 需求：下架回到未发布 | 已由「已发布」下架回流的数据 | 打开详情 | **可出现编辑入口**（未发布+已同步）；与 YZ-BZ-018 区分 |
| YZ-BZ-020 | 修改 | 未发布未同步可改 | 功能测试 | 浏览器（后台）+ 本地附件 | 正常修改 | 未发布未同步记录 | 编辑→改名称/类型/简介/换正文或封面→保存 | 成功；列表/详情更新；仍为未同步（未点同步前） |
| YZ-BZ-021 | 修改 | 未发布已同步自动推库 | 集成测试 | 浏览器（后台）+ 知识库检索/管理端 | 保存后更新知识库 | 未发布已同步；知识库可查 | 编辑改名称或简介→保存→核对知识库或二次详情 | 成功；知识库为最新；仍为未发布已同步 |
| YZ-BZ-022 | 修改 | 已发布不可改 | 业务规则测试 | 浏览器（后台） | 约束 | 已发布记录 | 尝试编辑 | 无编辑入口或不可保存 |
| YZ-BZ-023 | 修改 | 下架回流后可改 | 功能测试 | 浏览器（后台） | 回流=未发布 | 下架回流后的记录 | 编辑→保存 | **允许修改**；仍为未发布已同步直至再发布 |
| YZ-BZ-024 | 修改 | 保存仍校验必填 | 异常测试 | 浏览器（后台）+ 本地附件 | 名称/类型/正文 | 未发布未同步 | 编辑清空名称或去掉正文→保存 | 校验失败 |
| YZ-BZ-025 | 知识库 | 手动同步 | 集成测试 | 浏览器（后台）+ 知识库检索/管理端 | 未发布未同步首次入库 | 未发布未同步、正文已填 | 点「同步知识库」→确认 | 成功；状态为已同步 |
| YZ-BZ-026 | 知识库 | 已同步不重复首次同步 | 业务规则测试 | 浏览器（后台） | 约束 | 未发布已同步 | 查看操作区 | 「同步知识库」隐藏或不可用 |
| YZ-BZ-027 | 知识库 | 已发布禁手动同步 | 业务规则测试 | 浏览器（后台） | 需求 §4.6 | 已发布记录 | 查看操作区 | 无「同步知识库」（须先下架回到未发布） |
| YZ-BZ-028 | 知识库 | 移出知识库 | 集成测试 | 浏览器（后台）+ 知识库检索/管理端 | 未发布已同步 | 未发布已同步 | 点「移出知识库」→确认 | 成功；变为未同步；可再次同步 |
| YZ-BZ-029 | 知识库 | 已发布无单独移出 | 业务规则测试 | 浏览器（后台） | 约束 | 已发布 | 查看操作区 | 无「移出知识库」单独入口 |
| YZ-BZ-030 | 知识库 | 同步失败提示 | 异常测试 | 浏览器（后台）+ 知识库不可用模拟（运维停服务/断网/错配；可选 DevTools Network） | 异常 | 未发布未同步；临时使知识库不可用 | 点同步 | 明确失败提示；仍为未同步；恢复后可重试 |
| YZ-BZ-031 | 发布下架 | 发布 | 功能测试 | 浏览器（后台） | 已同步未发布可发布 | 未发布已同步 | 点「发布」→确认 | 成功；已发布 |
| YZ-BZ-032 | 发布下架 | 未同步禁发布 | 业务规则测试 | 浏览器（后台） | 约束 | 未发布未同步 | 点发布或看按钮 | 不可用或业务提示 |
| YZ-BZ-033 | 发布下架 | 下架 | 集成测试 | 浏览器（后台）+ 知识库检索/管理端 | 对外下架、库内保留副本 | 已发布 | 点「下架」→确认 | 成功；业务侧 **未发布+已同步**；知识库 **保留条目**（对外不可检索/不可见以对接为准，可抽查） |
| YZ-BZ-034 | 发布下架 | 下架后可再发布 | 功能测试 | 浏览器（后台） | 回流后可发布 | 下架回流后未发布已同步 | 点「发布」→确认 | **允许再次发布**；成功后已发布 |
| YZ-BZ-035 | 删除 | 未同步可删 | 功能测试 | 浏览器（后台） | 正常 | 未发布未同步 | 删除→确认 | 成功；记录消失；原附件下载失效或 404 |
| YZ-BZ-036 | 删除 | 未发布已同步须移出后删 | 功能测试 | 浏览器（后台） | 需求 §4.4 | 下架回流后（未发布已同步） | 直接删→确认 | **失败或提示先移出**；先移出再删→成功 |
| YZ-BZ-037 | 删除 | 已发布不可删 | 业务规则测试 | 浏览器（后台） | 约束 | 已发布 | 尝试删除 | 无删除或提示先下架 |
| YZ-BZ-038 | 删除 | 未发布已同步 | 集成测试 | 浏览器（后台）+ 知识库检索/管理端 | 须先移出或联动 | 未发布已同步 | 直接删（若开放）或先移出再删 | 符合需求：先移出再删成功，或一键删含移出且无知识库残留 |
| YZ-BZ-039 | 端到端 | 主流程串联 | 集成测试 | 浏览器（后台）+ 本地附件 + 知识库检索/管理端 | 含下架回流再发布 | 可新建一条 | 新增→同步→编辑保存→发布→下架→**再编辑→再发布**→下架→移出→删除 | 各步状态与需求矩阵一致 |
| YZ-BZ-040 | 权限 | 无权限/只读 | 权限测试 | 浏览器（后台）；受限账号 | 越权防护 | 无本模块写权限账号 | 登录后看菜单/点新增或改 URL | 无菜单或操作被拒 |
| YZ-BZ-041 | 修改 | 推库失败一致性 | 异常测试 | 浏览器（后台）+ 知识库不可用模拟（运维/DevTools） | 异常（与实现约定） | 未发布已同步；临时使更新知识库失败 | 编辑→保存 | 若实现为整单失败：提示失败且数据未脏写；否则记录与需求偏差 |
| YZ-BZ-042 | 附件 | 删除后文件不可访问 | 功能测试 | 浏览器（后台）；下载链接新标签验证 | 删库联动删文件 | 完成 YZ-BZ-035 或新建再删 | 删除前复制正文下载链接；删除后再访问该链接 | 不可下载或无权访问 |

---

## 覆盖对照

| 类别 | 用例编号 | 说明 |
| --- | --- | --- |
| UI 正常流程 | YZ-BZ-001～008、017、020～021、023、025、028、031、033～034、035、039、042 | 列表、增改查、下架回流、同步、移出、发布、下架、删除、端到端 |
| UI 异常/校验 | 009～016、030、041～042 | 字段、文件、知识库失败、推库一致性、删文件 |
| UI 业务约束 | 018～019、022、024、026～027、029、032、036～038 | 需求矩阵与 §4.3～§4.8（无「已下架」稳态） |
| UI 权限 | 040 | 越权 |
| 单元测试 | YZ-BZ-UT-001～015 | 状态机、参数与附件校验、Service 分支（Mock） |
| 接口测试 | YZ-BZ-API-001～019 | CRUD、同步/移出/发布/下架、鉴权 |

---

## 修订记录

| 版本 | 说明 |
| --- | --- |
| 1.0 | 初版：页面可执行；对齐功能需求与技术方案（附件：URL、存储路径、**正文附件名称**；大小不入库；用例以 UI 验证为主） |
| 1.1 | 用例表增加 **测试类型**、**测试工具** 列；文首补充类型说明 |
| 1.2 | 增加 **单元测试**、**接口测试**；覆盖对照扩展 |
| 1.3 | 章节顺序调整为：**一、单元测试** → **二、接口测试** → **三、界面测试（UI）**；文首三部分说明同步 |
| 1.4 | 对齐 `养殖标准管理功能需求.md`：下架回流 **未发布+已同步**；下架≠移出；合法组合不含「已下架」稳态；**YZ-BZ-API-016**、UT/UI 预期同步修订 |
| 1.5 | **标准类型**改为资讯类别编码（`001001`～`001004`）；同步 UT-010、API-002 及 UI 类型筛选 |
