# 市场行情登记 — 测试用例

> 依据：`市场行情登记功能需求.md`、`市场行情登记技术方案.md`  
> **接口 Base Path**：`/tradeMarket/marketQuote`；鉴权与若依一致（Cookie / Token）。

**通用前置（无特殊说明）**：具备本模块权限的账号已登录（`tradeMarket:marketQuote:list|query|add|edit|remove`）。`biz_trade_market` 宜有运营状态**正常**的市场 **TM1**（如 id=1，名称「巴青交易市场」）。`biz_market_daily_quote` 宜预置（`del_flag=0`）：

| 样本 | 行情日期 | 渠道 | 产地县码 | 公母 | 要点 |
| --- | --- | --- | --- | --- | --- |
| **D1** | 昨天 | TM1 | 540628（示例） | 公牛(1) | 完整维度；prob 40/30/30；有变化因素 |
| **D2** | 昨天 | TM1 | 另一县码 | 母牛(2) | 重量档=3；用于组合筛选 |
| **D3** | 7 天前 | TM1 | 同 D1 县 | 公牛(1) | 日期区间筛选用 |

**合法新增 Body 示例（驼峰）**：`quoteDate=2026-05-19`，省/市/县 code+name 齐全，`tradeMarketId=1`，`cattleGender=1`，`priceMin=10`，`priceMax=14`，`priceUnit=2`，`supplyStatus=1`，`changeFactors=[1,3]`，`probRise=40`，`probFlat=35`，`probFall=25`，`outboundAdvice=出栏平稳`（合计 100%）。

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

---

## 一、单元测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| JYPT-SCDJ-UT-001 | 均价计算 | 公式 | 单元测试 | JUnit5 | §3.5 | 无 | `calcAvg(10,14)` | 返回 `12.00` |
| JYPT-SCDJ-UT-002 | 均价计算 | 不等价 | 单元测试 | JUnit5 | §3.5 | 无 | min=15,max=10 | 抛异常或无效 |
| JYPT-SCDJ-UT-003 | 概率校验 | 合计100 | 单元测试 | JUnit5 | §3.5 | 无 | 40+35+25；99+0.5+0.5；50+30+30 | 前两通过；后者失败 |
| JYPT-SCDJ-UT-004 | 概率校验 | 非正 | 单元测试 | JUnit5 | §2.9 | 无 | 0、-1、101 | 失败 |
| JYPT-SCDJ-UT-005 | 行情日期 | 未来日 | 单元测试 | JUnit5 | §2.2 | 无 | 明天日期 | 失败 |
| JYPT-SCDJ-UT-006 | 变化因素 | 至少一项 | 单元测试 | JUnit5 | §2.8 | 无 | `[]`、非法码 `9`、`[1,2]` | 空/非法失败；合法通过 |
| JYPT-SCDJ-UT-007 | 变化因素 | 入库格式 | 单元测试 | JUnit5 | §3.5 | 无 | 输入 `[3,1,1]` | 存 `1,3`（去重排序） |
| JYPT-SCDJ-UT-008 | 渠道校验 | 市场不存在 | 单元测试 | JUnit5+Mockito | §3.5 | 无此 id | 校验 | 失败 |
| JYPT-SCDJ-UT-009 | 渠道校验 | 市场停业 | 单元测试 | JUnit5+Mockito | §2.4 | status=2 | 校验 | 失败 |
| JYPT-SCDJ-UT-010 | 维度唯一 | 重复组合 | 单元测试 | JUnit5+Mockito | §2.4 | 已有 D1 维 | `existsDuplicate` | true |
| JYPT-SCDJ-UT-011 | 维度唯一 | 修改排除自身 | 单元测试 | JUnit5+Mockito | §2.4 | 改 D1 | 同 id 查重 | false |
| JYPT-SCDJ-UT-012 | 出栏建议 | 长度 | 单元测试 | JUnit5 | §2.10 | 无 | 空、501 字、500 字 | 空/超长失败；500 通过 |
| JYPT-SCDJ-UT-013 | 枚举 | 公母/单位 | 单元测试 | JUnit5 | §2.3 | 无 | gender=0；unit=3 | 失败 |
| JYPT-SCDJ-UT-014 | Service | 新增落库均价 | 单元测试 | JUnit5+Mockito | 正常 | Mock | insert min=20,max=30 | `avg_price=25` |
| JYPT-SCDJ-UT-015 | Service | 逻辑删除 | 单元测试 | JUnit5+Mockito | §3.5 | Mock | `remove` | `del_flag=2` |
| JYPT-SCDJ-UT-016 | Mapper | 日期区间 SQL | 单元测试 | JUnit5 | §3.6 | 无 | 检查 XML | `BETWEEN begin/end` |
| JYPT-SCDJ-UT-017 | Mapper | 列表排序 | 单元测试 | JUnit5 | §3.1 | 无 | 检查 XML | `quote_date DESC, create_time DESC` |

---

## 二、接口测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| JYPT-SCDJ-API-001 | 列表 | 默认分页排序 | 接口测试 | Postman | §3.1 | 有 D1～D3 | `GET /list` | `code=200`；含 `tradeMarketName`；日期倒序 |
| JYPT-SCDJ-API-002 | 列表 | 单日精确 | 接口测试 | Postman | §3.1.1 | 有 D1 | `quoteDate=昨天` | 含 D1 不含 D3 |
| JYPT-SCDJ-API-003 | 列表 | 日期区间 | 接口测试 | Postman | §3.1.1 | 有 D1、D3 | `beginQuoteDate`～`endQuoteDate` | 范围内记录 |
| JYPT-SCDJ-API-004 | 列表 | 渠道精确 | 接口测试 | Postman | §2.12 | TM1 | `tradeMarketId=1` | 均为 TM1 |
| JYPT-SCDJ-API-005 | 列表 | 产地县精确 | 接口测试 | Postman | §2.12 | D1 县码 | `countyCode=…` | 含 D1 |
| JYPT-SCDJ-API-006 | 列表 | 组合筛选 | 接口测试 | Postman | §2.12 | 已登录 | 日期+渠道+县 | 同时满足 |
| JYPT-SCDJ-API-007 | 列表 | 不含已删 | 接口测试 | Postman | 逻辑删除 | id 已删 | `GET /list` | 无该 id |
| JYPT-SCDJ-API-008 | 渠道下拉 | 仅正常市场 | 接口测试 | Postman | §3.4 | 有停业市场 | `GET /tradeMarketOptions` | 仅 `operate_status=1` |
| JYPT-SCDJ-API-009 | 新增 | 完整合法 | 接口测试 | Postman | §5.1 | TM1 正常 | `POST` 合法 Body | `code=200`；`avgPrice=12` |
| JYPT-SCDJ-API-010 | 新增 | 默认公母与单位 | 接口测试 | Postman | §5.1 | 已登录 | `POST` 省略 gender/unit | 存 `cattleGender=1`，`priceUnit=2` |
| JYPT-SCDJ-API-011 | 新增 | 缺必填 | 接口测试 | Postman | §5.1.4 | 已登录 | 缺 `tradeMarketId` 或县码 | 失败 |
| JYPT-SCDJ-API-012 | 新增 | 未来日期 | 接口测试 | Postman | §2.2 | 已登录 | `quoteDate=明天` | 失败 |
| JYPT-SCDJ-API-013 | 新增 | 最低价>最高价 | 接口测试 | Postman | §2.6 | 已登录 | min=20,max=10 | 失败 |
| JYPT-SCDJ-API-014 | 新增 | 概率合计≠100 | 接口测试 | Postman | §2.9 | 已登录 | 40+40+40 | 失败 |
| JYPT-SCDJ-API-015 | 新增 | 变化因素为空 | 接口测试 | Postman | §2.8 | 已登录 | `changeFactors=[]` | 失败 |
| JYPT-SCDJ-API-016 | 新增 | 维度重复 | 接口测试 | Postman | §2.13 | 已有 D1 维 | `POST` 同维 | 失败 |
| JYPT-SCDJ-API-017 | 新增 | 停业渠道 | 接口测试 | Postman | §2.4 | 停业市场 id | `POST` | 失败 |
| JYPT-SCDJ-API-018 | 详情 | 有效 id | 接口测试 | Postman | §5.4 | 有 D1 | `GET /{id}` | 含概率、变化因素名、均价 |
| JYPT-SCDJ-API-019 | 详情 | 无效 id | 接口测试 | Postman | 异常 | 已登录 | 不存在 id | 失败或空 |
| JYPT-SCDJ-API-020 | 修改 | 改价格重算均价 | 接口测试 | Postman | §5.3 | 有 D1 avg=12 | `PUT` min=8,max=12 | `avgPrice=10` |
| JYPT-SCDJ-API-021 | 修改 | 改概率 | 接口测试 | Postman | §5.3 | 有 D1 | `PUT` 新 prob 合计100 | 成功 |
| JYPT-SCDJ-API-022 | 修改 | 维度重复他人 | 接口测试 | Postman | §2.13 | 有 D1、D2 | D2 改成 D1 维 | 失败 |
| JYPT-SCDJ-API-023 | 修改 | 不存在 id | 接口测试 | Postman | 异常 | 已登录 | 伪造 `PUT` | 失败 |
| JYPT-SCDJ-API-024 | 删除 | 单条逻辑删 | 接口测试 | Postman | §5.5 | 无关联新行 | `DELETE /{id}` | 成功；列表无 |
| JYPT-SCDJ-API-025 | 删除 | 有关联拒绝 | 接口测试 | Postman | §5.5 | 预置引用 | `DELETE` | 失败 |
| JYPT-SCDJ-API-026 | 删除 | 重复删除 | 接口测试 | Postman | 幂等 | 已删 id | 再次 `DELETE` | 失败 |
| JYPT-SCDJ-API-027 | 端到端 | CRUD 串联 | 接口测试 | Postman | §4 | TM1 | `POST`→`list`→`GET`→`PUT`→`DELETE` | 每步 `code=200` |
| JYPT-SCDJ-API-028 | 鉴权 | 未登录 | 接口测试 | curl | 安全 | 无 Token | `GET /list` | 401 或未登录 |
| JYPT-SCDJ-API-029 | 权限 | 无新增 | 接口测试 | Postman | §6 | 仅 list | `POST` | 无权限失败 |
| JYPT-SCDJ-API-030 | 响应 | 失败可读 | 接口测试 | Postman | §8 | 已登录 | 触发重复维、概率错 | `msg` 可区分 |

---

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

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

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| JYPT-SCDJ-UI-001 | 列表 | 默认展示 | UI 测试 | Playwright+Chrome | §5.2.3 | 已登录；有数据 | 进入「市场行情登记」 | 含日期、产地、渠道、公母、价格、均价、操作 |
| JYPT-SCDJ-UI-002 | 列表 | 日期筛选 | UI 测试 | Playwright+Chrome | §2.12 | 有 D1、D3 | 选昨天→搜索 | 含 D1 不含 D3 |
| JYPT-SCDJ-UI-003 | 列表 | 渠道筛选 | UI 测试 | Playwright+Chrome | §2.12 | 多市场数据 | 选 TM1→搜索 | 仅 TM1 行 |
| JYPT-SCDJ-UI-004 | 列表 | 重置 | UI 测试 | Playwright+Chrome | §5.2 | 已筛选 | 搜索→重置 | 条件清空 |
| JYPT-SCDJ-UI-005 | 新增 | 默认昨天与枚举 | UI 测试 | Playwright+Chrome | §5.1.2 | 有 add | 打开新增 | 日期默认昨天；公母默认公牛；单位默认元/斤 |
| JYPT-SCDJ-UI-006 | 新增 | 产地三级 | UI 测试 | Playwright+Chrome | §2.3 | 新增 | 级联选至县 | 未选至县不可保存 |
| JYPT-SCDJ-UI-007 | 新增 | 渠道下拉 | UI 测试 | Playwright+Chrome | §2.4 | TM1 正常 | 选渠道 | 展示市场名称；停业不可选 |
| JYPT-SCDJ-UI-008 | 新增 | 均价自动计算 | UI 测试 | Playwright+Chrome | §2.6 | 新增 | 填 min=10,max=14 | 展示均价 12.00 |
| JYPT-SCDJ-UI-009 | 新增 | 概率合计校验 | UI 测试 | Playwright+Chrome | §2.9 | 新增 | 填 40+40+40→确定 | 提示合计须 100% |
| JYPT-SCDJ-UI-010 | 新增 | 变化因素多选 | UI 测试 | Playwright+Chrome | §2.8 | 新增 | 勾选≥1 项→保存 | 成功；详情展示标签 |
| JYPT-SCDJ-UI-011 | 新增 | 完整保存 | UI 测试 | Playwright+Chrome | §5.1 | 合法数据 | 填全必填→确定 | 成功；列表出现 |
| JYPT-SCDJ-UI-012 | 新增 | 取消 | UI 测试 | Playwright+Chrome | §5.1.3 | 新增 | 填一半→取消 | 无新行 |
| JYPT-SCDJ-UI-013 | 详情 | 只读全字段 | UI 测试 | Playwright+Chrome | §5.4 | 有 D1 | 查看 | 概率、因素、建议只读 |
| JYPT-SCDJ-UI-014 | 编辑 | 改价格 | UI 测试 | Playwright+Chrome | §5.3 | 有 D1 | 改最高价→保存 | 均价联动更新 |
| JYPT-SCDJ-UI-015 | 删除 | 确认删除 | UI 测试 | Playwright+Chrome | §5.5 | 无关联行 | 删除→确认 | 行消失 |
| JYPT-SCDJ-UI-016 | 删除 | 取消删除 | UI 测试 | Playwright+Chrome | §5.5 | 任意行 | 删除→取消 | 行仍在 |
| JYPT-SCDJ-UI-017 | 端到端 | 全流程 | UI 集成 | Playwright+Chrome | §4 | 权限齐备 | 新增→筛选→看→改→删 | 无报错 |
| JYPT-SCDJ-UI-018 | 权限 | 只读角色 | UI 测试 | Playwright+Chrome | §6 | 仅 list/query | 进入模块 | 无新增/编辑/删除 |
| JYPT-SCDJ-UI-019 | 详情 | 从详情编辑 | UI 测试 | Playwright+Chrome | §5.4 | 查看 D1 | 点「编辑」 | 进入编辑弹窗 |
| JYPT-SCDJ-UI-020 | 新增 | 无可用市场提示 | UI 测试 | Playwright+Chrome | §2.4 | 无正常市场 | 打开新增看渠道 | 空列表或引导维护市场 |

---

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

- 安装：`npm i -D @playwright/test`；`npx playwright install chrome`。  
- 配置：`use: { channel: 'chrome', locale: 'zh-CN', baseURL: 'http://localhost:80' }`；`storageState` 复用登录态。  
- 路由：`page.goto('/tradeMarket/marketQuote')`（以菜单 `component` 为准）。  
- 日期：`page.getByLabel('行情日期')`；断言默认值为昨天。  
- 级联：`RegionCascader` 按项目封装点击省/市/县。  
- 概率：三个输入框失焦后断言合计提示。  
- 变化因素：`el-checkbox-group` 至少勾选一项。

---

## 覆盖对照

| 类别 | 单元 UT | 接口 API | 界面 UI |
| --- | --- | --- | --- |
| 正常流程 | UT-014 | API-009～010、018、020～021、027 | UI-005～011、013～014、017 |
| 异常流程 | UT-002～005、012 | API-011～017、019、023、025～026 | UI-009、012、015～016 |
| 业务约束 | UT-006～011 | API-016、022 | UI-006～008、010 |
| 均价/概率 | UT-001～004 | API-013～014、020 | UI-008～009 |
| 渠道/市场 | UT-008～009 | API-008、017 | UI-007、020 |
| 列表筛选 | UT-016～017 | API-001～007 | UI-002～004 |
| 逻辑删除 | UT-015 | API-007、024～026 | UI-015 |
| 权限/鉴权 | — | API-028～029 | UI-018 |

---

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

| 需求章节 | 要点 | 主要对应用例 |
| --- | --- | --- |
| §5.1 新增 | 字段、默认、均价、概率、因素 | UT-001～014；API-009～017；UI-005～012 |
| §5.2 列表 | 日期/渠道/产地筛选 | UT-016～017；API-001～007；UI-001～004 |
| §5.3 修改 | 全字段、均价重算 | API-020～023；UI-014、019 |
| §5.4 详情 | 只读 | API-018；UI-013、019 |
| §5.5 删除 | 逻辑删 | UT-015；API-024～026；UI-015～016 |
| §2.4 渠道 | 联动交易市场 | API-008、017；UI-007、020 |
| §2.13 维度唯一 | 组合唯一 | UT-010～011；API-016、022 |
| §6 权限 | 按钮级 | API-028～029；UI-018 |

---

## 修订记录

| 版本 | 说明 |
| --- | --- |
| 1.0 | 初版：单元 17、接口 30、UI 20；覆盖 CRUD、筛选、均价、概率100%、变化因素、维度唯一、渠道联动；Playwright+Chrome；前缀 **JYPT-SCDJ** |
