# 承销商管理 — 测试用例 > 依据:`承销商管理功能需求.md`、`承销商管理技术方案.md` > **接口 Base Path(示例)**:`/tradeMarket/distributor`;鉴权与若依一致(Cookie / Token)。 **通用前置(无特殊说明)**:具备本模块按钮权限的账号已登录(`tradeMarket:distributor:list|query|add|edit|remove|assignAccount`)。库表 `biz_distributor` 中宜预置(`del_flag=0`): | 样本 | 编号 | 名称 | 类型 | 销售去向 | 要点 | | --- | --- | --- | --- | --- | --- | | **D1** | `01` | 扎西承销服务点 | 个体户(1) | 本市(1) | 身份证 | | **D2** | `02` | 雪域贸易有限公司 | 企业(2) | 本省(2) | USCC | | **D3** | `03` | 高原外向商行 | 企业(2) | 外省(3) | 经营地点有值 | | **DU** | `04` | 待分配承销商 | 个体户(1) | 本市(1) | `account_assigned=0` | | **DA** | `05` | 已分配承销商 | 企业(2) | 本省(2) | `account_assigned=1` | **合法身份证**:`110101199001011234`。**合法 USCC**:`91510000MA62K0260E`。 **合法新增 Body 示例**:`distributorName=测试承销商甲`,`distributorType=1`,`identityNo=110101199001011234`,`contactPhone=13800138000`,`salesDestination=1`。 **界面(UI)测试**:**Playwright** + **Chromium**(`channel: 'chrome'` 使用本机 **Google Chrome**)。 --- ## 一、单元测试用例 | 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 | | --- | --- | --- | --- | --- | --- | --- | --- | --- | | ZCZX-CXSGL-UT-001 | 编号生成 | 首条编号 | 单元测试 | JUnit5 | §2.4 | 库无编号 | `DistributorCodeGenerator.next()` | 返回 `01` | | ZCZX-CXSGL-UT-002 | 编号生成 | 递增补零 | 单元测试 | JUnit5 | §2.4 | 最大号 `08` | `next()` | 返回 `09` | | ZCZX-CXSGL-UT-003 | 编号生成 | 上限拒绝 | 单元测试 | JUnit5 | §2.4 | 最大号 `99` | `next()` | 抛异常;含编号上限 | | ZCZX-CXSGL-UT-004 | 参数校验 | 承销商名称 | 单元测试 | JUnit5 | 1~20 字 | 无 | 空、21 字、合法 trim | 空/超长失败;通过 | | ZCZX-CXSGL-UT-005 | 参数校验 | 个体户身份证 | 单元测试 | JUnit5 | §3.4 | `type=1` | 非法、合法 18 位 | 非法失败;通过 | | ZCZX-CXSGL-UT-006 | 参数校验 | 企业识别号 | 单元测试 | JUnit5 | §3.4 | `type=2` | 非 18 位、合法 USCC | 非法失败;通过 | | ZCZX-CXSGL-UT-007 | 参数校验 | 手机号 | 单元测试 | JUnit5 | 全局 | 无 | 10 位、11 位合法 | 非法失败;通过 | | ZCZX-CXSGL-UT-008 | 参数校验 | 销售去向 | 单元测试 | JUnit5 | §2.3 | 无 | 空、0、4、1/2/3 | 非法失败;1~3 通过 | | ZCZX-CXSGL-UT-009 | 参数校验 | 经营地点长度 | 单元测试 | JUnit5 | ≤50 | 无 | 51 字、50 字 | 51 失败;50 通过 | | ZCZX-CXSGL-UT-010 | 唯一性 | 名称重复 | 单元测试 | JUnit5+Mockito | §3.4 | 同名未删 | `validateUniqueName` | 失败 | | ZCZX-CXSGL-UT-011 | 唯一性 | 身份号重复 | 单元测试 | JUnit5+Mockito | §3.4 | 同号未删 | `validateUniqueIdentity` | 失败 | | ZCZX-CXSGL-UT-012 | Service | 新增落库 | 单元测试 | JUnit5+Mockito | 正常 | Mock Mapper | `insert` 合法行 | `del_flag=0`;`distributor_code` 非空 | | ZCZX-CXSGL-UT-013 | Service | 修改禁改编号 | 单元测试 | JUnit5 | §3.3.1 | 记录 `01` | Body `distributorCode=99` | 库仍为 `01` | | ZCZX-CXSGL-UT-014 | Service | 逻辑删除 | 单元测试 | JUnit5+Mockito | §3.5 | Mock | `remove(id)` | `del_flag=2` | | ZCZX-CXSGL-UT-015 | Service | 删除有未支付订单 | 单元测试 | JUnit5+Mockito | §5.5 | `hasUnpaidOrder=true` | `remove` | 抛「存在未支付订单,无法删除」 | | ZCZX-CXSGL-UT-016 | Mapper | 模糊筛选 SQL | 单元测试 | JUnit5 | §3.6 | 无 | 检查 XML | `LIKE CONCAT('%',…,'%')`;`del_flag=0` | | ZCZX-CXSGL-UT-017 | Mapper | 排序 | 单元测试 | JUnit5 | §3.1.1 | 无 | 检查 XML | `distributor_code ASC, id ASC` | | ZCZX-CXSGL-UT-018 | 登录名 | 拼音首字母+id | 单元测试 | JUnit5 | §2.5 | 无 | `generate("扎西承销商",3L)` | `zxcxs3` | | ZCZX-CXSGL-UT-019 | 分配校验 | 已分配拒绝 | 单元测试 | JUnit5 | §3.4 | `account_assigned=1` | `validateForAssignAccount` | 失败 | | ZCZX-CXSGL-UT-020 | Service | 分配成功 | 单元测试 | JUnit5+Mockito | §3.6 | DU | `assignAccount` | `account_assigned=1`;角色 **104** | | ZCZX-CXSGL-UT-021 | Service | 重复分配 | 单元测试 | JUnit5+Mockito | §3.6 | DA | `assignAccount` | 失败 | | ZCZX-CXSGL-UT-022 | Service | 删除联动 | 单元测试 | JUnit5+Mockito | §3.5 | 已分配 | `deleteByIds` | 联动删用户 | --- ## 二、接口测试用例 | 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 | | --- | --- | --- | --- | --- | --- | --- | --- | --- | | ZCZX-CXSGL-API-001 | 列表 | 默认分页排序 | 接口测试 | Postman | §3.1.1 | 有 D1~D3 | `GET .../list` | `rows`≤20;含 `salesDestinationName`;编号升序 | | ZCZX-CXSGL-API-002 | 列表 | 编号模糊 | 接口测试 | Postman | §2.8 | 有 D1 `01` | `distributorCode=1` | 含 D1;全名 `01` 仍命中 | | ZCZX-CXSGL-API-003 | 列表 | 名称模糊 | 接口测试 | Postman | §2.8 | 有 D2 | `distributorName=雪域` | 含 D2;与全名不等亦可 | | ZCZX-CXSGL-API-004 | 列表 | 模糊无匹配 | 接口测试 | Postman | §2.8 | 已登录 | `distributorName=不存在xyz` | 空列表 | | ZCZX-CXSGL-API-005 | 列表 | 精确不匹配反例 | 接口测试 | Postman | 对比供应商 | 有 D2 全名 | 名称少一字片段错误 | 仍可模糊命中或按输入为空不过滤 | | ZCZX-CXSGL-API-006 | 列表 | 组合筛选 | 接口测试 | Postman | 多条件 | 已登录 | `distributorCode=0`+`distributorName=公司` | 同时满足行 | | ZCZX-CXSGL-API-007 | 列表 | 不含已删除 | 接口测试 | Postman | 逻辑删除 | id 已删 | `GET list` | 无该 id | | ZCZX-CXSGL-API-008 | 新增 | 个体户本市 | 接口测试 | Postman | §5.1 | 已登录 | `POST` 合法 Body `salesDestination=1` | `code=200`;`distributorCode` 2 位 | | ZCZX-CXSGL-API-009 | 新增 | 企业本省 | 接口测试 | Postman | §2.3 | 已登录 | `type=2`+USCC+`salesDestination=2` | 成功 | | ZCZX-CXSGL-API-010 | 新增 | 外省 | 接口测试 | Postman | §2.3 | 已登录 | `salesDestination=3` | 成功;详情销售去向为外省 | | ZCZX-CXSGL-API-011 | 新增 | 缺销售去向 | 接口测试 | Postman | §3.4 | 已登录 | 无 `salesDestination` | 失败 | | ZCZX-CXSGL-API-012 | 新增 | 销售去向非法 | 接口测试 | Postman | §3.4 | 已登录 | `salesDestination=9` | 失败 | | ZCZX-CXSGL-API-013 | 新增 | 名称重复 | 接口测试 | Postman | §5.1.4 | 已有 D1 名 | `POST` 同名 | 失败 | | ZCZX-CXSGL-API-014 | 新增 | 身份号重复 | 接口测试 | Postman | §5.1.4 | 已有 D1 证号 | 同 `identityNo` | 失败 | | ZCZX-CXSGL-API-015 | 新增 | 手机号非法 | 接口测试 | Postman | §2.5 | 已登录 | `contactPhone=123` | 失败 | | ZCZX-CXSGL-API-016 | 新增 | 企业错用身份证 | 接口测试 | Postman | §2.5 | 已登录 | `type=2`+身份证 | 失败 | | ZCZX-CXSGL-API-017 | 详情 | 有效 id | 接口测试 | Postman | §3.2.1 | 已登录 | `GET /{id}` | 含销售去向、审计 | | ZCZX-CXSGL-API-018 | 详情 | 无效/已删 id | 接口测试 | Postman | 异常 | 已登录 | 不存在/已删 | 失败或空 `data` | | ZCZX-CXSGL-API-019 | 修改 | 改经营地点 | 接口测试 | Postman | §5.3 | 有 D1 | `PUT` 改 `businessLocation` | 成功;编号不变 | | ZCZX-CXSGL-API-020 | 修改 | 改销售去向 | 接口测试 | Postman | §5.3 | D1 本市 | `PUT` `salesDestination=3` | 成功;详情为外省 | | ZCZX-CXSGL-API-021 | 修改 | 传编号无效 | 接口测试 | Postman | §3.3.1 | 有 D1 | `PUT` `distributorCode=99` | 仍为 `01` | | ZCZX-CXSGL-API-022 | 修改 | 不存在 id | 接口测试 | Postman | 异常 | 已登录 | 伪造 id `PUT` | 失败 | | ZCZX-CXSGL-API-023 | 删除 | 单条逻辑删 | 接口测试 | Postman | §5.5 | 无关联新行 | `DELETE /{id}` | 成功;列表无 | | ZCZX-CXSGL-API-024 | 删除 | 有未支付订单拒绝 | 接口测试 | Postman | §5.5 | 预置待支付订单 | `DELETE` | 失败;提示未支付 | | ZCZX-CXSGL-API-025 | 删除 | 重复删除 | 接口测试 | Postman | 幂等 | 已删 id | 再次 `DELETE` | 失败或不存在 | | ZCZX-CXSGL-API-026 | 端到端 | CRUD 串联 | 接口测试 | Postman | §4 | 已登录 | `POST`→`list`→`GET`→`PUT`→`DELETE` | 每步成功 | | ZCZX-CXSGL-API-027 | 鉴权 | 未登录 | 接口测试 | curl | 安全 | 无 Token | `GET list` | 401 或统一未登录 | | ZCZX-CXSGL-API-028 | 权限 | 无新增权限 | 接口测试 | Postman | §6 | 仅 list | `POST` | 无权限失败 | | ZCZX-CXSGL-API-029 | 权限 | 无删除权限 | 接口测试 | Postman | §6 | 无 remove | `DELETE` | 无权限失败 | | ZCZX-CXSGL-API-030 | 响应 | 失败可读 | 接口测试 | Postman | 草稿 §8 | 已登录 | 触发缺去向、重复名、手机号错 | `msg` 可区分 | | ZCZX-CXSGL-API-031 | 分配账号 | 成功 | 接口测试 | Postman | §3.6 | DU | `POST .../assignAccount/{id}` | `accountAssigned=1`;角色 **104** | | ZCZX-CXSGL-API-032 | 分配账号 | 重复 | 接口测试 | Postman | §3.6 | DA | 再次调用 | 失败 | | ZCZX-CXSGL-API-033 | 删除 | 已分配联动 | 接口测试 | Postman | §3.5 | 已分配无关联行 | `DELETE` | 用户已删 | | ZCZX-CXSGL-API-034 | 权限 | 无分配权限 | 接口测试 | Postman | §4 | 无 assignAccount | `POST assignAccount` | 无权限失败 | --- ## 三、界面测试用例(UI) **测试工具**:**Playwright** + **Chromium**(`channel: 'chrome'` 使用本机 **Google Chrome**)。 | 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 | | --- | --- | --- | --- | --- | --- | --- | --- | --- | | ZCZX-CXSGL-UI-001 | 列表 | 默认展示 | UI 测试 | Playwright+Chrome | §5.2.3 | 已登录;有数据 | 进入「承销商管理」 | 含编号、名称、类型、识别号、电话、地点、销售去向、操作 | | ZCZX-CXSGL-UI-002 | 列表 | 编号模糊筛选 | UI 测试 | Playwright+Chrome | §2.8 | 有 D1 `01` | 编号输入 `1`→搜索 | 含 D1 | | ZCZX-CXSGL-UI-003 | 列表 | 名称模糊筛选 | UI 测试 | Playwright+Chrome | §2.8 | 有 D2 | 名称输入「雪域」→搜索 | 含 D2 | | ZCZX-CXSGL-UI-004 | 列表 | 无结果 | UI 测试 | Playwright+Chrome | §2.8 | 已登录 | 输入不存在关键字→搜索 | 空列表或空状态 | | ZCZX-CXSGL-UI-005 | 列表 | 重置 | UI 测试 | Playwright+Chrome | §5.2 | 已筛选 | 搜索→重置 | 条件清空 | | ZCZX-CXSGL-UI-006 | 新增 | 个体户本市 | UI 测试 | Playwright+Chrome | §5.1 | 已登录 | 新增→个体户→本市→填必填→确定 | 成功;列表新行 | | ZCZX-CXSGL-UI-007 | 新增 | 企业本省 | UI 测试 | Playwright+Chrome | §5.1 | 已登录 | 企业+主体识别号+本省→确定 | 成功 | | ZCZX-CXSGL-UI-008 | 新增 | 销售去向必选 | UI 测试 | Playwright+Chrome | §5.1.4 | 新增 | 不选销售去向→确定 | 校验失败 | | ZCZX-CXSGL-UI-009 | 新增 | 类型切换标签 | UI 测试 | Playwright+Chrome | §5.1.2 | 新增 | 个体户↔企业 | 标签在身份证/主体识别号间切换 | | ZCZX-CXSGL-UI-010 | 新增 | 编号只读 | UI 测试 | Playwright+Chrome | §2.4 | 打开新增 | 查看编号控件 | 只读或保存后自动生成 | | ZCZX-CXSGL-UI-011 | 新增 | 缺必填 | UI 测试 | Playwright+Chrome | §5.1.4 | 新增 | 留空名称或手机→确定 | 校验失败 | | ZCZX-CXSGL-UI-012 | 新增 | 名称 20 字 | UI 测试 | Playwright+Chrome | §5.1.1 | 新增 | 超 20 字 | 无法输入或保存失败 | | ZCZX-CXSGL-UI-013 | 新增 | 取消 | UI 测试 | Playwright+Chrome | §5.1.3 | 新增 | 填一半→取消 | 无新行 | | ZCZX-CXSGL-UI-014 | 详情 | 只读含去向 | UI 测试 | Playwright+Chrome | §5.4 | 有 D3 | 查看 | 只读;销售去向为外省;含审计 | | ZCZX-CXSGL-UI-015 | 编辑 | 修改地点 | UI 测试 | Playwright+Chrome | §5.3 | 有 D1 | 编辑→改经营地点→确定 | 列表已更新;编号不变 | | ZCZX-CXSGL-UI-016 | 编辑 | 编号不可改 | UI 测试 | Playwright+Chrome | §5.3 | 编辑 D1 | 查看编号 | 只读 | | ZCZX-CXSGL-UI-017 | 编辑 | 改销售去向 | UI 测试 | Playwright+Chrome | §5.3 | D1 本市 | 改外省→保存 | 列表/详情为外省 | | ZCZX-CXSGL-UI-018 | 删除 | 确认删除 | UI 测试 | Playwright+Chrome | §5.5 | 无关联行 | 删除→确认 | 行消失 | | ZCZX-CXSGL-UI-019 | 删除 | 取消删除 | UI 测试 | Playwright+Chrome | §5.5 | 任意行 | 删除→取消 | 行仍在 | | ZCZX-CXSGL-UI-020 | 端到端 | 全流程 | UI 集成 | Playwright+Chrome | §4 | 权限齐备 | 新增→模糊查→看→改→删 | 无报错 | | ZCZX-CXSGL-UI-021 | 权限 | 只读角色 | UI 测试 | Playwright+Chrome | §6 | 无写权限 | 进入模块 | 无新增/编辑/删除 | | ZCZX-CXSGL-UI-022 | 详情 | 从详情编辑 | UI 测试 | Playwright+Chrome | §5.4 | 查看 D1 | 点「编辑」 | 进入编辑弹窗 | | ZCZX-CXSGL-UI-023 | 列表 | 账号分配列 | UI 测试 | Playwright+Chrome | §5.2.3 | DU、DA | 查看列表 | 未分配/已分配展示正确 | | ZCZX-CXSGL-UI-024 | 分配账号 | 成功 | UI 测试 | Playwright+Chrome | §5.6 | DU | 分配账号→确认 | 成功;无二次入口 | | ZCZX-CXSGL-UI-025 | 分配账号 | 已分配无按钮 | UI 测试 | Playwright+Chrome | §5.6 | DA | 操作列 | 无分配账号 | | ZCZX-CXSGL-UI-026 | 权限 | 无分配权限 | UI 测试 | Playwright+Chrome | §6 | 无 assignAccount | 进入模块 | 无分配按钮 | --- ## Playwright 与谷歌浏览器(实施提示) - 安装:`npm i -D @playwright/test`;`npx playwright install chrome`。 - 配置:`use: { channel: 'chrome', locale: 'zh-CN', baseURL: 'http://localhost:80' }`;`storageState` 复用登录态。 - 路由:`page.goto('/tradeMarket/distributor')`(以菜单 `component` 为准)。 - 模糊搜索:`page.getByLabel('承销商编号').fill('1')` 后点击「搜索」。 - 销售去向:`page.getByLabel('销售去向').click()` 后选「本市」等选项。 --- ## 覆盖对照 | 类别 | 单元 UT | 接口 API | 界面 UI | | --- | --- | --- | --- | | 正常流程 | UT-012 | API-008~010、017、019~020、026 | UI-006~007、014~017、020 | | 异常流程 | UT-003 | API-011~016、022、024~025 | UI-008、011、018~019 | | 业务约束 | UT-001~011 | API-002~004、013~016、021 | UI-002~004、009~010、016 | | 模糊筛选 | UT-016 | API-002~006 | UI-002~004 | | 销售去向 | UT-008 | API-011~012、020 | UI-006~008、017 | | 逻辑删除 | UT-014 | API-007、023~025 | UI-018 | | 权限/鉴权 | — | API-027~029、034 | UI-021、026 | | 分配账号 | UT-018~022 | API-031~033 | UI-023~025 | --- ## 功能需求追溯(自查) | 需求章节 | 要点 | 主要对应用例 | | --- | --- | --- | | §5.1 新增 | 字段、销售去向 | UT-004~009、012;API-008~016;UI-006~013 | | §5.2 列表 | **模糊**筛选 | UT-016;API-002~006;UI-002~005 | | §5.3 修改 | 编号不可改 | UT-013;API-019~021;UI-015~017 | | §5.4 详情 | 只读 | API-017;UI-014、022 | | §5.5 删除 | 逻辑删、未支付拦截 | UT-014~015;API-023~025;UI-018~019 | | §2.3 销售去向 | 三档 | UT-008;API-008~012、021;UI-006~008、018 | | §2.4 编号 | 01~99 | UT-001~003;API-008;UI-010 | | §6 权限 | 按钮级 | API-028~029、034;UI-021、026 | | §5.6 分配账号 | 角色 104、一次 | UT-018~022;API-031~033;UI-023~025 | --- ## 修订记录 | 版本 | 说明 | | --- | --- | | 1.0 | 初版:单元 18、接口 31、UI 23;覆盖 CRUD、模糊筛选、销售去向、编号;Playwright+Chrome;前缀 **ZCZX-CXSGL** | | 1.1 | 移除车辆号牌相关用例;章节引用 §2.8;用例编号重排(单元 17、接口 30、UI 22) | | 1.2 | 增补分配账号:UT-018~022、API-031~034、UI-023~026;样本 DU/DA | | 1.3 | 删除拦截:UT-015、API-024 对齐未支付订单 |