# 养殖标准管理 — 测试用例 > 依据:`养殖标准管理功能需求.md`、`养殖标准管理技术方案.md` > **执行方式**:均在管理后台通过菜单进入「养殖标准管理」及相关页面完成操作(登录、上传、查询、弹窗确认、列表操作等)。知识库异常类用例通过**临时停服务、断网或错误配置**后在页面触发并观察提示。 **通用前置(无特殊说明)**:具备本模块菜单及对应按钮权限的账号已登录;知识库可用;`biz_information_category` 已种子化。正文白名单后缀任选其一:`pdf/md/doc/docx/xls/xlsx/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(0,0)` true;`(0,1)`/`(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… | — | `a.pdf`、`readme.md`、`slides.pptx` true;`.ppt`、`.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 | 修改 | 已同步接口拒绝 | 异常测试 | 浏览器(后台)或 Postman | §4.3 | 未发布已同步 | 直接调修改接口 | 返回业务错误;数据未变更 | | 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 类型筛选 | | 1.6 | **2026-05-20**:正文白名单调整为 `pdf/md/doc/docx/xls/xlsx/pptx`(不含 `ppt`);**YZ-BZ-UT-011** 补充 `md`、`pptx` 通过及 `.ppt` 拒绝 |