# 数据资产服务中心 — 测试用例

> 依据：`数据资产服务中心功能需求.md`、`数据资产服务中心技术方案.md`  
> **接口 Base Path（示例）**：`/dataHub/dataSendRecord`；若含 `context-path` 或网关前缀须补齐。鉴权与若依一致（Cookie / Token）。

**通用前置（无特殊说明）**：具备本模块菜单与按钮权限的账号已登录（`dataHub:dataSendRecord:list|query|add|edit|remove`）。库表 `biz_data_send_record` 中至少存在 2 条 `del_flag=0` 样本，示例：  
- **A**：`sendTime=2025-06-01 10:00:00`，`receiverName=县级政务平台`，`sendContent=牧业产值月报`  
- **B**：`sendTime=2025-06-15 14:30:00`，`receiverName=合作银行数据中心`，`sendContent=牦牛资产摘要`

**合法 Body 示例（新增）**：`sendTime=2025-06-20 09:00:00`，`sendContent=草场利用统计`，`receiverName=第三方监管平台`，`receiverAddress=https://api.example.com/v1/receive`

**界面（UI）测试**：**Playwright** + **Chromium**（`channel: 'chrome'` 使用本机 **Google Chrome**）。

---

## 一、单元测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-SJZCZX-UT-001 | 参数校验 | 发送时间 | 单元测试 | JUnit5 | 非空 | 无 | `sendTime` 为 null、合法 datetime | null 失败；合法通过 |
| ZCZX-SJZCZX-UT-002 | 参数校验 | 发送内容 trim | 单元测试 | JUnit5 | §3.3.1 | 无 | `"  abc  "`、`"   "`、2001 字、2000 字 | 空白失败；2000 通过；2001 失败 |
| ZCZX-SJZCZX-UT-003 | 参数校验 | 接收方名称 | 单元测试 | JUnit5 | 1～128 字 | 无 | 空串、129 字、1 字 | 空/超长失败；合法通过 |
| ZCZX-SJZCZX-UT-004 | 参数校验 | 接收方地址 | 单元测试 | JUnit5 | 1～512 字 | 无 | 空串、513 字、合法 URL 文本 | 空/超长失败；合法通过 |
| ZCZX-SJZCZX-UT-005 | 参数校验 | 备注长度 | 单元测试 | JUnit5 | ≤500 | 无 | `remark` 501 字、500 字 | 501 失败；500 通过 |
| ZCZX-SJZCZX-UT-006 | 列表查询 | 发送日期区间 | 单元测试 | JUnit5 | §3.1.1 | 无 | `validateDateRangeForList`：`12-01`>`06-01`；仅起/仅止；合法闭区间 | 颠倒失败；合法通过 |
| ZCZX-SJZCZX-UT-007 | 参数校验 | 全量保存 | 单元测试 | JUnit5 | `validateRowForSave` | 无 | 合法 `BizDataSendRecord` 四必填 | 通过 |
| ZCZX-SJZCZX-UT-008 | 参数校验 | 修改缺 id | 单元测试 | JUnit5 | 修改必填 | 无 | `update` 且 `id=null` | 失败 |
| ZCZX-SJZCZX-UT-009 | Service | 记录不存在 | 单元测试 | JUnit5+Mockito | 异常 | Mock `selectById` null | `update`/`delete` | 抛 `ServiceException` |
| ZCZX-SJZCZX-UT-010 | Service | 已逻辑删除 | 单元测试 | JUnit5+Mockito | §3.5.1 | Mock `del_flag=2` | `update`/`getById` | 失败或查无 |
| ZCZX-SJZCZX-UT-011 | Service | 新增落库 | 单元测试 | JUnit5+Mockito | 正常登记 | Mock Mapper | `insert(record)` | `del_flag=0`；四业务字段入库 |
| ZCZX-SJZCZX-UT-012 | Service | 修改全字段 | 单元测试 | JUnit5+Mockito | §5.3 | 已存在 id | `update` 改时间/内容/名称/地址 | 成功；`update_time` 刷新 |
| ZCZX-SJZCZX-UT-013 | Service | 逻辑删除 | 单元测试 | JUnit5+Mockito | §5.5 | Mock Mapper | `remove([id], updateBy)` | `del_flag=2`；非物理删 |
| ZCZX-SJZCZX-UT-014 | Service | 列表日期非法 | 单元测试 | JUnit5+Mockito | §3.1.1 | 无 | `selectList` 且 `startDate>endDate` | 抛异常；不调 Mapper |
| ZCZX-SJZCZX-UT-015 | Mapper | 筛选与排序 | 单元测试 | JUnit5 | §3.3 | 无 | 检查 `BizDataSendRecordMapper.xml` | `del_flag='0'`；`DATE(send_time)` 闭区间；`LOWER(receiver_name)`；`send_time DESC,id DESC` |

---

## 二、接口测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-SJZCZX-API-001 | 列表 | 默认分页排序 | 接口测试 | Postman/curl | §5.1.2 | 已登录；多条记录 | `GET /dataHub/dataSendRecord/list` | `rows`≤20；`sendTime` 新在前 |
| ZCZX-SJZCZX-API-002 | 列表 | 发送日期区间 | 接口测试 | Postman | §2.4 | 含 A、B 样本 | `startDate=2025-06-01&endDate=2025-06-10` | 仅 A；含起止日当天 |
| ZCZX-SJZCZX-API-003 | 列表 | 发送日期单日 | 接口测试 | Postman | 闭区间 | B 在 06-15 | `startDate=endDate=2025-06-15` | 含 B |
| ZCZX-SJZCZX-API-004 | 列表 | 接收方名称精确 | 接口测试 | Postman | §2.4 | 已登录 | `receiverName=县级政务平台` | 仅名称完全一致记录 |
| ZCZX-SJZCZX-API-005 | 列表 | 名称大小写不敏感 | 接口测试 | Postman | 技术方案 §3.1.1 | 库中名为 `ABC平台` | `receiverName=abc平台` | 命中同一条 |
| ZCZX-SJZCZX-API-006 | 列表 | 名称模糊不匹配 | 接口测试 | Postman | 精确非模糊 | 已登录 | `receiverName=政务`（非全名） | 无记录或空列表 |
| ZCZX-SJZCZX-API-007 | 列表 | 组合筛选 | 接口测试 | Postman | 多条件 | 已登录 | 日期区间+`receiverName` | 同时满足 |
| ZCZX-SJZCZX-API-008 | 列表 | 发送日期区间非法 | 接口测试 | Postman | §7 | 已登录 | `startDate=2025-12-01&endDate=2025-01-01` | 失败；`msg` 可区分 |
| ZCZX-SJZCZX-API-009 | 列表 | 不含已删除 | 接口测试 | Postman | 逻辑删除 | 已知 id 已删 | `GET list` | 列表无该 id |
| ZCZX-SJZCZX-API-010 | 新增 | 合法全字段 | 接口测试 | Postman | §5.2 | 已登录 | `POST` 合法 Body | `code=200`；详情四字段一致 |
| ZCZX-SJZCZX-API-011 | 新增 | 内容首尾空白 | 接口测试 | Postman | trim | 已登录 | `sendContent="  摘要  "` | 成功；存库为 trim 后 |
| ZCZX-SJZCZX-API-012 | 新增 | 缺发送时间 | 接口测试 | Postman | 必填 | 已登录 | 缺 `sendTime` | 失败 |
| ZCZX-SJZCZX-API-013 | 新增 | 发送内容为空/超长 | 接口测试 | Postman | §3.3.1 | 已登录 | `sendContent=""` 或 2001 字 | 失败 |
| ZCZX-SJZCZX-API-014 | 新增 | 接收方名称非法 | 接口测试 | Postman | 1～128 | 已登录 | 空串或 129 字 | 失败 |
| ZCZX-SJZCZX-API-015 | 新增 | 接收方地址非法 | 接口测试 | Postman | 1～512 | 已登录 | 空串或 513 字 | 失败 |
| ZCZX-SJZCZX-API-016 | 详情 | 有效 id | 接口测试 | Postman | §5.4 | 已登录 | `GET /dataHub/dataSendRecord/{id}` | 含四业务字段及审计字段 |
| ZCZX-SJZCZX-API-017 | 详情 | 无效/已删 id | 接口测试 | Postman | 异常 | 已登录 | 不存在或已删 id | `data` 空或业务失败 |
| ZCZX-SJZCZX-API-018 | 修改 | 合法全字段 | 接口测试 | Postman | §5.3 | 有记录 | `PUT` 改时间/内容/名称/地址 | 成功；详情已更新 |
| ZCZX-SJZCZX-API-019 | 修改 | 校验失败 | 接口测试 | Postman | 全量校验 | 有记录 | `PUT` `sendContent` 仅空白 | 失败；库不变 |
| ZCZX-SJZCZX-API-020 | 修改 | 不存在 id | 接口测试 | Postman | 异常 | 已登录 | `PUT` 伪造 id | 失败 |
| ZCZX-SJZCZX-API-021 | 删除 | 单条逻辑删除 | 接口测试 | Postman | §5.5 | 已登录 | `DELETE /dataHub/dataSendRecord/{id}` | 成功；列表不可见 |
| ZCZX-SJZCZX-API-022 | 删除 | 重复删除 | 接口测试 | Postman | 幂等/异常 | id 已删 | 再次 `DELETE` 同 id | 失败或提示不存在 |
| ZCZX-SJZCZX-API-023 | 端到端 | CRUD 串联 | 接口测试 | Postman | §4 | 已登录 | `POST`→`list`→`GET/{id}`→`PUT`→`DELETE` | 每步成功 |
| ZCZX-SJZCZX-API-024 | 鉴权 | 未登录 | 接口测试 | curl | 安全 | 无 Token | `GET .../list` | 401 或统一未登录 |
| ZCZX-SJZCZX-API-025 | 权限 | 无新增权限 | 接口测试 | Postman | §6 | 仅 list 权限 | `POST .../dataSendRecord` | 无权限失败 |
| ZCZX-SJZCZX-API-026 | 权限 | 无删除权限 | 接口测试 | Postman | §6 | 无 remove | `DELETE/{id}` | 无权限失败 |
| ZCZX-SJZCZX-API-027 | 响应 | 失败可读 | 接口测试 | Postman | §7 | 已登录 | 触发日期颠倒、内容空、名称超长 | `code`、`msg` 可区分 |

---

## 三、界面测试用例（UI）

**测试工具**：**Playwright** + **Chromium**（`channel: 'chrome'` 使用本机 **Google Chrome**）。

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-SJZCZX-UI-001 | 列表 | 默认分页排序 | UI 测试 | Playwright+Chrome | §5.1.2 | 已登录；数据>20 | 进入「数据资产服务中心」菜单 | 默认每页 20；发送时间新在前 |
| ZCZX-SJZCZX-UI-002 | 列表 | 发送日期筛选 | UI 测试 | Playwright+Chrome | §2.4 | 有 A、B 样本 | 选发送日期起止→搜索 | 结果在闭区间内 |
| ZCZX-SJZCZX-UI-003 | 列表 | 接收方名称筛选 | UI 测试 | Playwright+Chrome | 精确匹配 | 有样本 | 输入全名「县级政务平台」→搜索 | 仅命中 A |
| ZCZX-SJZCZX-UI-004 | 列表 | 名称片段不匹配 | UI 测试 | Playwright+Chrome | 非模糊 | 有样本 | 输入「政务」→搜索 | 无行或空状态 |
| ZCZX-SJZCZX-UI-005 | 列表 | 组合与重置 | UI 测试 | Playwright+Chrome | §5.1 | 已筛选 | 搜索→「重置」 | 条件清空；默认列表 |
| ZCZX-SJZCZX-UI-006 | 列表 | 展示列完整 | UI 测试 | Playwright+Chrome | §5.1.3 | 有数据 | 查看表头与首行 | 含发送时间、内容、接收方名称/地址、操作 |
| ZCZX-SJZCZX-UI-007 | 列表 | 长文本省略 | UI 测试 | Playwright+Chrome | §5.1.3 | 内容/地址较长 | 查看列表单元格 | 省略显示；悬停或详情可看全 |
| ZCZX-SJZCZX-UI-008 | 新增 | 合法登记 | UI 测试 | Playwright+Chrome | §5.2 | 已登录 | 新增→填四必填→确定 | 成功提示；列表新行 |
| ZCZX-SJZCZX-UI-009 | 新增 | 发送时间默认当前 | UI 测试 | Playwright+Chrome | §5.2.2 | 已登录 | 打开新增弹窗 | 发送时间默认为当前时刻（可改） |
| ZCZX-SJZCZX-UI-010 | 新增 | 缺必填项 | UI 测试 | Playwright+Chrome | §5.2.3 | 已登录 | 留空发送内容或接收方→确定 | 字段校验失败；不关闭弹窗 |
| ZCZX-SJZCZX-UI-011 | 新增 | 发送内容仅空白 | UI 测试 | Playwright+Chrome | trim | 已登录 | 发送内容填空格→确定 | 校验失败 |
| ZCZX-SJZCZX-UI-012 | 新增 | 取消新增 | UI 测试 | Playwright+Chrome | 取消 | 已登录 | 新增填一半→取消 | 弹窗关闭；列表无新行 |
| ZCZX-SJZCZX-UI-013 | 列表 | 日期起晚于止 | UI 测试 | Playwright+Chrome | §7 | 已登录 | 发送日期选颠倒区间→搜索 | 提示修正；不刷新或空结果 |
| ZCZX-SJZCZX-UI-014 | 详情 | 字段完整只读 | UI 测试 | Playwright+Chrome | §5.4 | 任意记录 | 点「查看」 | 四业务字段+审计信息；无保存按钮 |
| ZCZX-SJZCZX-UI-015 | 修改 | 编辑成功 | UI 测试 | Playwright+Chrome | §5.3 | 有记录 | 编辑→改接收方地址→保存 | 列表/详情已更新 |
| ZCZX-SJZCZX-UI-016 | 修改 | 校验失败 | UI 测试 | Playwright+Chrome | §5.3 | 有记录 | 编辑清空接收方名称→保存 | 校验失败；原数据不变 |
| ZCZX-SJZCZX-UI-017 | 删除 | 确认删除 | UI 测试 | Playwright+Chrome | §5.5 | 有记录 | 删除→确认 | 列表无该行 |
| ZCZX-SJZCZX-UI-018 | 删除 | 取消删除 | UI 测试 | Playwright+Chrome | 确认框 | 有记录 | 删除→取消 | 记录仍在 |
| ZCZX-SJZCZX-UI-019 | 端到端 | CRUD 串联 | UI 集成 | Playwright+Chrome | §4 | 权限齐备 | 新增→搜索→查看→编辑→删除 | 全流程无报错 |
| ZCZX-SJZCZX-UI-020 | 权限 | 只读账号 | UI 测试 | Playwright+Chrome | §6 | 无 add/edit/remove | 进入模块 | 无新增/编辑/删除或点击拒绝 |
| ZCZX-SJZCZX-UI-021 | 权限 | 无菜单 | UI 测试 | Playwright+Chrome | §6 | 无 list 角色 | 登录后找菜单 | 无「数据资产服务中心」入口 |

---

## Playwright 与谷歌浏览器（实施提示）

- 安装：`npm i -D @playwright/test`；`npx playwright install chromium`；本机 Chrome：`npx playwright install chrome`。  
- `playwright.config.ts`：`use: { channel: 'chrome', headless: false, locale: 'zh-CN', baseURL: 'http://localhost:80' }`；`storageState` 复用登录态。  
- 路由：`page.goto('/dataHub/dataSendRecord')`（以菜单 `component` 为准）。  
- 发送日期：`page.locator('.el-date-editor').filter({ hasText: '发送日期' })` 或按 label 定位 daterange；`fill` 起止 `YYYY-MM-DD`。  
- 新增：`page.getByRole('button', { name: '新增' })`；弹窗内 `page.getByLabel('发送内容').fill('…')`；发送时间用 datetime 选择器。  
- 删除：`page.getByRole('button', { name: '删除' }).first()` → `page.getByRole('button', { name: '确定' })`。

---

## 覆盖对照

| 类别 | 单元 UT | 接口 API | 界面 UI |
| --- | --- | --- | --- |
| 正常流程 | UT-007、011～012、015 | API-001～007、010～011、016、018、023 | UI-001～009、014～015、019 |
| 异常流程 | UT-001～006、008～010、014 | API-008～009、012～015、017、019～022、024 | UI-010～013、016～018 |
| 业务约束 | UT-002～005、015 | API-004～006、011、013～015 | UI-003～004、007、011、013 |
| 逻辑删除 | UT-010、013、015 | API-009、021～022 | UI-017～018 |
| 权限/鉴权 | — | API-024～026 | UI-020～021 |
| 名称精确/大小写 | UT-015 | API-004～006 | UI-003～004 |
| 发送日期闭区间 | UT-006、015 | API-002～003、008 | UI-002、013 |

---

## 功能需求追溯（自查）

| 需求章节 | 要点 | 主要对应用例 |
| --- | --- | --- |
| §5.1 列表 | 日期区间、名称精确、分页排序 | API-001～009；UI-001～007、013 |
| §5.2 新增 | 默认时间、必填、长度 | UT-001～005、007、011；API-010～015；UI-008～012 |
| §5.3 修改 | 全字段可改 | UT-012；API-018～020；UI-015～016 |
| §5.4 查看 | 只读全文 | API-016；UI-014 |
| §5.5 删除 | 确认、逻辑删除 | UT-013；API-021～022；UI-017～018 |
| §2.3～§2.4 | 逻辑删除、筛选口径 | UT-010、015；API-005、009 |
| §6～§7 | 权限、错误提示 | API-024～027；UI-020～021 |
| §4 流程 | CRUD 串联 | API-023；UI-019 |

---

## 修订记录

| 版本 | 说明 |
| --- | --- |
| 1.0 | 初版：单元 15、接口 27、UI 21；覆盖正常/异常/约束；Playwright+Chrome；编号前缀 **ZCZX-SJZCZX** |
