# 科技项目与活动 — 测试用例 > 依据:`科技项目与活动功能需求.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 |