# 项目与补贴 — 补贴 — 测试用例

> 依据：`项目与补贴-补贴功能需求.md`、`项目与补贴-补贴技术方案.md`  
> **接口 Base Path（示例）**：`/policy/projectSubsidy`；若含 `context-path` 或网关前缀须补齐。鉴权与若依一致（Cookie / Token）。

**通用前置（无特殊说明）**：具备本模块菜单与按钮权限的账号已登录；可先调 `POST /common/upload` 取得明细附件/封面的 `url`、`fileName`（存储路径）、`originalFilename`（作 `detailFileName`）。**明细附件**（必填）白名单：`pdf`/`md`/`doc`/`docx`/`xls`/`xlsx`/`ppt`/`pptx`（≤30MB）；**封面**（选填）：`jpg`/`jpeg`/`png`（≤10MB）。**发放状态**：`1` 申请中、`2` 已发放。**补贴名称**：1～20 字符（必填）。

**界面（UI）测试**：借助 **Playwright** 启动 **Chromium**（与 **Google Chrome 同源内核**）；可配置 `channel: 'chrome'` 调用本机已安装的谷歌浏览器。

---

## 一、单元测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-BTSX-UT-001 | 参数校验 | 补贴名称长度 | 单元测试 | JUnit5 | §5.1 1～20 | 无 | 空串、1 字、20 字、21 字 | 空/21 失败；1～20 通过 |
| ZCZX-BTSX-UT-002 | 参数校验 | 简介字数 | 单元测试 | JUnit5 | 选填≤50 | 无 | null/空通过；51 字失败 | 符合 §5.1 |
| ZCZX-BTSX-UT-003 | 参数校验 | 发放状态枚举 | 单元测试 | JUnit5 | 仅 1～2 | 无 | `grantStatus` 为 1/2 通过；0、3、null 失败 | 与技术方案 §2.2 一致 |
| ZCZX-BTSX-UT-004 | 附件校验 | 明细后缀白名单 | 单元测试 | JUnit5 | §5.1 | 无 | `.pdf`、`.xlsx` 通过；`.exe`、`.zip` 失败 | 与需求一致 |
| ZCZX-BTSX-UT-005 | 附件校验 | 封面后缀白名单 | 单元测试 | JUnit5 | §5.1 | 无 | `.jpg`、`.png` 通过；`.bmp` 失败 | 与需求一致 |
| ZCZX-BTSX-UT-006 | 附件校验 | 明细三件套必填 | 单元测试 | JUnit5 | url/path/name | 无 | 缺 url 或缺 name；三者齐全 | 前者失败；后者通过 |
| ZCZX-BTSX-UT-007 | 附件校验 | 封面成对 | 单元测试 | JUnit5 | 可空成对 | 无 | 仅 coverUrl 无 path；二者齐全或皆空 | 单字段失败；成对/皆空通过 |
| ZCZX-BTSX-UT-008 | 业务默认 | 新增缺省发放状态 | 单元测试 | JUnit5 | 技术方案 §1 | 无 | `resolveGrantStatus(null)` 或 insert 未传 | 落库/结果为 `1`（申请中） |
| ZCZX-BTSX-UT-009 | Service | 新增落库 | 单元测试 | JUnit5+Mockito | §5.1 | 合法实体含明细三件套 | `insert(matter)` | 字段与入参一致；`grant_status` 正确 |
| ZCZX-BTSX-UT-010 | Service | 修改全字段 | 单元测试 | JUnit5+Mockito | §5.3 | 已存在 id | `update` 改名称、状态、简介 | 更新成功；`update_time` 变化 |
| ZCZX-BTSX-UT-011 | Service | 状态双向变更 | 单元测试 | JUnit5+Mockito | §5.3 默认 | 原 `grant_status=2` | `update` 改为 `1` | 成功（默认允许回退） |
| ZCZX-BTSX-UT-012 | Service | 修改缺明细拒绝 | 单元测试 | JUnit5+Mockito | 保存约束 | 已存在记录 | `update` 清空 detail 三件套 | 校验失败；不写库 |
| ZCZX-BTSX-UT-013 | Service | 替换明细删旧 | 单元测试 | JUnit5+Mockito | §5.3 | 旧 `detail_file_path` 已知 | `update` 换新三件套 | Mock 验证 `deleteFile(旧path)` |
| ZCZX-BTSX-UT-014 | Service | 替换封面删旧 | 单元测试 | JUnit5+Mockito | §5.3 | 旧 `cover_file_path` 已知 | `update` 换新封面 | 删除旧 cover path |
| ZCZX-BTSX-UT-015 | Service | 删除联动清文件 | 单元测试 | JUnit5+Mockito | §5.4 | 记录含 detail/cover path | `deleteByIds([id])` | 删库；对两 path 各调 `deleteFile` |
| ZCZX-BTSX-UT-016 | Service | 列表排序 SQL | 单元测试 | JUnit5 | 技术方案 | 无 | 检查列表 ORDER BY | 含 `create_time DESC`, `id DESC` |

---

## 二、接口测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-BTSX-API-001 | 列表 | 默认分页排序 | 接口测试 | Postman/curl | §5.2 | 已登录；有多条不同创建时间 | `GET /industryPolicy/subsidyMatter/list` | `rows`≤20；`createTime` 新在前 |
| ZCZX-BTSX-API-002 | 列表 | 关键字-名称 | 接口测试 | Postman | 模糊 | 已登录 | `keyword=` 仅命中名称片段 | 返回含该名称记录 |
| ZCZX-BTSX-API-003 | 列表 | 关键字-简介 | 接口测试 | Postman | OR | 简介含词、名称不含 | 同上 keyword | 仍命中 |
| ZCZX-BTSX-API-004 | 列表 | 发放状态-申请中 | 接口测试 | Postman | 精确 | 已登录 | `grantStatus=1` | 均为申请中 |
| ZCZX-BTSX-API-005 | 列表 | 发放状态-已发放 | 接口测试 | Postman | 精确 | 已登录 | `grantStatus=2` | 均为已发放 |
| ZCZX-BTSX-API-006 | 列表 | 组合查询 | 接口测试 | Postman | 多条件 | 已登录 | keyword+grantStatus | 同时满足 |
| ZCZX-BTSX-API-007 | 新增 | 合法全字段 | 接口测试 | Postman | §5.1 | 已登录；已上传明细+封面 | `POST` Body 合法 | `code` 成功；详情含 `detailFileName` |
| ZCZX-BTSX-API-008 | 新增 | 最小必填无封面 | 接口测试 | Postman | 正常 | 已登录；仅上传明细 | `POST` 名称+状态+明细三件套，无简介无封面 | 成功；`grantStatus` 为入参或默认 `1` |
| ZCZX-BTSX-API-009 | 新增 | 缺省发放状态 | 接口测试 | Postman | 默认申请中 | 已登录 | `POST` 不传 `grantStatus`（若接口支持） | 落库 `grantStatus=1` |
| ZCZX-BTSX-API-010 | 新增 | 直接已发放 | 接口测试 | Postman | §4 补录 | 已登录 | `grantStatus=2`+合法明细 | 成功；详情为已发放 |
| ZCZX-BTSX-API-011 | 新增 | 名称非法 | 接口测试 | Postman | 1～20 | 已登录 | 名称空/21 字 | 失败；无新记录 |
| ZCZX-BTSX-API-012 | 新增 | 简介超长 | 接口测试 | Postman | ≤50 | 已登录 | introduction 51 字 | 失败 |
| ZCZX-BTSX-API-013 | 新增 | 发放状态非法 | 接口测试 | Postman | 枚举 | 已登录 | `grantStatus=0` 或 `99` | 失败 |
| ZCZX-BTSX-API-014 | 新增 | 缺明细附件 | 接口测试 | Postman | 必填 | 已登录 | 不传 detail 三件套 | 失败；提示明细类错误 |
| ZCZX-BTSX-API-015 | 新增 | 明细后缀非法 | 接口测试 | Postman | 白名单 | 已登录 | detail 指向 `.exe` 或伪造后缀 | 失败 |
| ZCZX-BTSX-API-016 | 详情 | 有效 id | 接口测试 | Postman | §5.5 | 已登录 | `GET .../subsidyMatter/{id}` | 含名称、状态、明细名、封面及审计字段 |
| ZCZX-BTSX-API-017 | 详情 | 无效 id | 接口测试 | Postman | 异常 | 已登录 | 不存在 id | 404 或业务失败 |
| ZCZX-BTSX-API-018 | 修改 | 合法修改 | 接口测试 | Postman | §5.3 | 已登录；有记录 | `PUT` 改名称、简介 | 成功；详情已更新 |
| ZCZX-BTSX-API-019 | 修改 | 状态 申请中→已发放 | 接口测试 | Postman | §4 流转 | 记录 grantStatus=1 | `PUT` grantStatus=2 | 成功 |
| ZCZX-BTSX-API-020 | 修改 | 状态 已发放→申请中 | 接口测试 | Postman | 默认可回退 | 记录 grantStatus=2 | `PUT` grantStatus=1 | 成功（未单独约定禁止时） |
| ZCZX-BTSX-API-021 | 修改 | 清空明细拒绝 | 接口测试 | Postman | 保存约束 | 已登录 | `PUT` 去掉 detail 三件套 | 失败；原数据不变 |
| ZCZX-BTSX-API-022 | 修改 | 替换明细附件 | 接口测试 | Postman | 删旧 | 原 detail path 已知 | `PUT` 换新三件套 | 成功；旧文件不可访问（抽查） |
| ZCZX-BTSX-API-023 | 修改 | 替换封面 | 接口测试 | Postman | §5.3 | 有旧封面 | `PUT` 换新 cover | 成功；旧封面不可访问 |
| ZCZX-BTSX-API-024 | 删除 | 单条-申请中 | 接口测试 | Postman | §5.4 | 已登录；grantStatus=1 | `DELETE .../{id}` | 成功；详情 404 |
| ZCZX-BTSX-API-025 | 删除 | 单条-已发放 | 接口测试 | Postman | 默认不限制 | 已登录；grantStatus=2 | `DELETE .../{id}` | 成功（默认策略） |
| ZCZX-BTSX-API-026 | 删除 | 批量删除 | 接口测试 | Postman | 批量 | 已登录；多条 id | `DELETE id1,id2` | 均不可查 |
| ZCZX-BTSX-API-027 | 端到端 | CRUD+状态流转 | 接口测试 | Postman | §4 | 已登录 | 新增(申请中)→列表→详情→改已发放→删 | 每步成功 |
| ZCZX-BTSX-API-028 | 鉴权 | 未登录 | 接口测试 | curl | 安全 | 无 Token | `GET .../list` | 401 或统一未登录 |
| ZCZX-BTSX-API-029 | 权限 | 无写权限 | 接口测试 | Postman | 越权 | 仅 list 权限 | `POST .../subsidyMatter` | 无权限失败 |
| ZCZX-BTSX-API-030 | 响应 | 失败可读 | 接口测试 | Postman | §7 | 已登录 | 触发缺明细/名称空等 | Body 含 `code`、`msg` 且可区分 |

---

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

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

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-BTSX-UI-001 | 列表 | 默认分页排序 | UI 测试 | Playwright+Chrome | §5.2 | 已登录；数据&gt;20 | 进入「项目与补贴-补贴」 | 每页 20；创建时间新在前 |
| ZCZX-BTSX-UI-002 | 列表 | 关键字查询 | UI 测试 | Playwright+Chrome | 模糊 OR | 有样本 | 输入 keyword→查询 | 命中名称或简介 |
| ZCZX-BTSX-UI-003 | 列表 | 发放状态筛选 | UI 测试 | Playwright+Chrome | 精确 | 两种状态均有 | 选「申请中」→查询 | 状态列均为申请中 |
| ZCZX-BTSX-UI-004 | 列表 | 组合与重置 | UI 测试 | Playwright+Chrome | 恢复 | 已筛选 | keyword+状态→查询→重置 | 重置后条件清空 |
| ZCZX-BTSX-UI-005 | 列表 | 操作按钮 | UI 测试 | Playwright+Chrome | §6 | 有数据行 | 检查操作列 | 查看/编辑/删除按权限显示 |
| ZCZX-BTSX-UI-006 | 列表 | 明细文件名可点 | UI 测试 | Playwright+Chrome | §5.2 | 有附件记录 | 查看列表附件列 | 显示原始文件名；可点击（下载/预览） |
| ZCZX-BTSX-UI-007 | 新增 | 合法全字段 | UI 测试 | Playwright+Chrome | §5.1 | 已登录 | 新增→填名称、选申请中→上传 pdf→上传 jpg 封面→确定 | 成功；列表可见 |
| ZCZX-BTSX-UI-008 | 新增 | 无封面无简介 | UI 测试 | Playwright+Chrome | 选填 | 已登录 | 仅名称+状态+明细→保存 | 成功 |
| ZCZX-BTSX-UI-009 | 新增 | 默认申请中 | UI 测试 | Playwright+Chrome | §5.1 默认 | 已登录 | 打开新增弹窗不改状态 | 发放状态默认「申请中」 |
| ZCZX-BTSX-UI-010 | 新增 | 直接已发放 | UI 测试 | Playwright+Chrome | §4 补录 | 已登录 | 选「已发放」+合法明细→保存 | 列表显示已发放 |
| ZCZX-BTSX-UI-011 | 新增 | 名称空或超长 | UI 测试 | Playwright+Chrome | 1～20 | 已登录 | 名称空/21 字→提交 | 校验失败 |
| ZCZX-BTSX-UI-012 | 新增 | 未传明细附件 | UI 测试 | Playwright+Chrome | 必填 | 已登录 | 不上传明细→提交 | 提示须上传明细附件 |
| ZCZX-BTSX-UI-013 | 新增 | 明细格式非法 | UI 测试 | Playwright+Chrome | 白名单 | 准备 .exe | `setInputFiles` 上传→提交 | 拒绝或明确错误提示 |
| ZCZX-BTSX-UI-014 | 新增 | 封面格式非法 | UI 测试 | Playwright+Chrome | §5.1 | 准备 .bmp | 上传封面→提交 | 拒绝或错误提示 |
| ZCZX-BTSX-UI-015 | 新增 | 简介超长 | UI 测试 | Playwright+Chrome | ≤50 | 已登录 | 简介 51 字→提交 | 校验失败 |
| ZCZX-BTSX-UI-016 | 详情 | 字段完整 | UI 测试 | Playwright+Chrome | §5.5 | 任意记录 | 点「查看」 | 名称、简介、状态、明细下载入口、封面、审计信息齐全 |
| ZCZX-BTSX-UI-017 | 详情 | 进入编辑 | UI 测试 | Playwright+Chrome | §5.5 | 有 edit 权限 | 详情页点编辑 | 进入编辑表单且数据回显 |
| ZCZX-BTSX-UI-018 | 修改 | 编辑成功 | UI 测试 | Playwright+Chrome | §5.3 | 有记录 | 编辑→改名称→保存 | 列表/详情已更新 |
| ZCZX-BTSX-UI-019 | 修改 | 状态变更 | UI 测试 | Playwright+Chrome | 1↔2 | 申请中记录 | 改为已发放→保存 | 列表显示已发放 |
| ZCZX-BTSX-UI-020 | 修改 | 替换明细附件 | UI 测试 | Playwright+Chrome | §5.3 | 有记录 | 重新上传 pdf→保存 | 成功；详情显示新文件名 |
| ZCZX-BTSX-UI-021 | 修改 | 清空明细失败 | UI 测试 | Playwright+Chrome | 约束 | 有记录 | 移除已传明细→保存 | 校验失败 |
| ZCZX-BTSX-UI-022 | 删除 | 单条确认 | UI 测试 | Playwright+Chrome | §5.4 | 有记录 | 删除→确认 | 记录消失 |
| ZCZX-BTSX-UI-023 | 删除 | 取消删除 | UI 测试 | Playwright+Chrome | 确认框 | 有记录 | 删除→取消 | 记录仍在 |
| ZCZX-BTSX-UI-024 | 删除 | 已发放可删 | UI 测试 | Playwright+Chrome | 默认策略 | 已发放记录 | 删除→确认 | 成功删除（默认） |
| ZCZX-BTSX-UI-025 | 删除 | 批量删除 | UI 测试 | Playwright+Chrome | 批量 | 勾选多条 | 批量删除→确认 | 选中行均消失 |
| ZCZX-BTSX-UI-026 | 端到端 | CRUD 串联 | UI 集成 | Playwright+Chrome | §4 | 可新增 | 新增→查→看→改状态→删 | 全流程无报错 |
| ZCZX-BTSX-UI-027 | 权限 | 只读账号 | UI 测试 | Playwright+Chrome | §8 | 无 add/edit/remove | 登录进模块 | 无新增/编辑/删除或操作拒绝 |
| ZCZX-BTSX-UI-028 | 导出 | 导出按钮（可选） | UI 测试 | Playwright+Chrome | 技术方案 | 有 export 权限 | 点导出 | 下载 Excel 或成功提示 |

---

## Playwright 与谷歌浏览器（实施提示）

- 安装：`npm i -D @playwright/test`；`npx playwright install chromium`；本机 Chrome：`channel: 'chrome'`。  
- 登录复用：`storageState: 'auth.json'`。  
- 路由示例：`page.goto('/policy/subsidyMatter')`（以菜单组件路径为准）。  
- 上传：`page.locator('input[type=file]').first().setInputFiles('fixtures/sample.pdf')`。  
- 确认框：`page.getByRole('button', { name: /确定|确认/ }).click()`。  
- 断言：`expect(page.getByText('申请中')).toBeVisible()`。

---

## 覆盖对照

| 类别 | 单元 UT | 接口 API | 界面 UI |
| --- | --- | --- | --- |
| 正常流程 | UT-008～011、016 | API-001～010、016～020、022～023、027 | UI-001～010、016～020、022、026 |
| 异常流程 | UT-001～002、012 | API-011～015、017、021、028～030 | UI-011～015、021、023 |
| 业务约束 | UT-003～007 | API-004～005、013～015、019～021、024～025 | UI-003、009～010、012～014、019、024 |
| 附件/文件 | UT-004～007、013～015 | API-007～008、022～023 | UI-006～008、012～014、020 |
| 权限/导出 | — | API-028～029 | UI-005、027～028 |

---

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

| 需求章节 | 要点 | 主要对应用例 |
| --- | --- | --- |
| §2.1 发放状态 | 申请中/已发放、可互改 | UT-003、011；API-004～005、019～020；UI-003、009～010、019 |
| §5.1 新增 | 名称、明细必填、封面选填、默认申请中 | UT-001、004～008；API-007～015；UI-007～015 |
| §5.2 列表 | keyword OR、状态筛选、排序 | UT-016；API-001～006；UI-001～006 |
| §5.3 修改 | 全字段、明细不可空、换附件删旧 | UT-010～014；API-018～023；UI-018～021 |
| §5.4 删除 | 确认、清文件、已发放默认可删 | UT-015；API-024～026；UI-022～025 |
| §5.5 详情 | 全字段、下载入口 | API-016；UI-016～017 |
| §6～§7 | 权限、code/msg | API-028～030；UI-027 |

---

## 修订记录

| 版本 | 说明 |
| --- | --- |
| 1.0 | 初版：单元 16、接口 30、UI 28；台账 CRUD；明细必填+封面选填；Playwright+Chrome；Base `/industryPolicy/subsidyMatter` |
| 1.1 | 草稿 §6 发布/下架：见下表补充用例 |

### 补充用例（草稿 §6 发布/下架）

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-BTSX-UT-017 | 状态机 | 删除守卫 | 单元测试 | JUnit5 | 矩阵 | 无 | `canDelete(publish=0/1)` | 0→true，1→false |
| ZCZX-BTSX-API-031 | 发布 | 未发布成功 | 接口测试 | Postman | §5.6 | publish=0；明细齐全 | `POST .../publish/{id}` | publish=1 |
| ZCZX-BTSX-API-032 | 修改 | 已发布拒绝 | 接口测试 | Postman | 矩阵 | publish=1 | `PUT` | 失败 |
| ZCZX-BTSX-API-033 | 下架 | 已发布成功 | 接口测试 | Postman | §5.6 | publish=1 | `POST .../offline/{id}` | publish=0；附件仍在 |
| ZCZX-BTSX-UI-029 | 列表 | 发布下架按钮 | UI 测试 | Playwright+Chrome | 矩阵 | 两种状态 | 查看操作列 | 与宣传模块矩阵一致 |
