# 实战业务培训 — 测试用例 > 依据:`实战业务培训功能需求.md`、`实战业务培训技术方案.md` > **接口 Base Path(示例)**:`/techService/practicalTraining`;鉴权与若依一致(Cookie / Token)。 **通用前置(无特殊说明)**:具备本模块全套按钮权限的账号已登录。时间链合法样本(用于新增/修改/发布): | 字段 | 示例值 | | --- | --- | | `registrationStartTime` | `2025-08-01 08:00:00` | | `registrationEndTime` | `2025-08-15 18:00:00` | | `trainingTime` | `2025-08-25 09:00:00` | **库内宜预置**(`del_flag=0`):**T1** 未发布主题「牧业实战一期」;**T2** 已发布且报名未开始(`registration_start` 为未来);**T3** 已发布、报名期内、`actual_enrolled_count=5`、`planned_head_count=20`;**T4** 已发布、报名期内、人数已满(`actual=20`);**T5** 已发布、报名已截止(`registration_end` 为过去)。 **合法新增 Body(驼峰)**:`trainingTopic=牧业实战测试`,`plannedHeadCount=30`,`trainingIntro=简介文本`,`trainingLocation=县培训中心`,其余时间取上表。 **界面(UI)测试**:**Playwright** + **Chromium**(`channel: 'chrome'` 使用本机 **Google Chrome**)。 --- ## 一、单元测试用例 | 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 | | --- | --- | --- | --- | --- | --- | --- | --- | --- | | ZCZX-SZYWPX-UT-001 | 参数校验 | 时间链 | 单元测试 | JUnit5 | §3.5 | 无 | 开始≥截止、截止≥培训、合法链 | 前两种失败;`08-01<08-15<08-25` 通过 | | ZCZX-SZYWPX-UT-002 | 参数校验 | 培训主题 | 单元测试 | JUnit5 | 1~20 字 | 无 | 空、21 字、10 字 | 空/超长失败;合法通过 | | ZCZX-SZYWPX-UT-003 | 参数校验 | 培训简介 trim | 单元测试 | JUnit5 | §3.3.1 | 无 | 仅空白、501 字、合法 | 空白/超长失败;通过 | | ZCZX-SZYWPX-UT-004 | 参数校验 | 计划人数 | 单元测试 | JUnit5 | ≥1 整数 | 无 | 0、-1、1.5、30 | 非法失败;正整数通过 | | ZCZX-SZYWPX-UT-005 | 参数校验 | 培训地点 | 单元测试 | JUnit5 | 1~200 字 | 无 | 空、201 字 | 失败/通过 | | ZCZX-SZYWPX-UT-006 | 列表查询 | 培训日期区间 | 单元测试 | JUnit5 | §3.1.1 | 无 | `startDate>endDate`;合法闭区间 | 颠倒失败;通过 | | ZCZX-SZYWPX-UT-007 | 报名状态 | 未发布 | 单元测试 | JUnit5 | §3.4 | `publish_status=0` | `resolve(row, now)` | `enrollStatus=1`,名称「未开始」 | | ZCZX-SZYWPX-UT-008 | 报名状态 | 未开始/已截止 | 单元测试 | JUnit5 | §3.4 | 已发布 | `now` 早于开始;`now` 晚于截止 | 均为 `1` 或 `4` 与文档一致 | | ZCZX-SZYWPX-UT-009 | 报名状态 | 报名中/已报满 | 单元测试 | JUnit5 | §3.4 | 已发布、在报名期内 | `actual=5,plan=20`;`actual=20,plan=20` | `006002`/`enrollStatus=2`;`006003`/`3` | | ZCZX-SZYWPX-UT-009a | 培训状态 | 截止边界 | 单元测试 | JUnit5 | `now>=regEnd` | 已发布 | `now=registrationEndTime` | `006004` 已截止 | | ZCZX-SZYWPX-UT-019 | 小程序报名 | 报名/取消 | 单元测试 | JUnit5+Mockito | 成员表 | Mock Mapper | `enroll`/`cancelEnroll` | 回写 `actual_enrolled_count` 与 `training_status` | | ZCZX-SZYWPX-UT-010 | 修改未发布 | training_status 回填 | 单元测试 | JUnit5+Mockito | §2.3 | 未发布 T1;Body 不传 `trainingStatus` | `updateBizPracticalTraining` | 入库 `training_status=006001`;非 null | | ZCZX-SZYWPX-UT-010a | 发布约束 | 已发布不可改 | 单元测试 | JUnit5+Mockito | §3.5 | `publish_status=1` | `validateForUpdate` | 失败 | | ZCZX-SZYWPX-UT-011 | 下架约束 | 报名开始前可下架 | 单元测试 | JUnit5 | §3.5 | 已发布;`now endDate` | 失败 | | ZCZX-SZYWPX-API-005 | 列表 | 不含已删除 | 接口测试 | Postman | 逻辑删除 | 已知 id 已删 | `GET list` | 无该 id | | ZCZX-SZYWPX-API-006 | 新增 | 仅保存未发布 | 接口测试 | Postman | §5.1.2 | 已登录 | `POST` 合法 Body;`saveAndPublish=false` | 成功;`publishStatus=0` | | ZCZX-SZYWPX-API-007 | 新增 | 保存并发布 | 接口测试 | Postman | §5.1.2 | 已登录 | `POST`+`saveAndPublish=true` | 成功;`publishStatus=1`;有 `publishTime` | | ZCZX-SZYWPX-API-008 | 新增 | 时间链非法 | 接口测试 | Postman | §3.5 | 已登录 | `registrationEndTime≥trainingTime` | 失败 | | ZCZX-SZYWPX-API-009 | 新增 | 计划人数非法 | 接口测试 | Postman | §3.5 | 已登录 | `plannedHeadCount=0` | 失败 | | ZCZX-SZYWPX-API-010 | 新增 | 主题超长 | 接口测试 | Postman | 1~20 | 已登录 | 21 字主题 | 失败 | | ZCZX-SZYWPX-API-011 | 详情 | 有效 id | 接口测试 | Postman | §5.5 | 已登录 | `GET /{id}` | 全字段+`enrollStatus`+`canOffline` | | ZCZX-SZYWPX-API-012 | 详情 | 无效 id | 接口测试 | Postman | 异常 | 已登录 | 不存在/已删 id | 失败或空 `data` | | ZCZX-SZYWPX-API-013 | 修改 | 未发布全字段 | 接口测试 | Postman | §5.3 | T1 未发布 | `PUT` 改地点/人数/时间链 | 成功 | | ZCZX-SZYWPX-API-014 | 修改 | 已发布禁止 | 接口测试 | Postman | §5.3 | T3 已发布 | `PUT` | 失败;库不变 | | ZCZX-SZYWPX-API-015 | 发布 | 列表发布 | 接口测试 | Postman | §5.6 | T1 未发布 | `POST .../publish/{id}` | `publishStatus=1` | | ZCZX-SZYWPX-API-016 | 发布 | 重复发布 | 接口测试 | Postman | §5.6 | 已发布 id | 再次 `publish` | 失败 | | ZCZX-SZYWPX-API-017 | 下架 | 报名前可下架 | 接口测试 | Postman | §5.6 | T2 已发布、报名未开始 | `POST .../offline/{id}` | `publishStatus=0`;`canOffline` 曾为 true | | ZCZX-SZYWPX-API-018 | 下架 | 报名开始后禁止 | 接口测试 | Postman | §5.6 | T3 报名期内 | `POST .../offline/{id}` | 失败;提示报名已开始 | | ZCZX-SZYWPX-API-019 | 删除 | 未发布删除 | 接口测试 | Postman | §5.4 | T1 | `DELETE /{id}` | 成功;列表无 | | ZCZX-SZYWPX-API-020 | 删除 | 已发布禁止 | 接口测试 | Postman | §5.4 | T3 | `DELETE` | 失败 | | ZCZX-SZYWPX-API-021 | 报名状态 | 报名中样本 | 接口测试 | Postman | §3.4 | T3 | `GET list` 找 T3 | `enrollStatus=2` | | ZCZX-SZYWPX-API-022 | 报名状态 | 已报满样本 | 接口测试 | Postman | §3.4 | T4 | `GET list` 找 T4 | `enrollStatus=3` | | ZCZX-SZYWPX-API-023 | 报名状态 | 已截止样本 | 接口测试 | Postman | §3.4 | T5 | `GET list` 找 T5 | `enrollStatus=4` | | ZCZX-SZYWPX-API-024 | 端到端 | 增-发-下-改-发 | 接口测试 | Postman | §4 | 已登录 | `POST`保存→`publish`→`offline`→`PUT`→`publish` | 各步符合状态机 | | ZCZX-SZYWPX-API-025 | 鉴权 | 未登录 | 接口测试 | curl | 安全 | 无 Token | `GET list` | 401 或统一未登录 | | ZCZX-SZYWPX-API-026 | 权限 | 无发布权限 | 接口测试 | Postman | §6 | 无 publish | `POST .../publish/1` | 无权限失败 | | ZCZX-SZYWPX-API-027 | 权限 | 无下架权限 | 接口测试 | Postman | §6 | 无 offline | `POST .../offline/2` | 无权限失败 | | ZCZX-SZYWPX-API-028 | 响应 | 失败可读 | 接口测试 | Postman | §8 | 已登录 | 触发时间链、已发布修改、下架被拒 | `msg` 可区分 | | ZCZX-SZYWPX-API-028 | 小程序 | 我的报名列表 | 接口测试 | Postman | 用户有有效报名 | `GET /app/practicalTraining/myEnroll/list` | 分页;仅本人已报名培训 | | ZCZX-SZYWPX-API-028a | 小程序 | 我的报名详情 | 接口测试 | Postman | 已报名 T3 | `GET /app/practicalTraining/myEnroll/{id}` | 全字段;`canCancel` 与状态一致 | | ZCZX-SZYWPX-API-029 | 小程序 | 立即报名 | 接口测试 | Postman | 报名中 | T3;未报名用户 | `POST /app/practicalTraining/{id}/enroll` | 成功;`actual_enrolled_count+1` | | ZCZX-SZYWPX-API-030 | 小程序 | 取消报名 | 接口测试 | Postman | 报名中 | 已报名用户 | `POST .../cancelEnroll` | 成功;人数减 1 | | ZCZX-SZYWPX-API-031 | 小程序 | 非报名中报名 | 接口测试 | Postman | T4 已满或 T5 截止 | 已登录 | `POST .../enroll` | 失败 | | ZCZX-SZYWPX-API-032 | 小程序 | 已截止取消 | 接口测试 | Postman | T5 已截止且已报名 | `POST .../cancelEnroll` | 失败;提示已截止 | --- ## 三、界面测试用例(UI) **测试工具**:**Playwright** + **Chromium**(`channel: 'chrome'` 使用本机 **Google Chrome**)。 | 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 | | --- | --- | --- | --- | --- | --- | --- | --- | --- | | ZCZX-SZYWPX-UI-001 | 列表 | 默认展示 | UI 测试 | Playwright+Chrome | §5.2.3 | 已登录;有数据 | 进入「实战业务培训」 | 含主题、培训时间、计划人数、地点、报名起止、发布日期、报名状态、实际报名、操作 | | ZCZX-SZYWPX-UI-002 | 列表 | 主题精确筛选 | UI 测试 | Playwright+Chrome | §2.5 | 有 T1 | 输入全名「牧业实战一期」→搜索 | 仅 T1;输入片段无结果 | | ZCZX-SZYWPX-UI-003 | 列表 | 培训日期筛选 | UI 测试 | Playwright+Chrome | §2.5 | 有样本 | 选培训日期区间→搜索 | 结果在闭区间内 | | ZCZX-SZYWPX-UI-004 | 列表 | 重置 | UI 测试 | Playwright+Chrome | §5.2 | 已筛选 | 搜索→重置 | 条件清空 | | ZCZX-SZYWPX-UI-005 | 列表 | 未发布操作列 | UI 测试 | Playwright+Chrome | §6 | 有未发布行 | 查看操作按钮 | 显示查看、发布、编辑、删除 | | ZCZX-SZYWPX-UI-006 | 列表 | 已发布操作列 | UI 测试 | Playwright+Chrome | §6 | 有已发布且报名未开始行 | 查看操作 | 显示查看、下架;无编辑删除 | | ZCZX-SZYWPX-UI-007 | 列表 | 报名开始后无下架 | UI 测试 | Playwright+Chrome | §5.6 | 报名已开始行 | 查看操作 | 无下架或禁用并提示 | | ZCZX-SZYWPX-UI-008 | 新增 | 仅保存 | UI 测试 | Playwright+Chrome | §5.1.2 | 已登录 | 新增→填必填→点「确定」 | 成功;列表未发布;无发布日期 | | ZCZX-SZYWPX-UI-009 | 新增 | 保存并发布 | UI 测试 | Playwright+Chrome | §5.1.2 | 已登录 | 新增→填必填→点「发布」 | 成功;列表已发布;有发布日期 | | ZCZX-SZYWPX-UI-010 | 新增 | 培训时间默认 | UI 测试 | Playwright+Chrome | §5.1.1 | 打开新增 | 查看培训时间控件 | 默认当前时刻 | | ZCZX-SZYWPX-UI-011 | 新增 | 时间链校验 | UI 测试 | Playwright+Chrome | §5.1.3 | 新增弹窗 | 报名截止≥培训时间→保存 | 校验失败 | | ZCZX-SZYWPX-UI-012 | 新增 | 主题 20 字限制 | UI 测试 | Playwright+Chrome | §5.1.1 | 新增 | 输入超 20 字 | 无法输入或保存失败 | | ZCZX-SZYWPX-UI-013 | 新增 | 封面上传 | UI 测试 | Playwright+Chrome | §5.1.1 | 有上传组件 | 上传 jpg≤10MB | 成功预览;超大/非图失败 | | ZCZX-SZYWPX-UI-014 | 详情 | 只读完整 | UI 测试 | Playwright+Chrome | §5.5 | 任意行 | 点「查看」 | 字段只读;含报名状态 | | ZCZX-SZYWPX-UI-015 | 编辑 | 未发布修改 | UI 测试 | Playwright+Chrome | §5.3 | 未发布行 | 编辑→改地点→保存 | 列表已更新 | | ZCZX-SZYWPX-UI-016 | 编辑 | 已发布不可进 | UI 测试 | Playwright+Chrome | §5.3 | 已发布行 | 尝试编辑 | 无编辑入口或拒绝 | | ZCZX-SZYWPX-UI-017 | 发布 | 行内发布 | UI 测试 | Playwright+Chrome | §5.6 | 未发布行 | 点「发布」→确认 | 变已发布;操作列变化 | | ZCZX-SZYWPX-UI-018 | 下架 | 报名前下架 | UI 测试 | Playwright+Chrome | §5.6 | 已发布、报名未开始 | 点「下架」→确认 | 变未发布;可再编辑 | | ZCZX-SZYWPX-UI-019 | 下架 | 报名开始后 | UI 测试 | Playwright+Chrome | §5.6 | 报名已开始 | 无下架或点击提示 | 与 API-018 一致 | | ZCZX-SZYWPX-UI-020 | 删除 | 确认删除 | UI 测试 | Playwright+Chrome | §5.4 | 未发布行 | 删除→确认 | 行消失 | | ZCZX-SZYWPX-UI-021 | 删除 | 取消删除 | UI 测试 | Playwright+Chrome | §5.4 | 未发布行 | 删除→取消 | 行仍在 | | ZCZX-SZYWPX-UI-022 | 报名状态 | 标签展示 | UI 测试 | Playwright+Chrome | §2.3 | 含 T3/T4/T5 | 查看列表报名状态列 | 分别见报名中/已报满/已截止(或对应样本) | | ZCZX-SZYWPX-UI-023 | 端到端 | 全流程 | UI 集成 | Playwright+Chrome | §4 | 权限齐备 | 新增保存→发布→查看→下架→编辑→再发布→删除 | 无报错;状态与按钮符合矩阵 | | ZCZX-SZYWPX-UI-024 | 权限 | 只读角色 | UI 测试 | Playwright+Chrome | §6 | 无写权限 | 进入模块 | 无新增/编辑/删除/发布/下架 | | ZCZX-SZYWPX-UI-025 | 列表 | 日期区间非法 | UI 测试 | Playwright+Chrome | §8 | 已登录 | 培训日期起晚于止→搜索 | 提示;不查或空 | --- ## Playwright 与谷歌浏览器(实施提示) - 安装:`npm i -D @playwright/test`;`npx playwright install chrome`。 - 配置:`use: { channel: 'chrome', locale: 'zh-CN', baseURL: 'http://localhost:80' }`;`storageState` 复用登录态。 - 路由:`page.goto('/techService/practicalTraining')`(以菜单 `component` 为准)。 - 新增:`page.getByRole('button', { name: '新增' })`;弹窗内 `page.getByLabel('培训主题').fill('…')`;`page.getByRole('button', { name: '发布' })` / `{ name: '确定' }`。 - 日期:`type="daterange"` 的培训日期、datetime 的报名/培训时间按项目选择器定位。 - 下架:断言报名已开始行 `getByRole('button', { name: '下架' })` 不可见或 disabled。 --- ## 覆盖对照 | 类别 | 单元 UT | 接口 API | 界面 UI | | --- | --- | --- | --- | | 正常流程 | UT-013~016、018 | API-001~007、011、013、015、017、021~024 | UI-001~010、014~018、023 | | 异常流程 | UT-001~006、010、012 | API-004、008~010、012、014、016、018~020 | UI-011~013、019~021、025 | | 业务约束 | UT-001~005、010~012 | API-002、008~010、014、016~018 | UI-002、005~007、012、016、019 | | 时间链 | UT-001 | API-008 | UI-011 | | 报名状态 | UT-007~009 | API-021~023 | UI-022 | | 发布/下架 | UT-010~016 | API-006~007、015~018 | UI-008~009、017~019 | | 权限/鉴权 | — | API-025~027 | UI-024 | --- ## 功能需求追溯(自查) | 需求章节 | 要点 | 主要对应用例 | | --- | --- | --- | | §5.1 新增 | 字段、默认时间、确定/发布 | UT-001~005、013~014;API-006~010;UI-008~013 | | §5.2 列表 | 精确主题、日期区间、列展示 | API-001~004;UI-001~004、022 | | §5.3 修改 | 仅未发布 | UT-010;API-013~014;UI-015~016 | | §5.4 删除 | 逻辑删除 | UT-017;API-019~020;UI-020~021 | | §5.5 查看 | 只读 | API-011;UI-014 | | §5.6 发布/下架 | 下架前置 | UT-011~012、016;API-015~018;UI-017~019 | | §2.3 报名状态 | 四档计算 | UT-007~009;API-021~023;UI-022 | | §6 权限 | 按钮级 | API-025~027;UI-024 | --- ## 修订记录 | 版本 | 说明 | | --- | --- | | 1.0 | 初版:单元 18、接口 28、UI 25;覆盖 CRUD、发布下架、报名状态、时间链;Playwright+Chrome;编号前缀 **ZCZX-SZYWPX** | | 1.1 | 增补 UT-010:修改未发布时 `training_status` 非空回填 |