--- name: 测试 register bet win overview: 设计一套不改代码的联调测试方案,覆盖 register、bet、win(含中间派奖+最终结算)主流程、幂等与关键校验。输出可直接执行的请求序列和验收点。 todos: - id: collect-endpoints content: 整理 register/bet/win 的可调用入口与参数最小集合 status: completed - id: define-test-cases content: 设计主链路、幂等、参数异常三类用例 status: completed - id: prepare-request-templates content: 产出按执行顺序排列的请求模板与预期结果 status: completed isProject: false --- # Register/Bet/Win 测试计划 ## 目标 - 用最小链路验证 `register -> bet -> win` 的资金变更与返回口径。 - 覆盖 `win` 的两阶段结算(`is_end=0` 中间派奖、`is_end=1` 最终结算)。 - 覆盖关键风控点:幂等(重复 `biz_id`)、参数校验(`round_id`、`is_end`、金额)。 ## 关键实现依据(用于制定用例) - 接口入口与兼容关系:[`app/api/controller/WalletController.php`](app/api/controller/WalletController.php) - `wallet/bet`、`wallet/win` 为独立入口;`wallet/update(type=bet|win)` 复用同链路。 - 业务分发与资金处理:[`app/api/logic/WalletLogic.php`](app/api/logic/WalletLogic.php) - `register` 走 `RegisterService::execute`。 - `bet` 按 `biz_id` 做幂等。 - `win`:`is_end=0` 只累计待结算金额,`is_end=1` 才真正入账并清理缓存。 - 注册落账与 Lot 初始化:[`app/service/wallet/RegisterService.php`](app/service/wallet/RegisterService.php) - 注册会初始化钱包、统计行,并按 `fee/bonus` 创建 Deposit/Bonus Lot。 - 请求参数约束:[`app/validator/Wallet2Validator.php`](app/validator/Wallet2Validator.php) - bet/win 必传 `round_id`,`is_end` 仅支持 `0/1`。 ## 测试范围与步骤 1. **准备阶段** - 选一个全新 `uid`(避免历史账干扰)。 - 固定 `currency/source/organization`,并准备唯一 `biz_id` 生成规则(例如带时间戳)。 2. **主链路测试(Happy Path)** - 调 `wallet/update` 发起 `register`(`type=register`,带 `fee` 与 `bonus`)。 - 调 `wallet/wallet` 查询余额基线。 - 调 `wallet/bet`(带 `round_id`)验证扣款与返回结构。 - 调 `wallet/win` 且 `is_end=0`:确认返回中 `withdraw` 临时增加(待结算展示),但不落最终账。 - 调 `wallet/win` 且 `is_end=1`:确认最终入账,并清理该 `round_id` 的待结算累计。 3. **幂等与异常场景** - 重放同一 `bet.biz_id`:应命中幂等,余额不重复变化。 - 重放同一 `win.biz_id`:应命中幂等,余额不重复变化。 - 缺失 `round_id` 调 bet/win:应返回参数错误。 - 传非法 `is_end`(如 2):应返回参数错误。 4. **验收口径** - 余额变化符合顺序:下注优先扣 Bonus,再 Deposit,再 Withdraw。 - `win` 仅在最终结算时落地资金结果;中间派奖只累计。 - 重复请求无重复记账,返回语义稳定。 ## 建议请求流(逻辑顺序图) ```mermaid flowchart TD registerCall[register(update)] --> walletCheck1[wallet_query] walletCheck1 --> betCall[bet] betCall --> winMid[win_is_end_0] winMid --> walletCheck2[wallet_query] walletCheck2 --> winFinal[win_is_end_1] winFinal --> walletCheck3[wallet_query] walletCheck3 --> idemReplay[replay_same_biz_id] ``` ## 交付物 - 一份可直接在 Postman/curl 执行的请求模板(含示例 body)。 - 一份对照清单:每一步的“预期返回 + 余额期望 + 幂等期望”。