# 风险因子设置 — 测试用例

> 依据：`风险因子设置功能需求.md`、`风险因子设置技术方案.md`  
> **接口 Base Path（示例）**：`/diseaseDetection/riskFactorWeight`；若含 `context-path` 或网关前缀须补齐。鉴权与若依一致（Cookie / Token）。

**通用前置（无特殊说明）**：具备本模块菜单权限的账号已登录。**五项因子固定**：养殖密度、交通流动性、检疫强度、气象适宜度、既往发病水平。**权重规则**：每项 **> 0**；五项之和 **= 1**（容差建议 `|Σ − 1| ≤ 0.0001`）。**本模块无**列表分页、删除、新增因子项接口。

**合法保存示例 Body（五项各 0.2）**：`breedingDensityWeight`、`trafficMobilityWeight`、`quarantineIntensityWeight`、`meteorologicalSuitabilityWeight`、`pastDiseaseLevelWeight` 均为 `0.2`。

**界面（UI）测试**：借助 **Playwright** 启动 **Chromium**（与 **Google Chrome 同源内核**）；可配置 `channel: 'chrome'` 调用本机已安装的谷歌浏览器。

---

## 一、单元测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| FXYZ-UT-001 | 权重校验 | 单项正数 | 单元测试 | JUnit5 | >0 | 无 | 传 `0.2`、`-0.1`、`0` | `0.2` 通过；`-0.1`、`0` 失败 |
| FXYZ-UT-002 | 权重校验 | 五项必填 | 单元测试 | JUnit5 | 非空 | 无 | 任一项为 `null` | 失败 |
| FXYZ-UT-003 | 权重校验 | 合计等于 1 | 单元测试 | JUnit5 | §2.3 | 无 | `0.2×5`；`0.1×10`（和为1） | 通过 |
| FXYZ-UT-004 | 权重校验 | 合计不为 1 | 单元测试 | JUnit5 | §2.3 | 无 | `0.2×4+0.3`；`0.5×5` | 失败 |
| FXYZ-UT-005 | 权重校验 | 容差边界 | 单元测试 | JUnit5 | 0.0001 | 无 | 和 `1.00005`、和 `0.9999` | 前者通过/后者按规则失败（与实现一致） |
| FXYZ-UT-006 | 权重校验 | 非法小数 | 单元测试 | JUnit5 | 数字合法 | 无 | 传非数字、空串 | 失败 |
| FXYZ-UT-007 | 合计计算 | weightSum | 单元测试 | JUnit5 | 响应字段 | 五项已知 | `calcSum(five)` | 与五项之和一致 |
| FXYZ-UT-008 | Service | 首次保存 insert | 单元测试 | JUnit5+Mockito | upsert | 库无 `id=1` | `save(valid)` | `insert`；`id=1` |
| FXYZ-UT-009 | Service | 再次保存 update | 单元测试 | JUnit5+Mockito | upsert | 已有 `id=1` | `save(新五项)` | `update` 全部字段 |
| FXYZ-UT-010 | Service | 原子更新 | 单元测试 | JUnit5+Mockito | §3.3 | 已有配置 | 模拟仅写成功 3 列 | 事务回滚或拒绝部分更新 |
| FXYZ-UT-011 | Service | 查询单例 | 单元测试 | JUnit5 | `id=1` | 有数据 | `selectConfig()` | 仅一行；五项齐全 |
| FXYZ-UT-012 | Service | 无记录查询 | 单元测试 | JUnit5+Mockito | 空库 | 无行 | `selectConfig()` | `null` 或默认对象（与产品约定） |

---

## 二、接口测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| FXYZ-API-001 | 查询 | 获取当前权重 | 接口测试 | Postman/curl | §3.1 | 已登录；库有 `id=1` | `GET .../riskFactorWeight` | `code=200`；`data` 含五项驼峰字段；可选 `weightSum=1` |
| FXYZ-API-002 | 查询 | 无配置记录 | 接口测试 | Postman | 空库 | 表无行 | `GET .../riskFactorWeight` | `data` 为 `null` 或默认五项（与约定一致） |
| FXYZ-API-003 | 保存 | 合法五项各 0.2 | 接口测试 | Postman | §3.2 | 已登录 | `PUT` 五项均为 `0.2` | 成功；再 `GET` 五项均为 `0.2` |
| FXYZ-API-004 | 保存 | 合法非均分 | 接口测试 | Postman | 和为 1 | 已登录 | `PUT` `0.3,0.25,0.2,0.15,0.1` | 成功；`GET` 与提交一致 |
| FXYZ-API-005 | 保存 | 合计不为 1 | 接口测试 | Postman | §3.3 | 已登录 | `PUT` 五项均为 `0.3` | 失败；库中数据不变 |
| FXYZ-API-006 | 保存 | 某项为 0 | 接口测试 | Postman | 正数 | 已登录 | `breedingDensityWeight=0`，其余凑 1 | 失败 |
| FXYZ-API-007 | 保存 | 某项为负数 | 接口测试 | Postman | 正数 | 已登录 | `trafficMobilityWeight=-0.1` | 失败 |
| FXYZ-API-008 | 保存 | 必填缺失 | 接口测试 | Postman | 五项必填 | 已登录 | Body 缺 `pastDiseaseLevelWeight` | 失败 |
| FXYZ-API-009 | 保存 | 容差内合计 | 接口测试 | Postman | 0.0001 | 已登录 | 五项和 `1.0000`（如 `0.2001×4+0.1996`） | 按实现：通过或失败须与 §2.1 一致并文档化 |
| FXYZ-API-010 | 保存 | 首次 insert | 接口测试 | Postman | upsert | 空库 | `PUT` 合法五项 | 成功；库出现 `id=1` 一行 |
| FXYZ-API-011 | 端到端 | 查询→改→查 | 接口测试 | Postman | §4 | 已登录 | `GET`→`PUT` 改检疫 `0.3` 并调整其余使和=1→`GET` | 两次查询与最后一次保存一致 |
| FXYZ-API-012 | 鉴权 | 未登录 | 接口测试 | curl | 安全 | 无 Token | `GET` / `PUT` | 401 或统一未登录 |
| FXYZ-API-013 | 权限 | 无 query 权限 | 接口测试 | Postman | 越权 | 无 query | `GET` | 无权限失败 |
| FXYZ-API-014 | 权限 | 无 edit 权限 | 接口测试 | Postman | 越权 | 仅 query | `PUT` 合法 Body | 无权限失败 |
| FXYZ-API-015 | 响应 | 失败可读 | 接口测试 | Postman | §7 | 已登录 | 触发 API-005、006、008 | `msg` 可区分合计/正数/必填 |

---

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

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

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| FXYZ-UI-001 | 页面 | 进入加载配置 | UI 测试 | Playwright+Chrome | §5.1 | 已登录；库有配置 | 菜单进入「风险因子权重」 | 展示五项因子名称与权重；有加载态 |
| FXYZ-UI-002 | 页面 | 五项因子固定 | UI 测试 | Playwright+Chrome | §2.1 | 已登录 | 查看表单项标签 | 含养殖密度、交通流动性、检疫强度、气象适宜度、既往发病水平；无增删因子入口 |
| FXYZ-UI-003 | 录入 | 占位与正数提示 | UI 测试 | Playwright+Chrome | 原型 | 已登录 | 查看输入框与旁注 | 占位「请输入权重」；有「正数」类提示 |
| FXYZ-UI-004 | 录入 | 实时合计展示 | UI 测试 | Playwright+Chrome | §2.3 | 已登录 | 修改任一项权重 | 页面展示当前合计（如 `0.85`）；提示「权重之和=1」 |
| FXYZ-UI-005 | 保存 | 合法保存成功 | UI 测试 | Playwright+Chrome | §5.3 | 有 edit 权限 | 五项设为各 `0.2`→点「保存」 | 成功提示；刷新后仍为 `0.2` |
| FXYZ-UI-006 | 保存 | 合计不为 1 拦截 | UI 测试 | Playwright+Chrome | §5.2 | 已登录 | 五项均为 `0.3`→保存 | 校验失败或保存按钮不可用；提示合计须为 1 |
| FXYZ-UI-007 | 保存 | 非正数拦截 | UI 测试 | Playwright+Chrome | §5.2 | 已登录 | 某项填 `0` 或负数→保存 | 字段级错误提示；不提交 |
| FXYZ-UI-008 | 保存 | 必填拦截 | UI 测试 | Playwright+Chrome | §5.2 | 已登录 | 清空一项→保存 | 提示该项必填 |
| FXYZ-UI-009 | 保存 | 非均分合法保存 | UI 测试 | Playwright+Chrome | §5.3 | 已登录 | 填 `0.3,0.25,0.2,0.15,0.1`→保存 | 成功；重新进入仍为该组值 |
| FXYZ-UI-010 | 权限 | 无保存按钮 | UI 测试 | Playwright+Chrome | §6 | 仅 query 权限 | 进入页面 | 可查看权重；无「保存」或点击被拒绝 |
| FXYZ-UI-011 | 异常 | 加载失败提示 | UI 测试 | Playwright+Chrome | §7 | 模拟接口失败 | 进入页面 | 错误提示；可重试（若有） |
| FXYZ-UI-012 | 端到端 | 改一项联动合计 | UI 集成 | Playwright+Chrome | §4 | 已登录 | 加载→改「养殖密度」为 `0.4` 并调整其余使合计 1→保存→重进 | 合计实时变化；保存后持久化正确 |

---

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

- 安装：`npm i -D @playwright/test`；`npx playwright install chromium`；`use: { channel: 'chrome' }`。  
- 导航：`page.getByText('风险因子权重')` 或 `goto('/diseaseDetection/riskFactorWeight')`。  
- 录入：按标签定位五项 `el-input-number` 或 `input`，填 `0.2` 等。  
- 合计：`expect(page.getByText(/当前合计|1\.00/)).toBeVisible()`（以实际文案为准）。  
- 保存：`getByRole('button', { name: '保存' }).click()`；`expect(page.locator('.el-message--success')).toBeVisible()`。

---

## 覆盖对照

| 类别 | 单元 UT | 接口 API | 界面 UI |
| --- | --- | --- | --- |
| 正常流程 | UT-003、007～009、011 | API-001、003～004、010～011 | UI-001、005、009、012 |
| 异常流程 | UT-001、002、004、006 | API-005～008、012～015 | UI-006～008、011 |
| 业务约束 | UT-005、010 | API-009 | UI-002、004、006 |

---

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

| 需求章节 | 要点 | 主要对应用例 |
| --- | --- | --- |
| §5.1 展示加载 | 五项固定、占位 | UI-001～003；API-001、002 |
| §5.2 录入校验 | 正数、合计=1 | UT-001～006；API-005～009；UI-004、006～008 |
| §5.3 保存 | 原子 upsert | UT-008～010；API-003、004、010、011；UI-005、009 |
| §6 权限 | query/edit | API-013、014；UI-010 |
| §7 错误提示 | 可读 | API-015；UI-006～008、011 |

---

## 修订记录

| 版本 | 说明 |
| --- | --- |
| 1.0 | 初版：单元 12、接口 15、UI 12；前缀 FXYZ-；单页 GET/PUT；Playwright+Chrome |
