产业政策宣传 — 测试用例
依据:产业政策宣传功能需求.md、产业政策宣传功能管理技术方案.md
接口 Base Path(示例):/policy/publicity;若含 context-path 或网关前缀须补齐。鉴权与若依一致(Cookie / Token)。
通用前置(无特殊说明):具备本模块菜单与按钮权限的账号已登录;可先调 POST /common/upload 取得政策文件/封面的 url、fileName(存储路径)、originalFilename(政策文件展示名)。政策文件白名单:pdf/md/doc/docx/xls/xlsx/ppt/pptx(≤30MB);封面:jpg/jpeg/png(≤10MB)。政策名称:1~20 字符(必填)。政策层级:1 国家级、2 省级、3 市级、4 县级。政策文件、封面:选填。
界面(UI)测试:借助 Playwright 启动 Chromium(与 Google Chrome 同源内核);可配置 channel: 'chrome' 调用本机已安装的谷歌浏览器,模拟点击、输入、文件选择与断言。
一、单元测试用例
| 用例编号 |
测试模块 |
测试项 |
测试类型 |
测试工具 |
测试目的 |
前置条件 |
测试步骤 |
预期结果 |
| ZCZX-XC-UT-001 |
状态机 |
编辑守卫 |
单元测试 |
JUnit5 |
仅未发布可改 |
无 |
调用 canEdit(publishStatus):0→true,1→false |
与需求 §6 矩阵一致 |
| ZCZX-XC-UT-002 |
状态机 |
删除守卫 |
单元测试 |
JUnit5 |
仅未发布可删 |
无 |
调用 canDelete:0→true,1→false |
与 §5.4 一致 |
| ZCZX-XC-UT-003 |
状态机 |
发布守卫 |
单元测试 |
JUnit5 |
仅未发布可发布 |
无 |
调用 canPublish:0→true,1→false |
与 §5.6 一致 |
| ZCZX-XC-UT-004 |
状态机 |
下架守卫 |
单元测试 |
JUnit5 |
仅已发布可下架 |
无 |
调用 canOffline:1→true,0→false |
与 §5.6 一致 |
| ZCZX-XC-UT-005 |
参数校验 |
政策名称长度 |
单元测试 |
JUnit5 |
1~20 字 |
无 |
空串、1 字、20 字、21 字 |
空/21 失败;1~20 通过 |
| ZCZX-XC-UT-006 |
参数校验 |
政策层级 |
单元测试 |
JUnit5 |
仅 1~4 |
无 |
policyLevel 为 1/4 通过;0、5、null 失败 |
与技术方案 §2.2 一致 |
| ZCZX-XC-UT-007 |
参数校验 |
简介/描述字数 |
单元测试 |
JUnit5 |
简介选填≤50;描述必填≤50 |
无 |
简介 null/空通过、51 字失败;描述空/51 字失败、50 字通过 |
符合 §5.1 |
| ZCZX-XC-UT-008 |
参数校验 |
出台日期 |
单元测试 |
JUnit5 |
合法且非未来 |
无 |
非法格式、明天日期、今天/过去日期 |
非法/未来失败;合法日期通过 |
| ZCZX-XC-UT-009 |
附件校验 |
政策文件后缀 |
单元测试 |
JUnit5 |
白名单 |
无 |
.pdf 通过;.exe 拒绝 |
与 §5.1 一致 |
| ZCZX-XC-UT-010 |
附件校验 |
封面后缀 |
单元测试 |
JUnit5 |
白名单 |
无 |
.jpg 通过;.bmp 拒绝 |
与 §5.1 一致 |
| ZCZX-XC-UT-011 |
附件校验 |
文件三件套一致性 |
单元测试 |
JUnit5 |
url/path/name 同有或同无 |
无 |
仅传 url 无 path;三者齐全 |
前者失败;后者通过 |
| ZCZX-XC-UT-012 |
Service |
新增初始状态 |
单元测试 |
JUnit5+Mockito |
草稿 |
合法 Body |
insert(...) |
publish_status=0;publish_time 为空 |
| ZCZX-XC-UT-013 |
Service |
更新已发布拒绝 |
单元测试 |
JUnit5+Mockito |
状态约束 |
Mock publish=1 |
update(...) |
业务异常;不写库 |
| ZCZX-XC-UT-014 |
Service |
发布成功 |
单元测试 |
JUnit5+Mockito |
上架 |
Mock publish=0 且必填齐全 |
publish(id) |
publish=1;publish_time 非空 |
| ZCZX-XC-UT-015 |
Service |
下架成功回流 |
单元测试 |
JUnit5+Mockito |
下架回流 |
Mock publish=1 |
offline(id) |
publish=0;offline_time 非空;附件字段保留 |
| ZCZX-XC-UT-016 |
Service |
未发布禁止下架 |
单元测试 |
JUnit5+Mockito |
异常 |
Mock publish=0 |
offline(id) |
业务失败;状态不变 |
| ZCZX-XC-UT-017 |
Service |
删除联动清文件 |
单元测试 |
JUnit5+Mockito |
§5.4 |
publish=0;记录含 policy/cover path |
remove(ids) |
删库记录;Mock 验证 deleteFile 对两 path 各调用 |
| ZCZX-XC-UT-018 |
Service |
替换附件删旧文件 |
单元测试 |
JUnit5+Mockito |
§5.3 |
publish=0;旧 path 已知 |
update 换新 path 成功 |
Mock 验证删除旧 policy_file_path/cover_file_path |
二、接口测试用例
| 用例编号 |
测试模块 |
测试项 |
测试类型 |
测试工具 |
测试目的 |
前置条件 |
测试步骤 |
预期结果 |
| ZCZX-XC-API-001 |
列表 |
默认分页排序 |
接口测试 |
Postman/curl |
§5.2 |
已登录;有数据 |
GET /industryPolicy/publicity/list |
rows≤20;create_time 倒序 |
| ZCZX-XC-API-002 |
列表 |
关键字-名称 |
接口测试 |
Postman |
名称模糊 |
已登录 |
keyword= 仅命中名称的词 |
返回含该名称记录 |
| ZCZX-XC-API-003 |
列表 |
关键字-简介 |
接口测试 |
Postman |
OR 关系 |
简介含词、名称不含 |
同上 keyword |
仍命中 |
| ZCZX-XC-API-004 |
列表 |
政策层级筛选 |
接口测试 |
Postman |
精确 |
已登录 |
policyLevel=2 |
均为省级 |
| ZCZX-XC-API-005 |
列表 |
发布状态筛选 |
接口测试 |
Postman |
§5.2 |
已登录 |
publishStatus=0 / 1 |
与筛选一致 |
| ZCZX-XC-API-006 |
列表 |
组合查询 |
接口测试 |
Postman |
多条件 |
已登录 |
keyword+policyLevel+publishStatus |
同时满足 |
| ZCZX-XC-API-007 |
新增 |
最小必填无附件 |
接口测试 |
Postman |
正常新增 |
已登录 |
POST /industryPolicy/publicity 仅必填、不传文件 |
code 成功;publishStatus=0 |
| ZCZX-XC-API-008 |
新增 |
含政策文件与封面 |
接口测试 |
Postman |
选填附件 |
已上传合法文件 |
POST Body 含 file 三件套与 cover |
成功;字段落库 |
| ZCZX-XC-API-009 |
新增 |
名称非法 |
接口测试 |
Postman |
1~20 |
已登录 |
名称空/21 字/缺 policyName |
失败;无新记录 |
| ZCZX-XC-API-010 |
新增 |
层级非法 |
接口测试 |
Postman |
枚举 |
已登录 |
policyLevel=0 或 99 |
失败 |
| ZCZX-XC-API-011 |
新增 |
简介/描述超长 |
接口测试 |
Postman |
≤50 |
已登录 |
introduction 或 policyDesc 51 字 |
失败 |
| ZCZX-XC-API-012 |
新增 |
未来出台日期 |
接口测试 |
Postman |
日期约束 |
已登录 |
issueDate 为明天 |
失败 |
| ZCZX-XC-API-013 |
新增 |
缺必填 policyDesc |
接口测试 |
Postman |
必填 |
已登录 |
缺 policyDesc |
失败 |
| ZCZX-XC-API-014 |
详情 |
有效 id |
接口测试 |
Postman |
§5.5 |
已登录 |
GET /industryPolicy/publicity/{id} |
含 policyFileName、publishStatus 等 |
| ZCZX-XC-API-015 |
详情 |
无效 id |
接口测试 |
Postman |
异常 |
已登录 |
不存在 id |
404 或业务失败 |
| ZCZX-XC-API-016 |
修改 |
未发布成功 |
接口测试 |
Postman |
§5.3 |
已登录;publish=0 |
PUT /industryPolicy/publicity |
成功 |
| ZCZX-XC-API-017 |
修改 |
已发布拒绝 |
接口测试 |
Postman |
矩阵 |
已登录;publish=1 |
PUT |
失败;msg 含须下架类提示;数据不变 |
| ZCZX-XC-API-018 |
修改 |
替换政策文件 |
接口测试 |
Postman |
删旧文件 |
publish=0;原 path 已知 |
PUT 换新 file 三件套 |
成功;旧文件不可访问(抽查存储) |
| ZCZX-XC-API-019 |
删除 |
未发布成功 |
接口测试 |
Postman |
§5.4 |
已登录;publish=0 |
DELETE /industryPolicy/publicity/{ids} |
成功;详情 404 |
| ZCZX-XC-API-020 |
删除 |
已发布拒绝 |
接口测试 |
Postman |
矩阵 |
已登录;publish=1 |
DELETE |
失败 |
| ZCZX-XC-API-021 |
发布 |
未发布成功 |
接口测试 |
Postman |
§5.6 |
已登录;publish=0;必填齐全 |
POST .../publish/{id} |
publish=1;publishTime 有值 |
| ZCZX-XC-API-022 |
发布 |
已发布重复 |
接口测试 |
Postman |
异常 |
已登录;publish=1 |
POST .../publish/{id} |
失败 |
| ZCZX-XC-API-023 |
下架 |
已发布成功 |
接口测试 |
Postman |
§5.6 |
已登录;publish=1 |
POST .../offline/{id} |
publish=0;offlineTime 有值;附件仍在 |
| ZCZX-XC-API-024 |
下架 |
未发布拒绝 |
接口测试 |
Postman |
约束 |
已登录;publish=0 |
POST .../offline/{id} |
失败 |
| ZCZX-XC-API-025 |
端到端 |
全生命周期 |
接口测试 |
Postman |
§4 流程 |
已登录 |
新增→发布→下架→修改→再发布→下架→删除 |
每步状态与矩阵一致;同 id 贯穿 |
| ZCZX-XC-API-026 |
鉴权 |
未登录 |
接口测试 |
curl |
安全 |
无 Token |
GET .../list |
401 或统一未登录响应 |
| ZCZX-XC-API-027 |
权限 |
无写权限 |
接口测试 |
Postman |
越权 |
仅 list 权限账号 |
POST .../publicity |
无权限失败 |
| ZCZX-XC-API-028 |
响应 |
失败可读 |
接口测试 |
Postman |
§7 |
已登录 |
触发名称空串等校验 |
Body 含 code、msg;msg 可区分错误类型 |
| ZCZX-XC-API-029 |
上传 |
政策文件超限(可选) |
接口测试 |
Postman |
§5.1 |
环境允许略超 30MB |
POST /common/upload 或提交触发校验 |
明确大小/格式提示;业务表无脏数据 |
三、界面测试用例(UI)
测试工具:Playwright + Chromium(channel: 'chrome' 时使用本机 Google Chrome)。步骤映射:page.goto、locator.fill、locator.click、setInputFiles、expect;确认框:page.on('dialog') 或 getByRole('button', { name: /确定|确认/ })。
| 用例编号 |
测试模块 |
测试项 |
测试类型 |
测试工具 |
测试目的 |
前置条件 |
测试步骤 |
预期结果 |
| ZCZX-XC-UI-001 |
列表 |
默认分页排序 |
UI 测试 |
Playwright+Chrome |
§5.2 |
已登录;数据>20 |
进入「产业政策宣传」菜单 |
默认每页 20;创建时间新在前 |
| ZCZX-XC-UI-002 |
列表 |
关键字-名称 |
UI 测试 |
Playwright+Chrome |
名称模糊 |
存在名称含关键词记录 |
输入关键字→查询 |
表格含该行 |
| ZCZX-XC-UI-003 |
列表 |
关键字-简介 |
UI 测试 |
Playwright+Chrome |
OR |
简介含词、名称不含 |
输入该词→查询 |
命中 |
| ZCZX-XC-UI-004 |
列表 |
政策层级筛选 |
UI 测试 |
Playwright+Chrome |
精确 |
多层级均有数据 |
选「省级」→查询 |
层级列均为省级 |
| ZCZX-XC-UI-005 |
列表 |
发布状态筛选 |
UI 测试 |
Playwright+Chrome |
§5.2 |
有已发布/未发布数据 |
分别筛「未发布」「已发布」 |
状态列与筛选一致 |
| ZCZX-XC-UI-006 |
列表 |
组合与重置 |
UI 测试 |
Playwright+Chrome |
恢复条件 |
已多条件筛选 |
查询→重置 |
条件清空;恢复默认列表 |
| ZCZX-XC-UI-007 |
列表 |
操作按钮矩阵 |
UI 测试 |
Playwright+Chrome |
§6 |
准备未发布、已发布各一条 |
逐行查看操作列 |
未发布:编辑/发布/删除可见;已发布:下架可见;已发布无编辑/删除/发布 |
| ZCZX-XC-UI-008 |
新增 |
最小必填主流程 |
UI 测试 |
Playwright+Chrome |
§5.1 |
已登录 |
新增→填名称、层级、出台日期、描述→提交 |
成功;列表状态「未发布」 |
| ZCZX-XC-UI-009 |
新增 |
含简介与附件 |
UI 测试 |
Playwright+Chrome |
选填 |
已登录 |
填简介;上传 pdf 与 jpg 封面→提交 |
成功;详情可见文件名与封面 |
| ZCZX-XC-UI-010 |
新增 |
名称空或超长 |
UI 测试 |
Playwright+Chrome |
异常 |
已登录 |
名称留空或 21 字→提交 |
前端或提交后校验失败 |
| ZCZX-XC-UI-011 |
新增 |
名称 20 字边界 |
UI 测试 |
Playwright+Chrome |
上限 |
已登录 |
名称恰好 20 字+其余合法→提交 |
成功 |
| ZCZX-XC-UI-012 |
新增 |
层级必选 |
UI 测试 |
Playwright+Chrome |
约束 |
可清空层级时 |
不选层级→提交 |
必选提示 |
| ZCZX-XC-UI-013 |
新增 |
未来出台日期 |
UI 测试 |
Playwright+Chrome |
异常 |
已登录 |
出台日期选明天→提交 |
校验失败 |
| ZCZX-XC-UI-014 |
新增 |
简介/描述超长 |
UI 测试 |
Playwright+Chrome |
≤50 |
已登录 |
简介或描述>50 字→提交 |
失败 |
| ZCZX-XC-UI-015 |
新增 |
政策文件无附件可提交 |
UI 测试 |
Playwright+Chrome |
选填 |
已登录 |
仅必填、不上传政策文件→提交 |
成功(与标准类「正文必填」区分) |
| ZCZX-XC-UI-016 |
新增 |
政策文件/封面非法 |
UI 测试 |
Playwright+Chrome |
§5.1 |
准备 .exe、.bmp 或超限文件 |
setInputFiles 上传→提交 |
拒绝或明确错误提示 |
| ZCZX-XC-UI-017 |
详情 |
字段完整 |
UI 测试 |
Playwright+Chrome |
§5.5 |
任意记录 |
点「详情」 |
名称、层级、简介、日期、描述、文件名、封面、发布状态齐全 |
| ZCZX-XC-UI-018 |
详情 |
已发布只读 |
UI 测试 |
Playwright+Chrome |
§5.5 |
已发布记录 |
开详情 |
无「保存」类按钮;可有「下架」 |
| ZCZX-XC-UI-019 |
修改 |
未发布编辑成功 |
UI 测试 |
Playwright+Chrome |
§5.3 |
未发布记录 |
编辑→改名称→保存 |
列表/详情已更新 |
| ZCZX-XC-UI-020 |
修改 |
已发布禁止编辑 |
UI 测试 |
Playwright+Chrome |
矩阵 |
已发布 |
尝试进编辑或改字段保存 |
无编辑入口或提示须先下架 |
| ZCZX-XC-UI-021 |
修改 |
保存清空必填失败 |
UI 测试 |
Playwright+Chrome |
异常 |
未发布 |
清空名称或描述→保存 |
校验失败 |
| ZCZX-XC-UI-022 |
修改 |
替换政策文件与封面 |
UI 测试 |
Playwright+Chrome |
§5.3 |
未发布;原有附件 |
编辑→换 pdf 与 png→保存 |
详情为新文件名;旧 URL 不可访问 |
| ZCZX-XC-UI-023 |
发布 |
未发布发布成功 |
UI 测试 |
Playwright+Chrome |
§5.6 |
未发布、必填齐全 |
点「发布」→确认 |
状态变「已发布」 |
| ZCZX-XC-UI-024 |
发布 |
已发布无发布钮 |
UI 测试 |
Playwright+Chrome |
矩阵 |
已发布行 |
查看操作列 |
「发布」隐藏或禁用 |
| ZCZX-XC-UI-025 |
下架 |
已发布下架成功 |
UI 测试 |
Playwright+Chrome |
§5.6 |
已发布 |
点「下架」→确认 |
状态变「未发布」;记录仍在 |
| ZCZX-XC-UI-026 |
下架 |
未发布无下架钮 |
UI 测试 |
Playwright+Chrome |
约束 |
未发布行 |
查看操作列 |
无「下架」 |
| ZCZX-XC-UI-027 |
发布下架 |
下架后再发布闭环 |
UI 集成 |
Playwright+Chrome |
§4 步骤 6 |
完成 UI-025 |
编辑(可选)→再发布 |
再次「已发布」;同一行 id |
| ZCZX-XC-UI-028 |
删除 |
未发布删除成功 |
UI 测试 |
Playwright+Chrome |
§5.4 |
未发布 |
删除→确认 |
列表无该行 |
| ZCZX-XC-UI-029 |
删除 |
已发布禁删 |
UI 测试 |
Playwright+Chrome |
矩阵 |
已发布 |
尝试删除 |
按钮不可用或提示先下架 |
| ZCZX-XC-UI-030 |
删除 |
删后附件失效 |
UI 测试 |
Playwright+Chrome |
存储清理 |
删除前复制政策文件 URL |
删除后新标签打开 URL |
不可访问或 404 |
| ZCZX-XC-UI-031 |
端到端 |
全生命周期串联 |
UI 集成 |
Playwright+Chrome |
§4 |
可新建 |
新增→发布→下架→改→再发布→下架→删除 |
每步状态与按钮矩阵一致 |
| ZCZX-XC-UI-032 |
权限 |
只读账号 |
UI 测试 |
Playwright+Chrome |
§8 权限 |
无 add/edit/remove 权限 |
登录进模块 |
无新增/编辑/删除或操作拒绝 |
| ZCZX-XC-UI-033 |
层级 |
四级均可发布 |
UI 测试 |
Playwright+Chrome |
§2.1 |
已登录 |
各建国家级/省级/市级/县级一条并筛选 |
展示与筛选正确;均可走发布流 |
| ZCZX-XC-UI-034 |
错误提示 |
业务失败可读 |
UI 测试 |
Playwright+Chrome |
§7 |
已登录 |
对已发布记录若强行调编辑 API 或绕过 UI 保存 |
页面 Message 含明确 msg(若 UI 暴露) |
Playwright 与谷歌浏览器(实施提示)
- 安装:
npm i -D @playwright/test;npx playwright install chromium;本机 Chrome:npx playwright install chrome,配置 channel: 'chrome'。
playwright.config.ts 示例:use: { channel: 'chrome', headless: false, locale: 'zh-CN', baseURL: 'http://localhost:80' }。
- 登录复用:
test.beforeAll 登录一次,storageState: 'auth.json' 写入配置。
- 菜单:侧栏
getByText('产业政策宣传') 或路由 goto('/industryPolicy/publicity')(以实际为准)。
- 文件上传:
page.locator('input[type=file]').setInputFiles('fixtures/policy.pdf')。
- 按钮示例:
getByRole('button', { name: /新增|发布|下架|删除/ })。
覆盖对照
| 类别 |
单元 UT |
接口 API |
界面 UI |
| 正常流程 |
UT-012~015、017~018 |
API-001~008、014、016、018~019、021、023、025 |
UI-001~009、011、015、017、019、022~023、025、027~028、031、033 |
| 异常流程 |
UT-005~011、013、016 |
API-009~013、015、017、020、022、024、026~029 |
UI-010、012~014、016、020~021、024、026、029~030、034 |
| 业务约束/矩阵 |
UT-001~004、013 |
API-017、020、022、024、027 |
UI-007、018、020、024、026、029、032 |
功能需求追溯(自查)
| 需求章节 |
要点 |
主要对应用例 |
| §5.1 新增 |
名称 1~20、层级 1~4、简介/文件/封面选填、描述与日期必填、初始未发布 |
UT-005~012;API-007~013;UI-008~016 |
| §5.2 列表 |
关键字 OR、层级、发布状态、分页排序 |
API-001~006;UI-001~006 |
| §5.3 修改 |
仅未发布;替换删旧文件 |
UT-001、013、018;API-016~018;UI-019~022 |
| §5.4 删除 |
仅未发布;删存储文件 |
UT-002、017;API-019~020;UI-028~030 |
| §5.5 详情 |
字段完整、已发布只读 |
API-014~015;UI-017~018 |
| §5.6 发布/下架 |
发布前置;下架保留附件 |
UT-003~004、014~016;API-021~024;UI-023~027 |
| §6 矩阵 |
五类操作权限 |
UT-001~004;UI-007、018、020、024、026、029、031 |
| §7 错误约定 |
code/msg 可读 |
API-028;UI-034 |
修订记录
| 版本 |
说明 |
| 1.0 |
初版:单元 18、接口 29、UI 34;无知识库用例;Playwright+Chrome;Base Path /industryPolicy/publicity |