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

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

**通用前置（无特殊说明）**：具备本模块菜单与按钮权限的账号已登录；封面上传白名单 `jpg`/`jpeg`/`png`（≤10MB）。**执行状态**：`1` 未开始、`2` 进行中、`3` 已完成。自动推算（草稿 §1.1，`manual_complete_flag=0`）：T&lt;S→1；T=E→3；S≤T&lt;E→2；**T&gt;E→2**（超期不自动完成）。

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

---

## 一、单元测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-BTXM-UT-001 | 状态推算 | T&lt;开始日 | 单元测试 | JUnit5 | §2.2 | 无 | `resolveExecStatus(S=明天,E=后天,T=今天,flag=0)` | 返回 `1`（未开始） |
| ZCZX-BTXM-UT-002 | 状态推算 | 进行中区间 | 单元测试 | JUnit5 | §2.2 | 无 | S=昨天，E=明天，T=今天 | 返回 `2`（进行中） |
| ZCZX-BTXM-UT-003 | 状态推算 | T=预计完成日 | 单元测试 | JUnit5 | §1.1 | 无 | S=上月，E=今天，T=今天 | 返回 `3`（已完成） |
| ZCZX-BTXM-UT-003A | 状态推算 | T&gt;预计完成日 | 单元测试 | JUnit5 | §2.2 超期 | 无 | S=上月，E=昨天，T=今天 | 返回 `2`（进行中），**非** `3` |
| ZCZX-BTXM-UT-004 | 状态推算 | 手工锁定不降级 | 单元测试 | JUnit5 | manual_flag=1 | flag=1，日期改回进行中区间 | 调用推算 | **不修改** `exec_status`（仍为 3） |
| ZCZX-BTXM-UT-005 | 状态推算 | 手工完成必填实际日 | 单元测试 | JUnit5 | §2.2 | 无 | 用户提交 execStatus=3 且无 actualEndDate | 校验失败 |
| ZCZX-BTXM-UT-006 | 参数校验 | 项目名称长度 | 单元测试 | JUnit5 | 1～20 | 无 | 空、1 字、20 字、21 字 | 空/21 失败；1～20 通过 |
| ZCZX-BTXM-UT-007 | 参数校验 | 简介字数 | 单元测试 | JUnit5 | ≤50 选填 | 无 | null/空通过；51 字失败 | 符合 §5.1 |
| ZCZX-BTXM-UT-008 | 参数校验 | 投资金额 | 单元测试 | JUnit5 | &gt;0 | 无 | 0、-1、0.01、三位小数 | 非法失败；合法通过 |
| ZCZX-BTXM-UT-009 | 参数校验 | 计划日期先后 | 单元测试 | JUnit5 | E≥S | 无 | planned&lt;start | 失败；planned=start 通过 |
| ZCZX-BTXM-UT-010 | 参数校验 | 实际完成日 | 单元测试 | JUnit5 | ≤当天 | 无 | 明天、今天 | 明天失败；今天通过 |
| ZCZX-BTXM-UT-011 | 查询校验 | 开始日区间 | 单元测试 | JUnit5 | §5.2 | 无 | start&gt;end / 合法区间 | 非法失败；合法通过 |
| ZCZX-BTXM-UT-012 | Service | 保存后推算写库 | 单元测试 | JUnit5+Mockito | 新增 | flag=0，日期落入进行中 | `insert` 前调用 resolver | 库中 `exec_status=2` |
| ZCZX-BTXM-UT-013 | Service | 手工完成写 flag | 单元测试 | JUnit5+Mockito | §3.3.1 | 提交 execStatus=3+actualEndDate | `save` | `manual_complete_flag=1`；`actual_end_date` 有值 |
| ZCZX-BTXM-UT-014 | Service | 列表查询刷新状态 | 单元测试 | JUnit5+Mockito | §1 | 库中 flag=0，日期已跨期 | `selectList` 组装 VO | 展示态为推算后状态（宜同步写库） |
| ZCZX-BTXM-UT-015 | Service | 删除清封面 | 单元测试 | JUnit5+Mockito | §5.4 | 有 cover_file_path | `deleteByIds` | Mock 验证 `deleteFile(path)` |
| ZCZX-BTXM-UT-016 | Service | 换封面删旧 | 单元测试 | JUnit5+Mockito | §5.3 | 旧 path 已知 | `update` 换新 path | 删除旧 path 文件 |
| ZCZX-BTXM-UT-017 | 附件校验 | 封面后缀 | 单元测试 | JUnit5 | 白名单 | 无 | `.jpg` 通过；`.exe` 失败 | 与需求一致 |

---

## 二、接口测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-BTXM-API-001 | 列表 | 默认分页排序 | 接口测试 | Postman/curl | §5.2 | 已登录；有多条项目 | `GET /industryPolicy/subsidyProject/list` | ≤20 条；`projectStartDate` 倒序 |
| ZCZX-BTXM-API-002 | 列表 | 关键字-名称 | 接口测试 | Postman | 模糊 | 已登录 | `keyword=` 命中名称片段 | 返回含该名称行 |
| ZCZX-BTXM-API-003 | 列表 | 关键字-简介 | 接口测试 | Postman | OR | 简介含词、名称不含 | 同上 keyword | 仍命中 |
| ZCZX-BTXM-API-004 | 列表 | 执行状态筛选 | 接口测试 | Postman | 精确 | 已登录 | `execStatus=2` | 均为进行中 |
| ZCZX-BTXM-API-005 | 列表 | 开始日闭区间 | 接口测试 | Postman | §5.2 | 已知开始日样本 | `startDate`+`endDate` | 仅区间内 |
| ZCZX-BTXM-API-006 | 列表 | 区间非法 | 接口测试 | Postman | 异常 | 已登录 | start&gt;end | 失败；可读 `msg` |
| ZCZX-BTXM-API-007 | 列表 | 查询刷新状态 | 接口测试 | Postman | §2.2 | 库中项目 S/E 使今天应为进行中且库仍为 1 | `GET list` | 返回 `execStatus=2`（或已同步写库） |
| ZCZX-BTXM-API-008 | 新增 | 合法全字段 | 接口测试 | Postman | 正常 | 已登录；已上传封面 | `POST` Body 合法 | 成功；字段落库 |
| ZCZX-BTXM-API-009 | 新增 | 自动推算-未开始 | 接口测试 | Postman | §2.2 | 已登录 | 开始日=明天，预计=下月，execStatus 随意 | 保存后 `execStatus=1` |
| ZCZX-BTXM-API-010 | 新增 | 自动推算-进行中 | 接口测试 | Postman | §2.2 | 已登录 | 开始=昨天，预计=明天 | 保存后 `execStatus=2` |
| ZCZX-BTXM-API-011 | 新增 | 自动推算-已完成 | 接口测试 | Postman | §1.1 T=E | 已登录 | 开始=上月，预计=今天 | 保存后 `execStatus=3`；`actualEndDate` 默认今天 |
| ZCZX-BTXM-API-011A | 新增 | 超期不自动完成 | 接口测试 | Postman | T&gt;E | 已登录 | 开始=上月，预计=昨天 | 保存后 `execStatus=2`（仍为进行中） |
| ZCZX-BTXM-API-012 | 新增 | 手工已完成 | 接口测试 | Postman | §2.2 | 进行中日期段 | `execStatus=3`+`actualEndDate=今天` | 成功；`manual_complete_flag=1` |
| ZCZX-BTXM-API-013 | 新增 | 已完成缺实际日 | 接口测试 | Postman | 异常 | 已登录 | `execStatus=3` 无 actualEndDate | 失败 |
| ZCZX-BTXM-API-014 | 新增 | 项目名/金额非法 | 接口测试 | Postman | 校验 | 已登录 | 名空/金额 0/预计&lt;开始 | 分别失败 |
| ZCZX-BTXM-API-015 | 详情 | 有效 id | 接口测试 | Postman | §5.5 | 已登录 | `GET .../subsidyProject/{id}` | 含状态、封面、审计字段 |
| ZCZX-BTXM-API-016 | 详情 | 无效 id | 接口测试 | Postman | 异常 | 已登录 | 不存在 id | 404 或业务失败 |
| ZCZX-BTXM-API-017 | 修改 | 合法修改 | 接口测试 | Postman | §5.3 | 已登录 | `PUT` 改投资金额 | 成功；详情已更新 |
| ZCZX-BTXM-API-018 | 修改 | 已完成锁定不降级 | 接口测试 | Postman | §2.2 | 记录 flag=1、status=3 | 改预计完成为未来，`PUT` | `execStatus` 仍为 3 |
| ZCZX-BTXM-API-019 | 修改 | 改状态清锁定 | 接口测试 | Postman | 可选规则 | flag=1 记录 | `execStatus` 改为 2 保存 | `manual_complete_flag=0`；重新可推算 |
| ZCZX-BTXM-API-020 | 修改 | 替换封面 | 接口测试 | Postman | §5.3 | 有旧封面 | `PUT` 换新 cover | 成功；旧文件不可访问（抽查） |
| ZCZX-BTXM-API-021 | 删除 | 单条删除 | 接口测试 | Postman | §5.4 | 已登录 | `DELETE .../{id}` | 成功；详情 404 |
| ZCZX-BTXM-API-022 | 删除 | 批量删除 | 接口测试 | Postman | 批量 | 已登录 | `DELETE id1,id2` | 均不可查 |
| ZCZX-BTXM-API-023 | 端到端 | CRUD+状态 | 接口测试 | Postman | §4 | 已登录 | 新增(进行中)→列表→详情→改→删 | 状态与矩阵一致 |
| ZCZX-BTXM-API-024 | 鉴权 | 未登录 | 接口测试 | curl | 安全 | 无 Token | `GET list` | 401 或统一未登录 |
| ZCZX-BTXM-API-025 | 权限 | 无写权限 | 接口测试 | Postman | 越权 | 仅 list | `POST` | 无权限失败 |
| ZCZX-BTXM-API-026 | 响应 | 失败可读 | 接口测试 | Postman | §7 | 已登录 | 触发计划日倒置等 | `code`+可区分 `msg` |

---

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

**测试工具**：**Playwright** + **Chromium**（`channel: 'chrome'`）。

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-BTXM-UI-001 | 列表 | 默认分页排序 | UI 测试 | Playwright+Chrome | §5.2 | 已登录；数据&gt;20 | 进入「项目与补贴-项目」 | 每页 20；开始日新在前 |
| ZCZX-BTXM-UI-002 | 列表 | 关键字查询 | UI 测试 | Playwright+Chrome | 模糊 | 有样本 | 输入 keyword→查询 | 命中名称或简介 |
| ZCZX-BTXM-UI-003 | 列表 | 执行状态筛选 | UI 测试 | Playwright+Chrome | 精确 | 多状态数据 | 选「进行中」→查询 | 状态列均为进行中 |
| ZCZX-BTXM-UI-004 | 列表 | 开始日范围 | UI 测试 | Playwright+Chrome | 闭区间 | 已知样本 | 选 start/end→查询 | 仅区间内 |
| ZCZX-BTXM-UI-005 | 列表 | 区间非法提示 | UI 测试 | Playwright+Chrome | 异常 | 已登录 | start&gt;end→查询 | Message 提示；不刷新错误数据 |
| ZCZX-BTXM-UI-006 | 列表 | 重置条件 | UI 测试 | Playwright+Chrome | 恢复 | 已筛选 | 重置 | 条件清空 |
| ZCZX-BTXM-UI-007 | 新增 | 合法提交含封面 | UI 测试 | Playwright+Chrome | §5.1 | 已登录 | 填必填+上传 jpg→保存 | 成功；列表可见 |
| ZCZX-BTXM-UI-008 | 新增 | 简介选填 | UI 测试 | Playwright+Chrome | 选填 | 已登录 | 简介空、无封面，其余合法→保存 | 成功 |
| ZCZX-BTXM-UI-009 | 新增 | 名称/金额非法 | UI 测试 | Playwright+Chrome | 校验 | 已登录 | 名空或金额 0→提交 | 校验失败 |
| ZCZX-BTXM-UI-010 | 新增 | 预计早于开始 | UI 测试 | Playwright+Chrome | E≥S | 已登录 | 预计&lt;开始→提交 | 校验失败 |
| ZCZX-BTXM-UI-011 | 新增 | 手工已完成 | UI 测试 | Playwright+Chrome | §2.2 | 日期段可为进行中 | 选「已完成」→须填实际完成日→保存 | 成功；详情有实际完成日 |
| ZCZX-BTXM-UI-012 | 新增 | 已完成无实际日 | UI 测试 | Playwright+Chrome | 异常 | 已登录 | 选已完成不填实际日→提交 | 校验失败 |
| ZCZX-BTXM-UI-013 | 新增 | 封面非法 | UI 测试 | Playwright+Chrome | §5.1 | 准备 .bmp | 上传→提交 | 拒绝或错误提示 |
| ZCZX-BTXM-UI-014 | 新增 | 保存后状态-进行中 | UI 集成 | Playwright+Chrome | T&lt;E | 开始=昨天预计=明天 | 保存后看列表 | 显示「进行中」 |
| ZCZX-BTXM-UI-014A | 新增 | 保存后状态-已完成 | UI 集成 | Playwright+Chrome | T=E | 开始=上月预计=今天 | 保存后看列表 | 显示「已完成」 |
| ZCZX-BTXM-UI-014B | 新增 | 超期仍为进行中 | UI 集成 | Playwright+Chrome | T&gt;E | 开始=上月预计=昨天 | 保存后看列表 | 显示「进行中」非已完成 |
| ZCZX-BTXM-UI-015 | 详情 | 字段完整 | UI 测试 | Playwright+Chrome | §5.5 | 任意记录 | 查看 | 各字段+封面+状态齐全 |
| ZCZX-BTXM-UI-016 | 修改 | 编辑成功 | UI 测试 | Playwright+Chrome | §5.3 | 有记录 | 编辑改投资金额→保存 | 列表已更新 |
| ZCZX-BTXM-UI-017 | 修改 | 替换封面 | UI 测试 | Playwright+Chrome | §5.3 | 有封面 | 换图保存 | 详情为新图 |
| ZCZX-BTXM-UI-018 | 修改 | 已完成锁定（可选） | UI 集成 | Playwright+Chrome | 不降级 | 已手工完成项目 | 改预计为未来→保存 | 状态仍为已完成 |
| ZCZX-BTXM-UI-019 | 删除 | 单条确认删除 | UI 测试 | Playwright+Chrome | §5.4 | 有记录 | 删除→确认 | 行消失 |
| ZCZX-BTXM-UI-020 | 删除 | 取消删除 | UI 测试 | Playwright+Chrome | 确认框 | 有记录 | 删除→取消 | 仍在 |
| ZCZX-BTXM-UI-021 | 删除 | 批量删除 | UI 测试 | Playwright+Chrome | 批量 | 勾选多条 | 批量删→确认 | 选中均消失 |
| ZCZX-BTXM-UI-022 | 删除 | 删后封面失效 | UI 测试 | Playwright+Chrome | 清文件 | 删前复制封面 URL | 删除后打开 URL | 不可访问 |
| ZCZX-BTXM-UI-023 | 端到端 | CRUD 串联 | UI 集成 | Playwright+Chrome | §4 | 可新增 | 新增→查→看→改→删 | 全流程通过 |
| ZCZX-BTXM-UI-024 | 权限 | 只读账号 | UI 测试 | Playwright+Chrome | §8 | 无写权限 | 登录进模块 | 无新增/编辑/删除 |
| ZCZX-BTXM-UI-025 | 表单 | 选已完成显示实际日 | UI 测试 | Playwright+Chrome | 联动 | 新增弹窗 | 执行状态选「已完成」 | 「实际完成日期」表单项必填/显示 |

---

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

- `playwright.config.ts`：`use: { channel: 'chrome', locale: 'zh-CN' }`；`storageState` 复用登录态。  
- 路由：`page.goto('/policy/subsidyProject')`（以菜单为准）。  
- 日期：准备「昨天/明天」用 `new Date()` 在脚本中格式化。  
- 状态选项：`getByRole('option', { name: /进行中|未开始|已完成/ })`。

---

## 覆盖对照

| 类别 | 单元 UT | 接口 API | 界面 UI |
| --- | --- | --- | --- |
| 正常流程 | UT-012～014 | API-001～012、015、017、021～023 | UI-001～008、014～017、019、023 |
| 异常流程 | UT-005、008～011 | API-006、013～014、016、025～026 | UI-005、009～013、020 |
| 业务约束/状态机 | UT-001～005、003A、013 | API-007、009～012、011A、018～019 | UI-011～012、014～014B、018、025 |
| 封面/删除 | UT-015～017 | API-020、021～022 | UI-007、013、017、022 |

---

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

| 需求章节 | 要点 | 主要对应用例 |
| --- | --- | --- |
| §2.2 状态推算 | T=E 完成、T&gt;E 超期、手工锁定 | UT-001～005、003、003A、012～014；API-007、009～013、011、011A、018；UI-011～012、014～014B、018、025 |
| §5.1 新增 | 字段校验、封面 | UT-006～010、017；API-008、014；UI-007～013 |
| §5.2 列表 | 关键字、状态、日期区间 | API-001～006；UI-001～006 |
| §5.3 修改 | 全字段、换封面、锁定 | UT-016；API-017～020；UI-016～018 |
| §5.4 删除 | 删封面 | UT-015；API-021～022；UI-019～022 |
| §5.5 详情 | 状态刷新展示 | API-015；UI-015 |
| §6 权限 | 四操作 | API-024～025；UI-024 |
| §7 错误 | code/msg | API-026 |

---

## 修订记录

| 版本 | 说明 |
| --- | --- |
| 1.0 | 初版：单元 17、接口 26、UI 25；含状态推算/手工锁定/封面；Playwright+Chrome；Base `/industryPolicy/subsidyProject` |
| 1.1 | 同步草稿 §1.1：已完成仅 T=E；新增 UT/API/UI 超期 T&gt;E 仍为进行中用例 |
| 1.2 | 草稿 §6 发布/下架：见下表补充用例（发布状态 0/1） |

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

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-BTXM-UT-018 | 状态机 | 编辑守卫 | 单元测试 | JUnit5 | 矩阵 | 无 | `canEdit(publish=0/1)` | 0→true，1→false |
| ZCZX-BTXM-API-027 | 发布 | 未发布成功 | 接口测试 | Postman | §5.6 | publish=0 | `POST .../publish/{id}` | publish=1；publishTime 有值 |
| ZCZX-BTXM-API-028 | 修改 | 已发布拒绝 | 接口测试 | Postman | 矩阵 | publish=1 | `PUT` | 失败；数据不变 |
| ZCZX-BTXM-API-029 | 下架 | 已发布成功 | 接口测试 | Postman | §5.6 | publish=1 | `POST .../offline/{id}` | publish=0；offlineTime 有值 |
| ZCZX-BTXM-UI-026 | 列表 | 发布下架按钮 | UI 测试 | Playwright+Chrome | 矩阵 | 两种状态各有数据 | 切换行看操作列 | 未发布有发布；已发布有下架 |
