# 综合牧业知识库 — 测试用例

> 依据：`综合牧业知识库管理功能需求.md`、`综合牧业知识库技术方案.md`  
> **接口 Base Path**：`/techServices/knowledge`；鉴权与若依一致（Cookie / Token）。

**通用前置（无特殊说明）**：具备本模块权限的账号已登录（`techService:knowledge:list|query|add|edit|remove|syncKb|removeKb`）。`biz_livestock_knowledge` 宜预置（`del_flag=0`）：

| 样本 | 标题 | 主题 | 入库状态 |
| --- | --- | --- | --- |
| **K1** | 春季饲喂要点 | 1 饲养管理 | 未入库（`kb_sync_status=0`） |
| **K2** | 口蹄疫防控手册 | 2 疫病管理 | 未入库 |
| **K3** | 牧场规划范例 | 4 牧场设计 | **已入库**（`kb_sync_status=1`，`kb_doc_id` 非空） |
| **K4** | 补贴政策解读2024 | 5 政策解读 | 已入库（用于移出后编辑链路） |

**合法 Body 片段**：`knowledgeTitle=测试知识标题`，`knowledgeTopic=1`，`introduction=简介不超过五十字`，`contentFileUrl`/`contentFilePath`/`contentFileName` 来自 `/common/upload`（后缀 `pdf` 等白名单，≤30MB）。

**界面（UI）测试**：**Playwright** + **Chromium**（`channel: 'chrome'` 使用本机 **Google Chrome**）；菜单路径以系统配置为准，示例「牧业养殖科技服务 → 综合牧业知识库」。

---

## 一、单元测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-ZHMYZSK-UT-001 | 参数校验 | 知识标题长度 | 单元测试 | JUnit5 | §5.2 | 无 | trim 后「」、1 字、20 字、21 字 | 空/21 失败；1～20 通过 |
| ZCZX-ZHMYZSK-UT-002 | 参数校验 | 知识简介长度 | 单元测试 | JUnit5 | §5.2 | 无 | null/空串；50 字；51 字 | 空通过；51 字失败 |
| ZCZX-ZHMYZSK-UT-003 | 参数校验 | 知识主题枚举 | 单元测试 | JUnit5 | §2.2 | 无 | `knowledgeTopic` 为 0、6、1～5 | 0/6 失败；1～5 通过 |
| ZCZX-ZHMYZSK-UT-004 | 参数校验 | 正文后缀白名单 | 单元测试 | JUnit5 | §5.2 | 无 | `.pdf`、`.md`、`.exe`、无后缀 | pdf/md 等通过；exe 失败 |
| ZCZX-ZHMYZSK-UT-005 | 参数校验 | 正文必填 | 单元测试 | JUnit5 | §5.2 | 无 | 缺 `contentFileUrl`/`contentFilePath`/`contentFileName` | 失败 |
| ZCZX-ZHMYZSK-UT-006 | 入库状态 | 仅 0/1 合法 | 单元测试 | JUnit5 | §2.3 | 无 | 校验 `kb_sync_status` 为 -1、2、0、1 | 仅 0、1 为业务合法值 |
| ZCZX-ZHMYZSK-UT-007 | 状态规则 | 可编辑 | 单元测试 | JUnit5 | §6 | 无 | `canEdit(kb=0)`；`canEdit(kb=1)` | 仅未入库 true |
| ZCZX-ZHMYZSK-UT-008 | 状态规则 | 可删除 | 单元测试 | JUnit5 | §6 | 无 | `canDelete(kb=0)`；`canDelete(kb=1)` | 仅未入库 true |
| ZCZX-ZHMYZSK-UT-009 | 状态规则 | 可同步 | 单元测试 | JUnit5 | §6 | 无 | `canSyncKb(0)`；`canSyncKb(1)` | 仅未入库 true |
| ZCZX-ZHMYZSK-UT-010 | 状态规则 | 可移出 | 单元测试 | JUnit5 | §6 | 无 | `canRemoveKb(1)`；`canRemoveKb(0)` | 仅已入库 true |
| ZCZX-ZHMYZSK-UT-011 | Service | 新增落库默认值 | 单元测试 | JUnit5+Mockito | §5.2 | Mock Mapper insert | `insert` 合法行 | `kb_sync_status=0`；`kb_doc_id` 空；`del_flag=0` |
| ZCZX-ZHMYZSK-UT-012 | Service | 已入库禁止修改 | 单元测试 | JUnit5+Mockito | §5.3 | Mock 查库 K3（kb=1） | `update` | 抛 `ServiceException`；msg 含移出提示 |
| ZCZX-ZHMYZSK-UT-013 | Service | 未入库修改不推库 | 单元测试 | JUnit5+Mockito | §4.3 | Mock K1；Mock KB | `update` 成功 | 仅 Mapper update；**不**调用 `uploadFileByUrl` |
| ZCZX-ZHMYZSK-UT-014 | Service | 同步成功写状态 | 单元测试 | JUnit5+Mockito | §5.6 | Mock KB 返回 `DOC-1` | `syncKb(id)` | `kb_sync_status=1`；`kb_doc_id=DOC-1` |
| ZCZX-ZHMYZSK-UT-015 | Service | 同步失败不改状态 | 单元测试 | JUnit5+Mockito | §5.6 | Mock KB 抛错 | `syncKb` | 仍为 `kb_sync_status=0`；无 docId |
| ZCZX-ZHMYZSK-UT-016 | Service | 重复同步拒绝 | 单元测试 | JUnit5+Mockito | §5.6 | Mock K3 | `syncKb` | 失败；msg 含「已入库」 |
| ZCZX-ZHMYZSK-UT-017 | Service | 移出成功清 docId | 单元测试 | JUnit5+Mockito | §5.7 | Mock K3；Mock `deleteFile` 成功 | `removeKb` | `kb_sync_status=0`；`kb_doc_id` 空 |
| ZCZX-ZHMYZSK-UT-018 | Service | 移出失败保持状态 | 单元测试 | JUnit5+Mockito | §5.7 | Mock `deleteFile` 失败 | `removeKb` | 仍为已入库；docId 保留 |
| ZCZX-ZHMYZSK-UT-019 | Service | 未入库移出拒绝 | 单元测试 | JUnit5+Mockito | §5.7 | Mock K1 | `removeKb` | 失败；msg 含「仅已入库」 |
| ZCZX-ZHMYZSK-UT-020 | Service | 已入库禁止删除 | 单元测试 | JUnit5+Mockito | §5.5 | Mock K3 | `removeByIds` | 失败 |
| ZCZX-ZHMYZSK-UT-021 | Service | 未入库逻辑删除 | 单元测试 | JUnit5+Mockito | §5.5 | Mock K1 | `removeByIds` | `del_flag=2`；删附件方法被调用 |
| ZCZX-ZHMYZSK-UT-022 | Mapper | 列表 SQL 条件 | 单元测试 | JUnit5 | §5.1 | 审阅 XML | 检查 `selectBizLivestockKnowledgeList` | `del_flag=0`；keyword 标题/简介 OR；`knowledge_topic=`；`kb_sync_status=`；`ORDER BY create_time DESC` |

---

## 二、接口测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-ZHMYZSK-API-001 | 列表 | 默认分页排序 | 接口测试 | Postman | §5.1 | 有多条样本 | `GET /list` | `code=200`；≤20 条；`createTime` 倒序 |
| ZCZX-ZHMYZSK-API-002 | 列表 | 关键字-标题 | 接口测试 | Postman | §2.5 | 有 K1 | `keyword=饲喂` | 含 K1 |
| ZCZX-ZHMYZSK-API-003 | 列表 | 关键字-简介 | 接口测试 | Postman | §2.5 | K2 简介含唯一词 | `keyword=该唯一词`（标题不含） | 含 K2 |
| ZCZX-ZHMYZSK-API-004 | 列表 | 主题精确筛选 | 接口测试 | Postman | §2.5 | 有主题 2 数据 | `knowledgeTopic=2` | 均为疫病管理 |
| ZCZX-ZHMYZSK-API-005 | 列表 | 入库状态筛选 | 接口测试 | Postman | §2.5 | 有 K3 | `kbSyncStatus=1` | 仅已入库 |
| ZCZX-ZHMYZSK-API-006 | 列表 | 组合筛选 | 接口测试 | Postman | §2.5 | 有匹配数据 | `keyword`+`knowledgeTopic`+`kbSyncStatus` | 同时满足 |
| ZCZX-ZHMYZSK-API-007 | 列表 | 不含已删除 | 接口测试 | Postman | §2.4 | 某 id 已 `del_flag=2` | `GET /list` | 无该 id |
| ZCZX-ZHMYZSK-API-008 | 新增 | 合法提交 | 接口测试 | Postman | §5.2 | 已上传 pdf | `POST` 合法 Body | `code=200`；`kbSyncStatus=0` |
| ZCZX-ZHMYZSK-API-009 | 新增 | 标题空/超长 | 接口测试 | Postman | §5.2 | 已登录 | 标题 `""` 或 21 字 | 失败；不落库 |
| ZCZX-ZHMYZSK-API-010 | 新增 | 主题非法 | 接口测试 | Postman | §5.2 | 已登录 | `knowledgeTopic=9` | 失败 |
| ZCZX-ZHMYZSK-API-011 | 新增 | 简介超长 | 接口测试 | Postman | §5.2 | 已登录 | 简介 51 字 | 失败 |
| ZCZX-ZHMYZSK-API-012 | 新增 | 缺正文附件 | 接口测试 | Postman | §5.2 | 已登录 | 缺 `contentFilePath` | 失败；msg 含上传提示 |
| ZCZX-ZHMYZSK-API-013 | 详情 | 有效 id | 接口测试 | Postman | §5.4 | 有 K1 | `GET /{id}` | 含 `contentFileName`、`kbSyncStatus` |
| ZCZX-ZHMYZSK-API-014 | 详情 | 不存在/已删 | 接口测试 | Postman | 异常 | 已登录 | id=999999 或已删 id | 失败或 `data` 空 |
| ZCZX-ZHMYZSK-API-015 | 修改 | 未入库成功 | 接口测试 | Postman | §5.3 | 有 K1 | `PUT` 改 `introduction` | 成功；仍为未入库 |
| ZCZX-ZHMYZSK-API-016 | 修改 | 已入库禁止 | 接口测试 | Postman | §5.3 | 有 K3 | `PUT` 任意合法 Body | 失败；库不变 |
| ZCZX-ZHMYZSK-API-017 | 删除 | 未入库逻辑删 | 接口测试 | Postman | §5.5 | 新建未入库行 | `DELETE /{id}` | 成功；列表不可见 |
| ZCZX-ZHMYZSK-API-018 | 删除 | 已入库禁止 | 接口测试 | Postman | §5.5 | 有 K3 | `DELETE /{id}` | 失败 |
| ZCZX-ZHMYZSK-API-019 | 同步 | 未入库成功 | 接口测试 | Postman | §5.6 | 有 K2；KB 可用 | `POST /syncKb/{id}` | `kbSyncStatus=1`；`kbDocId` 非空 |
| ZCZX-ZHMYZSK-API-020 | 同步 | 已入库拒绝 | 接口测试 | Postman | §5.6 | 有 K3 | 再次 `syncKb` | 失败；msg 含「已入库」 |
| ZCZX-ZHMYZSK-API-021 | 同步 | KB 失败不改态 | 接口测试 | Postman | §5.6 | 停 KB 或 Mock 失败 | `syncKb` 未入库 id | 失败；库仍为 0 |
| ZCZX-ZHMYZSK-API-022 | 移出 | 已入库成功 | 接口测试 | Postman | §5.7 | 有 K4 或 K3 | `POST /removeKb/{id}` | `kbSyncStatus=0`；`kbDocId` 空 |
| ZCZX-ZHMYZSK-API-023 | 移出 | 未入库拒绝 | 接口测试 | Postman | §5.7 | 有 K1 | `removeKb` | 失败 |
| ZCZX-ZHMYZSK-API-024 | 移出 | KB 失败保持态 | 接口测试 | Postman | §5.7 | KB 删除失败 | `removeKb` 已入库 id | 失败；仍为已入库 |
| ZCZX-ZHMYZSK-API-025 | 端到端 | 运营主流程 | 接口测试 | Postman | §4.2 | 已登录；KB 可用 | `POST`新增→`syncKb`→`removeKb`→`PUT`改标题→`syncKb`→`DELETE` | 各步 `code=200`；最终列表无该条 |
| ZCZX-ZHMYZSK-API-026 | 端到端 | 已入库维护禁忌 | 接口测试 | Postman | §4.2 | 有 K3 | 直接 `PUT`、`DELETE` | 均失败；须先移出 |
| ZCZX-ZHMYZSK-API-027 | 鉴权 | 未登录 | 接口测试 | curl | 安全 | 无 Token | `GET /list` | 401 或未登录 |
| ZCZX-ZHMYZSK-API-028 | 权限 | 无新增权限 | 接口测试 | Postman | §6 | 仅 list 权限账号 | `POST /` 合法 Body | 无权限失败 |
| ZCZX-ZHMYZSK-API-029 | 权限 | 无 syncKb 权限 | 接口测试 | Postman | §6 | 无 syncKb | `POST /syncKb/1` | 无权限失败 |
| ZCZX-ZHMYZSK-API-030 | 响应 | 失败 msg 可读 | 接口测试 | Postman | §8 | 已登录 | 触发已入库编辑、重复同步、未入库移出 | `msg` 与需求 §8 语义一致 |

---

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

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

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-ZHMYZSK-UI-001 | 列表 | 页面与列展示 | UI 测试 | Playwright+Chrome | §5.1 | 已登录；有样本 | 进入「综合牧业知识库」 | 标题「综合牧业知识列表」；列含标题、主题、简介、知识文件、入库状态、操作 |
| ZCZX-ZHMYZSK-UI-002 | 列表 | 关键字筛选 | UI 测试 | Playwright+Chrome | §2.5 | 有 K1 | 关键词填「饲喂」→搜索 | 含 K1 |
| ZCZX-ZHMYZSK-UI-003 | 列表 | 主题筛选 | UI 测试 | Playwright+Chrome | §2.5 | 有主题 2 数据 | 知识主题选「疫病管理」→搜索 | 仅主题 2 行 |
| ZCZX-ZHMYZSK-UI-004 | 列表 | 入库状态筛选 | UI 测试 | Playwright+Chrome | §2.5 | 有 K3 | 入库状态选「已入库」→搜索 | 仅已入库行 |
| ZCZX-ZHMYZSK-UI-005 | 列表 | 重置 | UI 测试 | Playwright+Chrome | §5.1 | 已设筛选 | 搜索→点「重置」 | 条件清空；列表恢复默认 |
| ZCZX-ZHMYZSK-UI-006 | 新增 | 合法提交 | UI 测试 | Playwright+Chrome | §5.2 | 有 add 权限 | 新增→填标题(≤20)、选主题、简介、上传 pdf→确定 | 成功提示；列表新行「未入库」 |
| ZCZX-ZHMYZSK-UI-007 | 新增 | 标题必填/超长 | UI 测试 | Playwright+Chrome | §5.2 | 打开新增弹窗 | 标题留空或 21 字→确定 | 前端校验失败；不提交 |
| ZCZX-ZHMYZSK-UI-008 | 新增 | 主题必选 | UI 测试 | Playwright+Chrome | §5.2 | 打开新增 | 不选知识主题→确定 | 提示必选 |
| ZCZX-ZHMYZSK-UI-009 | 新增 | 简介超长 | UI 测试 | Playwright+Chrome | §5.2 | 打开新增 | 简介输入 51 字→确定 | 校验失败 |
| ZCZX-ZHMYZSK-UI-010 | 新增 | 未上传正文 | UI 测试 | Playwright+Chrome | §5.2 | 打开新增 | 填标题主题不传文件→确定 | 提示须上传知识内容 |
| ZCZX-ZHMYZSK-UI-011 | 新增 | 附件格式/大小 | UI 测试 | Playwright+Chrome | §5.2 | 打开新增 | 选 `.exe` 或 >30MB（若控件可测） | 上传失败或提交前拦截 |
| ZCZX-ZHMYZSK-UI-012 | 查看 | 只读详情 | UI 测试 | Playwright+Chrome | §5.4 | 任意行 | 点击查看 | 展示标题、主题、简介、文件名、入库状态；无保存按钮 |
| ZCZX-ZHMYZSK-UI-013 | 操作列 | 未入库按钮集 | UI 测试 | Playwright+Chrome | §6 | K1 行 | 查看操作列 | 有查看、编辑、删除、同步知识库；无移出 |
| ZCZX-ZHMYZSK-UI-014 | 操作列 | 已入库按钮集 | UI 测试 | Playwright+Chrome | §6 | K3 行 | 查看操作列 | 有查看、移出知识库；无编辑、删除、同步 |
| ZCZX-ZHMYZSK-UI-015 | 编辑 | 未入库修改 | UI 测试 | Playwright+Chrome | §5.3 | K1 行 | 编辑→改简介→确定 | 列表/详情已更新；仍未入库 |
| ZCZX-ZHMYZSK-UI-016 | 编辑 | 已入库无入口 | UI 测试 | Playwright+Chrome | §5.3 | K3 行 | 查找编辑入口 | 无「编辑」或点击无效 |
| ZCZX-ZHMYZSK-UI-017 | 同步 | 确认与成功 | UI 测试 | Playwright+Chrome | §5.6 | K2 未入库；KB 可用 | 同步知识库→确认 | 成功提示；行变为已入库 |
| ZCZX-ZHMYZSK-UI-018 | 同步 | 已入库不可再同步 | UI 测试 | Playwright+Chrome | §5.6 | K3 行 | 尝试同步（若误显） | 无按钮或提示已入库 |
| ZCZX-ZHMYZSK-UI-019 | 移出 | 确认与成功 | UI 测试 | Playwright+Chrome | §5.7 | K4 已入库 | 移出知识库→确认 | 成功；行变未入库；出现编辑/删除/同步 |
| ZCZX-ZHMYZSK-UI-020 | 移出 | 未入库无移出 | UI 测试 | Playwright+Chrome | §5.7 | K1 行 | 查看操作列 | 无「移出知识库」 |
| ZCZX-ZHMYZSK-UI-021 | 删除 | 未入库二次确认 | UI 测试 | Playwright+Chrome | §5.5 | 新建未入库行 | 删除→确认（文案含标题） | 行从列表消失 |
| ZCZX-ZHMYZSK-UI-022 | 删除 | 已入库禁止 | UI 测试 | Playwright+Chrome | §5.5 | K3 行 | 尝试删除 | 无删除或提示先移出 |
| ZCZX-ZHMYZSK-UI-023 | 端到端 | 移出-改-再入库 | UI 测试 | Playwright+Chrome | §4.2 | 已入库样本 | 移出→编辑改标题→保存→同步 | 各步成功；最终已入库且标题已变 |
| ZCZX-ZHMYZSK-UI-024 | 端到端 | 新增到入库 | UI 测试 | Playwright+Chrome | §4.2 | 有 add/sync 权限 | 新增完整条目→同步知识库 | 列表显示已入库 |
| ZCZX-ZHMYZSK-UI-025 | 权限 | 无新增按钮 | UI 测试 | Playwright+Chrome | §6 | 仅 list 权限账号 | 进入列表 | 无「新增」或禁用 |
| ZCZX-ZHMYZSK-UI-026 | 异常 | 同步失败提示 | UI 测试 | Playwright+Chrome | §5.6 | 临时停 KB 服务 | 对未入库行点同步→确认 | 失败提示含原因；仍为未入库 |
| ZCZX-ZHMYZSK-UI-027 | 异常 | 移出失败提示 | UI 测试 | Playwright+Chrome | §5.7 | KB 删除接口不可用 | 对已入库行移出 | 失败提示；仍为已入库 |

---

## 四、用例统计与执行建议

| 分类 | 数量 | 工具 |
| --- | --- | --- |
| 单元测试 | 22 | JUnit5（+ Mockito 测 Service） |
| 接口测试 | 30 | Postman / MockMvc |
| 界面测试 | 27 | Playwright + Google Chrome |

**MockMvc 映射**：API-001～030 可落库为 `BizLivestockKnowledgeControllerTest`；UT-011～021 为 `BizLivestockKnowledgeServiceImplTest` + `LivestockKnowledgeValidationTest`。

**Playwright 示例配置（摘录）**：

```javascript
// playwright.config.js 片段
use: {
  channel: 'chrome',
  locale: 'zh-CN',
  baseURL: process.env.ADMIN_BASE_URL, // 如 http://localhost:80
},
```

**优先级**：P0＝API-008/015/019/022/025、UI-006/013/014/017/019/024；P1＝状态拒绝类与 KB 失败类；P2＝权限与边界长度。

---

## 五、修订记录

| 版本 | 说明 |
| --- | --- |
| 1.0 | 初稿：覆盖入库状态机、校验、同步/移出/删改禁忌；UT 22 + API 30 + UI 27 |
