# 科技项目与活动 — 测试用例

> 依据：`科技项目与活动功能需求.md`、`科技项目与活动技术方案.md`  
> **接口 Base Path（示例）**：`/innovationPlatform/techProjectGuide`；鉴权与若依一致。  
> **项目类型编码**：`002001` 高新技术 / `002002` 农业科技 / `002003` 社会发展 / `002004` 基础研究（`parentCode=002`）。**发布状态**：`0` 未发布 / `1` 已发布。

**通用前置（无特殊说明）**：具备本模块菜单与按钮权限的账号已登录。

**界面（UI）测试**：借助 **Playwright** 启动 **Chromium**（可配置 `channel: 'chrome'` 使用本机 **Google Chrome**）。

---

## 一、单元测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| KJXM-UT-001 | 参数校验 | 项目类型编码 | 单元测试 | JUnit5 | 有效资讯编码 | Mock 子集含 002001～002004 | 空、`999999` 失败；002002 通过 | 与技术方案 §2.3 一致 |
| KJXM-UT-002 | 参数校验 | 项目名称长度 | 单元测试 | JUnit5 | §5.1 | 无 | 空串、21 字、20 字 | 空/21 失败；20 通过 |
| KJXM-UT-003 | 参数校验 | 项目简介长度 | 单元测试 | JUnit5 | 1～50 字 | 无 | 0 字、51 字、50 字 | 0/51 失败；50 通过 |
| KJXM-UT-004 | 参数校验 | 申报日期关系 | 单元测试 | JUnit5 | §2.3 | 无 | 开始 2026-06-01、截止 2026-05-01 / 同天 | 前者失败；同天通过 |
| KJXM-UT-005 | 参数校验 | 手机号格式 | 单元测试 | JUnit5 | §5.1 | 无 | `13800138000`、`12345`、空 | 合法通过；非法/空失败 |
| KJXM-UT-006 | 参数校验 | 负责人长度 | 单元测试 | JUnit5 | 1～10 字 | 无 | 0 字、11 字、10 字 | 0/11 失败；10 通过 |
| KJXM-UT-007 | 附件校验 | 后缀白名单 | 单元测试 | JUnit5 | §3.2 | 无 | `a.pdf`、`a.exe` | pdf 通过；exe 失败 |
| KJXM-UT-008 | 封面校验 | 图片后缀 | 单元测试 | JUnit5 | §3.2 | 无 | `a.png`、`a.pdf` | png 通过；pdf 失败 |
| KJXM-UT-009 | 状态机 | 已发布禁止修改 | 单元测试 | JUnit5+Mockito | §3.3 | 记录 `publish_status=1` | 调用 `update` | 抛业务异常或返回失败 |
| KJXM-UT-010 | 状态机 | 已发布禁止删除 | 单元测试 | JUnit5+Mockito | §5.4 | 已发布记录 | `deleteById` | 失败 |
| KJXM-UT-011 | 状态机 | 未发布禁止下架 | 单元测试 | JUnit5+Mockito | §5.6 | `publish_status=0` | `offline` | 失败 |
| KJXM-UT-012 | 状态机 | 发布写状态与时间 | 单元测试 | JUnit5+Mockito | §5.6 | 未发布且字段合法 | `publish(id)` | `publish_status=1`；`publish_time` 非空 |
| KJXM-UT-013 | 状态机 | 下架保留发布日期 | 单元测试 | JUnit5+Mockito | 功能需求 §5.6 | 已发布有 `publish_time` | `offline(id)` | `publish_status=0`；`publish_time` 不变 |
| KJXM-UT-014 | Service | 新增 saveAndPublish | 单元测试 | JUnit5+Mockito | §3.3.1 | 合法 Body | `insert` 且 `saveAndPublish=true` | 落库已发布 |
| KJXM-UT-015 | Service | 替换附件删旧文件 | 单元测试 | JUnit5+Mockito | §3.4 | 未发布有旧 path | `update` 换新 path | 调用文件删除旧 path |
| KJXM-UT-016 | Service | 列表筛选 SQL | 单元测试 | JUnit5 | §3.1.1 | 无 | `projectName=科技`、`projectType=002002` | XML 含 `like` 与 `project_type=002002` |

---

## 二、接口测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| KJXM-API-001 | 列表 | 默认分页排序 | 接口测试 | Postman/curl | §5.2 | 已登录；含已发布/未发布 | `GET .../list` | `rows`≤20；已发布按 `publishTime` 靠前 |
| KJXM-API-002 | 列表 | 项目名称模糊 | 接口测试 | Postman | 模糊 | 含「示范」与「试点」 | `projectName=示范` | 仅名称含「示范」 |
| KJXM-API-003 | 列表 | 项目类型精确 | 接口测试 | Postman | 精确 | 含类型编码 | `projectType=002002` | 仅农业科技 |
| KJXM-API-004 | 列表 | 发布状态筛选 | 接口测试 | Postman | §5.2 | 含 0、1 各一条 | `publishStatus=0` | 仅未发布 |
| KJXM-API-005 | 新增 | 仅保存未发布 | 接口测试 | Postman | §5.1 | 已登录 | `POST` 合法全必填；不传 `saveAndPublish` | 成功；`publishStatus=0`；`publishTime` 空 |
| KJXM-API-006 | 新增 | 保存并发布 | 接口测试 | Postman | §5.1 | 已登录 | `POST` + `saveAndPublish=true` | 成功；`publishStatus=1`；`publishTime` 有值 |
| KJXM-API-007 | 新增 | 必填缺失 | 接口测试 | Postman | 必填 | 已登录 | 缺 `projectName` | 失败；`msg` 可读 |
| KJXM-API-008 | 新增 | 截止早于开始 | 接口测试 | Postman | §2.3 | 已登录 | 开始 2026-07-01、截止 2026-06-01 | 失败 |
| KJXM-API-009 | 新增 | 非法项目类型 | 接口测试 | Postman | §3.2 | 已登录 | `projectType=999999` | 失败；提示含「项目类型无效」 |
| KJXM-API-010 | 新增 | 手机号非法 | 接口测试 | Postman | §5.1 | 已登录 | `contactPhone=123` | 失败 |
| KJXM-API-011 | 详情 | 有效 id | 接口测试 | Postman | §5.5 | 已登录 | `GET .../{id}` | 含全部业务字段与 `publishStatus` |
| KJXM-API-012 | 详情 | 无效 id | 接口测试 | Postman | 异常 | 已登录 | 不存在 id | 404 或业务失败 |
| KJXM-API-013 | 修改 | 未发布合法修改 | 接口测试 | Postman | §5.3 | 未发布记录 | `PUT` 改 `projectIntro` | 成功；详情已更新 |
| KJXM-API-014 | 修改 | 已发布拒绝修改 | 接口测试 | Postman | §6 | 已发布记录 | `PUT` 改任意字段 | 失败；数据不变 |
| KJXM-API-015 | 删除 | 未发布删除 | 接口测试 | Postman | §5.4 | 未发布 id | `DELETE .../{id}` | 成功；详情不可查 |
| KJXM-API-016 | 删除 | 已发布拒绝删除 | 接口测试 | Postman | §5.4 | 已发布 id | `DELETE` | 失败 |
| KJXM-API-017 | 发布 | 未发布发布 | 接口测试 | Postman | §5.6 | 未发布 id | `POST .../publish/{id}` | `publishStatus=1` |
| KJXM-API-018 | 发布 | 已发布重复发布 | 接口测试 | Postman | 异常 | 已发布 id | 再次 `publish` | 失败 |
| KJXM-API-019 | 下架 | 已发布下架 | 接口测试 | Postman | §5.6 | 已发布 id | `POST .../offline/{id}` | `publishStatus=0` |
| KJXM-API-020 | 下架 | 未发布拒绝下架 | 接口测试 | Postman | 异常 | 未发布 id | `offline` | 失败 |
| KJXM-API-021 | 端到端 | 下架后改再发布 | 接口测试 | Postman | §4 | 已发布记录 | offline→PUT 改名称→publish | 各步成功；最终已发布且名称已改 |
| KJXM-API-022 | 端到端 | 新增至删除 | 接口测试 | Postman | 正常流 | 已登录 | 新增(未发布)→列表→详情→改→删 | 各步成功；删除后列表无 |
| KJXM-API-023 | 鉴权 | 未登录 | 接口测试 | curl | 安全 | 无 Token | `GET .../list` | 401 或统一未登录 |
| KJXM-API-024 | 权限 | 无写权限 | 接口测试 | Postman | 越权 | 仅 list 权限 | `POST`/`PUT`/`DELETE`/`publish` | 无权限失败 |
| KJXM-API-025 | 响应 | 失败可区分 | 接口测试 | Postman | §8 | 已登录 | 触发 API-008、014、016 | `code`、`msg` 可区分场景 |

---

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

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

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| KJXM-UI-001 | 列表 | 页面加载与列 | UI 测试 | Playwright+Chrome | §5.2 | 已登录；有数据 | 进入「科技项目与活动」 | 显示项目名称、类型、申报起止、发布日期、操作列 |
| KJXM-UI-002 | 列表 | 项目名称筛选 | UI 测试 | Playwright+Chrome | 模糊 | 多条数据 | 输入项目名称关键字→搜索 | 仅匹配行 |
| KJXM-UI-003 | 列表 | 项目类型筛选 | UI 测试 | Playwright+Chrome | 精确 | 多类型数据 | 选「农业科技」→搜索 | 仅类型为农业科技 |
| KJXM-UI-004 | 列表 | 重置筛选 | UI 测试 | Playwright+Chrome | 恢复 | 已筛选 | 点「重置」 | 条件清空；显示全部 |
| KJXM-UI-005 | 列表 | 未发布操作列 | UI 测试 | Playwright+Chrome | §6 | 未发布行 | 查看操作列 | 查看、发布、编辑、删除可见（按权限） |
| KJXM-UI-006 | 列表 | 已发布操作列 | UI 测试 | Playwright+Chrome | §6 | 已发布行 | 查看操作列 | 仅查看、下架；无编辑删除 |
| KJXM-UI-007 | 新增 | 仅保存未发布 | UI 测试 | Playwright+Chrome | §5.1 | 已登录 | 新增→填全必填→点「确定/保存」 | 成功；列表发布状态未发布 |
| KJXM-UI-008 | 新增 | 保存并发布 | UI 测试 | Playwright+Chrome | §5.1 | 已登录 | 新增→填全必填→点「发布」 | 成功；列表已发布且有发布日期 |
| KJXM-UI-009 | 新增 | 必填校验 | UI 测试 | Playwright+Chrome | 必填 | 已登录 | 漏填项目名称→提交 | 前端校验失败，未提交 |
| KJXM-UI-010 | 新增 | 申报截止早于开始 | UI 测试 | Playwright+Chrome | §2.3 | 已登录 | 开始晚于截止→保存 | 提示截止日期不能早于开始日期 |
| KJXM-UI-011 | 新增 | 手机号校验 | UI 测试 | Playwright+Chrome | §5.1 | 已登录 | 联系方式填非法→保存 | 提示手机号错误 |
| KJXM-UI-012 | 编辑 | 未发布修改成功 | UI 测试 | Playwright+Chrome | §5.3 | 未发布行 | 编辑→改项目简介→保存 | 列表/详情已更新 |
| KJXM-UI-013 | 编辑 | 已发布无编辑入口 | UI 测试 | Playwright+Chrome | §5.3 | 已发布行 | 查看操作列与详情 | 无「编辑」或点击无效 |
| KJXM-UI-014 | 发布 | 列表发布 | UI 测试 | Playwright+Chrome | §5.6 | 未发布行 | 点「发布」→确认 | 状态变已发布；发布日期显示 |
| KJXM-UI-015 | 下架 | 列表下架 | UI 测试 | Playwright+Chrome | §5.6 | 已发布行 | 点「下架」→确认 | 变未发布；可出现编辑删除 |
| KJXM-UI-016 | 删除 | 未发布删除确认 | UI 测试 | Playwright+Chrome | §5.4 | 未发布行 | 删除→确认 | 行消失 |
| KJXM-UI-017 | 删除 | 取消删除 | UI 测试 | Playwright+Chrome | 确认框 | 未发布行 | 删除→取消 | 行仍在 |
| KJXM-UI-018 | 删除 | 已发布不可删 | UI 测试 | Playwright+Chrome | §5.4 | 已发布行 | 尝试删除 | 无删除按钮或提示须先下架 |
| KJXM-UI-019 | 详情 | 查看只读 | UI 测试 | Playwright+Chrome | §5.5 | 任意行 | 点「查看」 | 弹窗/页展示全部字段只读 |
| KJXM-UI-020 | 上传 | 附件格式限制 | UI 测试 | Playwright+Chrome | §5.1 | 新增表单 | 上传非允许后缀 | 前端拒绝或提示格式错误 |
| KJXM-UI-021 | 端到端 | 下架后编辑再发布 | UI 测试 | Playwright+Chrome | §4 | 已发布行 | 下架→编辑改名称→保存→发布 | 全流程成功；列表显示新名称且已发布 |

---

## 四、用例与需求章节对照

| 需求章节 | 覆盖用例（示例） |
| --- | --- |
| §5.1 新增与校验 | UT-001～008；API-005～010；UI-007～011、020 |
| §5.2 列表筛选 | UT-016；API-001～004；UI-001～004 |
| §5.3 修改约束 | UT-009；API-013～014；UI-012～013 |
| §5.4 删除 | UT-010；API-015～016；UI-016～018 |
| §5.5 详情 | API-011～012；UI-019 |
| §5.6 发布/下架 | UT-011～014；API-006、017～021；UI-008、014～015、021 |
| §6 操作矩阵 | UI-005～006、013、018 |
| §8 异常提示 | API-007～010、025；UI-009～011 |
