# 网上培训课程 — 测试用例 > 依据:`网上培训课程功能需求.md`、`网上培训课程技术方案.md` > **接口 Base Path**:`/techService/onlineTrainingCourse`;鉴权与若依一致(Cookie / Token)。 **通用前置(无特殊说明)**:具备本模块权限的账号已登录(`techService:onlineTrainingCourse:list`、`techService:onlineTrainingCourse:query`)。`biz_tech_resource` 宜预置(`del_flag=0`): | 样本 | `resource_type` | `resource_name` | `course_topic` | `publish_status` | 说明 | | --- | --- | --- | --- | --- | --- | | **KC1** | 4 | 基础养殖入门 | 基础养殖 | 1 已发布 | 本模块主样本;含 mp4、`introduction` | | **KC2** | 4 | 牦牛疫病防治要点 | 疫病防治 | 1 已发布 | 用于主题精确筛选 | | **KC3** | 4 | 政策解读专题课 | 政策解读 | 1 已发布 | 含封面(可选) | | **KC-D** | 4 | 未发布草稿课 | 繁育技术 | 0 未发布 | **不应**出现在本模块列表 | | **KC-O** | 4 | 已下架旧课 | 基础养殖 | 0 且 `offline_time` 非空 | **不应**出现 | | **KC-X** | 4 | 已删课程 | 基础养殖 | 1 | `del_flag=2`,**不应**出现 | | **Z2** | 1 | 李专家 | — | 1 | 非视频课程,**不应**出现 | **源库维护(交叉验证)**:通过 `/techService/techResource` 对 KC-D 发布、对 KC1 下架、对 KC-X 逻辑删除,验证本模块纳入规则(§2.2、§7)。 **界面(UI)测试**:**Playwright** + **Chromium**(`channel: 'chrome'` 使用本机 **Google Chrome**)。 --- ## 一、单元测试用例 | 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 | | --- | --- | --- | --- | --- | --- | --- | --- | --- | | ZCZX-WSYPX-UT-001 | 工具方法 | 视频文件名解析 | 单元测试 | JUnit5 | §3.1 `videoFileName` | 无 | `path=/profile/upload/2025/a/course.mp4`;`path=null`;`path=""` | 返回 `course.mp4`;返回「已上传」或约定默认文案 | | ZCZX-WSYPX-UT-002 | 纳入规则 | 固定查询常量 | 单元测试 | JUnit5 | §2.1、§2.3 | 无 | 断言 `OnlineTrainingCourseRules` 与 `TechResourceRules` | `type=004008`、`publish=1`、`delFlag=0` 一致 | | ZCZX-WSYPX-UT-003 | Service | 列表 Vo 映射 | 单元测试 | JUnit5+Mockito | §3.1 | Mock 返回 KC1 实体行 | `selectList` | `courseTitle`=资源名;`courseIntro`=简介;`courseTopic` 一致;含 `videoFileName` | | ZCZX-WSYPX-UT-004 | Service | 详情 Vo 映射 | 单元测试 | JUnit5+Mockito | §3.2 | Mock 返回含封面、视频 URL | `selectById(KC1.id)` | 含 `videoFileUrl`、`coverFileUrl`、`createTime` | | ZCZX-WSYPX-UT-005 | Service | 详情不存在 | 单元测试 | JUnit5+Mockito | §3.2、§8 | Mapper 返回 null | `selectById(99999)` | `ServiceException`,msg 含「下线或不存在」 | | ZCZX-WSYPX-UT-006 | Service | 详情已下架 | 单元测试 | JUnit5+Mockito | §7 | Mock 对 KC-O 条件查询无行 | `selectById(KC-O.id)` | 同上异常 | | ZCZX-WSYPX-UT-007 | Service | 课程主题列表 | 单元测试 | JUnit5+Mockito | §3.3 | Mock 类别 rows | `selectCourseTopics` | 返回 `{code,name}` 列表 | | ZCZX-WSYPX-UT-008 | Service | 列表不含未发布 | 单元测试 | JUnit5+Mockito | §2.2 | Mock 仅应带 published 条件 | 调用 `selectList` | Mapper 入参或 XML 固定 `publish_status=1` | | ZCZX-WSYPX-UT-009 | Mapper | 列表 WHERE 固定条件 | 单元测试 | JUnit5 | §3.4 | 读 XML | 检查 `selectList` | `resource_type='004008'`;`publish_status=1`;`del_flag='0'` | | ZCZX-WSYPX-UT-010 | Mapper | 标题模糊与主题精确 | 单元测试 | JUnit5 | §3.1 | 读 XML | 检查动态 SQL | `resource_name like`;`course_topic =` | | ZCZX-WSYPX-UT-011 | Mapper | 列表排序 | 单元测试 | JUnit5 | §3.1 | 读 XML | 检查 `order by` | `create_time desc, id desc` | | ZCZX-WSYPX-UT-012 | Mapper | 列表不含视频 URL | 单元测试 | JUnit5 | §3.1 | 读 `selectList` 列 | 对比 `selectById` | 列表 SQL 无 `video_file_url`/`cover_*`(或 Vo 不映射) | | ZCZX-WSYPX-UT-013 | Mapper | 主题 DISTINCT | 单元测试 | JUnit5 | §3.3 | 读 XML | `selectDistinctCourseTopics` | 含 §2.1 三条件;`course_topic` 非空 | --- ## 二、接口测试用例 | 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 | | --- | --- | --- | --- | --- | --- | --- | --- | --- | | ZCZX-WSYPX-API-001 | 列表 | 默认分页排序 | 接口测试 | Postman | §5.1.2、§3.1 | 有 KC1/KC2 | `GET .../list` | `code=200`;`rows`≤20;仅 `004008` 已发布;`createTime` 新在前 | | ZCZX-WSYPX-API-002 | 列表 | 课程标题模糊 | 接口测试 | Postman | §2.4 | 有 KC1 | `courseTitle=养殖` | 含 KC1;不含 KC2 | | ZCZX-WSYPX-API-003 | 列表 | 课程主题精确 | 接口测试 | Postman | §2.4 | 有 KC2 | `courseTopic=005002` | 仅 KC2;`courseTopic=005` 无结果 | | ZCZX-WSYPX-API-004 | 列表 | 标题+主题组合 | 接口测试 | Postman | §5.1.1 | 有 KC1 | `courseTitle=基础`+`courseTopic=005001` | 仅 KC1 | | ZCZX-WSYPX-API-005 | 列表 | 筛选无结果 | 接口测试 | Postman | §8 | 已登录 | `courseTitle=不存在xyz` | `rows=[]`;`total=0` | | ZCZX-WSYPX-API-006 | 列表 | 不含未发布 | 接口测试 | Postman | §7 | 有 KC-D | `GET list` | 无 KC-D | | ZCZX-WSYPX-API-007 | 列表 | 不含已下架 | 接口测试 | Postman | §7 | 有 KC-O | `GET list` | 无 KC-O | | ZCZX-WSYPX-API-008 | 列表 | 不含已删除 | 接口测试 | Postman | §7 | 有 KC-X | `GET list` | 无 KC-X | | ZCZX-WSYPX-API-009 | 列表 | 不含非视频类型 | 接口测试 | Postman | §7 | 有 Z2 | `GET list` | 无 Z2 | | ZCZX-WSYPX-API-010 | 列表 | 分页参数 | 接口测试 | Postman | §3.1 | ≥21 条已发布课程 | `pageSize=10&pageNum=2` | 第 2 页 10 条;`total` 正确 | | ZCZX-WSYPX-API-011 | 列表 | 行字段结构 | 接口测试 | Postman | §3.1 | 有 KC1 | `GET list` 取 KC1 行 | 含 `id,courseTitle,courseIntro,courseTopic,videoFileName`;无 `videoFileUrl` | | ZCZX-WSYPX-API-012 | 详情 | 有效 id | 接口测试 | Postman | §5.2.2、§3.2 | 有 KC1 | `GET /{KC1.id}` | `code=200`;含简介全文、`videoFileUrl`、`courseTopic` | | ZCZX-WSYPX-API-013 | 详情 | 含封面样本 | 接口测试 | Postman | §5.2.2 | 有 KC3 | `GET /{KC3.id}` | 含 `coverFileUrl`(或路径) | | ZCZX-WSYPX-API-014 | 详情 | 无封面样本 | 接口测试 | Postman | §5.2.2 | KC1 无封面 | `GET /{KC1.id}` | `coverFileUrl` 空或 null | | ZCZX-WSYPX-API-015 | 详情 | 未发布 id | 接口测试 | Postman | §5.2.3 | 有 KC-D | `GET /{KC-D.id}` | 失败;`msg` 含「下线或不存在」 | | ZCZX-WSYPX-API-016 | 详情 | 已下架 id | 接口测试 | Postman | §5.2.3 | 有 KC-O | `GET /{KC-O.id}` | 同上 | | ZCZX-WSYPX-API-017 | 详情 | 已删除 id | 接口测试 | Postman | §5.2.3 | 有 KC-X | `GET /{KC-X.id}` | 同上 | | ZCZX-WSYPX-API-018 | 详情 | 不存在 id | 接口测试 | Postman | 异常 | 已登录 | `GET /999999999` | 失败;可读 `msg` | | ZCZX-WSYPX-API-019 | 详情 | 非视频已发布 id | 接口测试 | Postman | §7 | 有 Z2 | `GET /{Z2.id}` | 失败(无纳入行) | | ZCZX-WSYPX-API-020 | 主题下拉 | courseTopics | 接口测试 | Postman | §3.3 | 有类别数据 | `GET .../courseTopics` | `data` 为 `{code,name}` 数组;含 `005001`/`基础养殖` 等 | | ZCZX-WSYPX-API-021 | 交叉 | 源库发布后可见 | 接口测试 | Postman | §10 | KC-D 未发布 | `techResource` 发布 KC-D→本模块 `list` | 列表出现;`GET detail` 成功 | | ZCZX-WSYPX-API-022 | 交叉 | 源库下架后不可见 | 接口测试 | Postman | §10 | KC1 已发布 | `techResource` 下架 KC1→本模块 `list`+`detail` | 列表无 KC1;详情失败 | | ZCZX-WSYPX-API-023 | 写接口 | 无 POST 新增 | 接口测试 | Postman | §3、§3.2 | 已登录 | `POST .../onlineTrainingCourse` | 404 或 405;或权限拒绝 | | ZCZX-WSYPX-API-024 | 写接口 | 无 PUT/DELETE | 接口测试 | Postman | 只读 | 已登录 | `PUT`、`DELETE /{id}` | 404/405 或权限拒绝 | | ZCZX-WSYPX-API-025 | 鉴权 | 未登录 | 接口测试 | curl | 安全 | 无 Token | `GET list` | 401 或统一未登录 | | ZCZX-WSYPX-API-026 | 权限 | 无 list 权限 | 接口测试 | Postman | §6 | 仅 query 权 | `GET list` | 403 或业务无权限 | | ZCZX-WSYPX-API-027 | 权限 | 无 query 权限 | 接口测试 | Postman | §6 | 仅 list 权 | `GET /{KC1.id}` | 403 或业务无权限 | --- ## 三、界面测试用例(UI) **测试工具**:**Playwright** + **Chromium**(`channel: 'chrome'` 使用本机 **Google Chrome**)。 | 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 | | --- | --- | --- | --- | --- | --- | --- | --- | --- | | ZCZX-WSYPX-UI-001 | 列表 | 默认展示列 | UI 测试 | Playwright+Chrome | §5.1.3 | 已登录;有 KC1/KC2 | 进入「网上培训课程」 | 列含课程标题、简介、主题、视频文件、操作;有 KC1/KC2 | | ZCZX-WSYPX-UI-002 | 列表 | 课程主题筛选 | UI 测试 | Playwright+Chrome | §5.1.1 | 有 KC2 | 下拉选「疫病防治」(005002)→搜索 | 仅 KC2;选「繁育技术」且无 KC 时为空 | | ZCZX-WSYPX-UI-003 | 列表 | 课程标题筛选 | UI 测试 | Playwright+Chrome | §5.1.1 | 有 KC1 | 输入「养殖」→搜索 | 含 KC1;输入「不存在xyz」无数据 | | ZCZX-WSYPX-UI-004 | 列表 | 重置 | UI 测试 | Playwright+Chrome | §5.1.1 | 已筛选 | 搜索→点「重置」 | 条件清空;恢复默认列表 | | ZCZX-WSYPX-UI-005 | 列表 | 无维护按钮 | UI 测试 | Playwright+Chrome | §5.1.4、§3.2 | 已登录 | 查看工具栏与行操作 | 无新增/编辑/删除/发布/下架;仅有「查看」 | | ZCZX-WSYPX-UI-006 | 列表 | 未发布不可见 | UI 测试 | Playwright+Chrome | §7 | 仅有 KC-D 未发布、无已发布 | 打开列表 | 空状态「暂无…」或等价;无 KC-D | | ZCZX-WSYPX-UI-007 | 列表 | 视频列不内嵌播放 | UI 测试 | Playwright+Chrome | §5.1.3 | 有数据 | 查看列表视频列 | 为文件名/文案;无 `