依据:
网上培训课程功能需求.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 类别 children + DISTINCT | selectCourseTopics |
去重;含 005001 等编码及库内 DISTINCT |
| 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 | 有 KC1/KC2 | GET .../courseTopics |
data 为编码数组;含 005001、005002;无空串 |
| 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 或业务无权限 |
测试工具: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 | 有数据 | 查看列表视频列 | 为文件名/文案;无 <video> 播放器 |
| ZCZX-WSYPX-UI-008 | 详情 | 查看只读全字段 | UI 测试 | Playwright+Chrome | §5.2.2 | 有 KC1 | 点「查看」 | 弹窗/页展示标题、简介全文、主题、视频可播、创建时间;无保存按钮 |
| ZCZX-WSYPX-UI-009 | 详情 | 封面展示 | UI 测试 | Playwright+Chrome | §5.2.2 | 有 KC3 含封面 | 查看 KC3 | 封面预览可见 |
| ZCZX-WSYPX-UI-010 | 详情 | 无封面占位 | UI 测试 | Playwright+Chrome | §5.2.2 | KC1 无封面 | 查看 KC1 | 封面区「—」或占位 |
| ZCZX-WSYPX-UI-011 | 详情 | 关闭返回列表 | UI 测试 | Playwright+Chrome | §4.1 | 已打开详情 | 关闭/返回 | 回到列表;筛选条件保持 |
| ZCZX-WSYPX-UI-012 | 详情 | 下线课程提示 | UI 测试 | Playwright+Chrome | §5.2.3 | 记下 KC1 id;源库下架 KC1 | 直接访问详情或刷新后点原「查看」 | 提示「已下线或不存在」;无有效视频 |
| ZCZX-WSYPX-UI-013 | 交叉 | 源库发布后列表出现 | UI 集成 | Playwright+Chrome | §10 | KC-D 未发布 | 视频课程库发布 KC-D→刷新本模块 | 列表出现 KC-D |
| ZCZX-WSYPX-UI-014 | 交叉 | 源库下架后列表消失 | UI 集成 | Playwright+Chrome | §10 | KC2 在列表 | 视频课程库下架 KC2→刷新 | KC2 不在列表 |
| ZCZX-WSYPX-UI-015 | 权限 | 无 list 菜单 | UI 测试 | Playwright+Chrome | §6 | 账号无 list 权 | 登录后看菜单 | 无「网上培训课程」或进页 403 |
| ZCZX-WSYPX-UI-016 | 权限 | 无 query 禁用查看 | UI 测试 | Playwright+Chrome | §6 | 仅 list 无 query | 进入列表 | 「查看」不可点或点击提示无权限 |
| ZCZX-WSYPX-UI-017 | 分页 | 翻页 | UI 测试 | Playwright+Chrome | §5.1.2 | >20 条已发布课 | 翻到第 2 页 | 数据切换;条数符合分页 |
| ZCZX-WSYPX-UI-018 | 端到端 | 查-看-筛 | UI 集成 | Playwright+Chrome | §4.1 | 有 KC1/KC2 | 主题筛选→查看 KC2→关闭→标题筛选→重置 | 全程无报错;字段与 API 一致 |
npm i -D @playwright/test;npx playwright install chrome。use: { channel: 'chrome', locale: 'zh-CN', baseURL: 'http://localhost:80' };storageState 复用登录态。page.goto('/techService/onlineTrainingCourse')(以菜单 component 为准)。page.getByLabel('课程主题') 或 placeholder「请选择」;page.getByLabel('课程标题')(若页面有标题框)。page.getByRole('button', { name: '查看' }).first().click();断言 page.getByText('课程简介')、视频区域 video 或播放器容器。expect(page.getByRole('button', { name: '新增' })).toHaveCount(0)。/techService/techResource 发布/下架后 page.reload()。| 类别 | 单元 UT | 接口 API | 界面 UI |
|---|---|---|---|
| 正常流程 | UT-003~004、007 | API-001~005、011~014、020 | UI-001~004、008~011、018 |
| 异常流程 | UT-005~006 | API-005、015~019、018 | UI-003、006、012 |
| 纳入约束 | UT-002、008~013 | API-006~009、019 | UI-006、013~014 |
| 只读约束 | — | API-023~024 | UI-005 |
| 源库交叉 | — | API-021~022 | UI-013~014 |
| 权限/鉴权 | — | API-025~027 | UI-015~016 |
| 需求章节 | 要点 | 主要对应用例 |
|---|---|---|
| §2.2 纳入规则 | 已发布视频、未删 | UT-008~009;API-006~009、021~022;UI-006、013~014 |
| §5.1 列表 | 模糊标题、精确主题、列、分页 | API-001~005、010~011;UI-001~004、017 |
| §5.2 详情 | 全字段、视频、封面、失效 | UT-004~006;API-012~018;UI-008~012 |
| §5.1.4 / §3.2 | 无维护能力 | API-023~024;UI-005 |
| §6 权限 | list / query | API-025~027;UI-015~016 |
| §10 源库衔接 | 发布/下架联动 | API-021~022;UI-013~014 |
| 版本 | 说明 |
|---|---|
| 1.0 | 初版:单元 13、接口 27、UI 18;覆盖只读 list/detail/courseTopics、纳入规则、源库交叉、权限;Playwright+Chrome;编号前缀 ZCZX-WSYPX |