---
id: 026
title: E2E 测试闭环 — 测试号白名单 + 支付沙箱 + Claude 自动化
status: closed
labels: [testing, tech-debt, P0]
assignee: team-lead
created_at: 2026-04-23
closed_at: 2026-04-23
---

# #026 E2E 测试闭环

## 背景

2026-04-23 老板明确要求：**所有功能闭环测试不再依赖人工**，Claude 自己能跑端到端。

现状盘点：
- **SMS**：`XIANGQIN_SMS_PROVIDER=mock` 全局切，但这是 dev hack，不能在 staging/prod 用；真号要人读验证码
- **支付宝**：`mail.buy_envelopes(mock=True)` 直接置 paid，真付从未 E2E 测
- **实名 / 绿网**：都还没做
- **OSS 照片**：测试用 prod bucket（不隔离）

详细策略见 [blueprints/testing-strategy.md](../blueprints/testing-strategy.md)。

## 做什么（分阶段）

### 阶段 1：SMS 测试号白名单（本 issue 核心）

1. `auth.register()` 加白名单分支：
   - `XIANGQIN_TEST_PHONES` env（逗号分隔白名单）
   - `XIANGQIN_TEST_OTP` env（固定验证码）
   - 命中 → 不调 SMS provider + code = TEST_OTP
   - 未命中 → 原流程（mock / aliyun provider）
2. `test/test_auth.py` 加单测覆盖：
   - 白名单号 + 正确 TEST_OTP 可登录
   - 白名单号 + 错误 code 拒绝
   - 非白名单号不受 TEST_OTP 影响
   - 未设 TEST_OTP 时白名单也不生效（prod 默认安全态）
3. 新建 `test/test_e2e_onboarding.py`（E2E 套件，用 FastAPI TestClient + aliyun provider + 白名单号）：
   - 注册 → verify → profile set → query → send envelope (mock) → inbox list → inbox reply

### 阶段 2：支付宝沙箱（独立开 issue 或继承本 issue？）

- env `XIANGQIN_ALIPAY_SANDBOX=1` 切 endpoint + sandbox key
- E2E 测试加"买信封走沙箱 precreate + 模拟 webhook 回调 → paid_remaining += 10"
- 决策：**另开 issue #027** 避免本 issue 太胖

### 阶段 3：实名 / 绿网沙箱

做 issue #009（实名）和 FEAT-010（绿网）时一并接，不提前在本 issue 做。

### 阶段 4：OSS test bucket 隔离

建 `agentaily-xiangqin-photos-test` bucket；CI / E2E 走 test bucket；加清理 fixture。

## Acceptance Criteria（阶段 1）

- [ ] `auth.py` 新增测试号白名单分支
- [ ] test/test_auth.py 4 个新单测通过
- [ ] test/test_e2e_onboarding.py 完整注册 → 发信闭环通过
- [ ] blueprints/testing-strategy.md 已沉淀（本 issue 建立时一起写）
- [ ] CI 跑 ✅
- [ ] staging env 配 `XIANGQIN_TEST_PHONES` + 随机 `XIANGQIN_TEST_OTP`，release.yml 注入

## 相关

- blueprint: [testing-strategy.md](../blueprints/testing-strategy.md)
- 后续 issue: #027 alipay sandbox（待建）、#009 实名、FEAT-010 绿网

## 讨论

### 2026-04-23 @team-lead

**阶段 1+2+3 全完成**：
- **阶段 A SMS 白名单**：`auth.py` + env + 单测 + staging env 注入（v0.5.4）
- **阶段 B alipay sandbox**：`alipay.py` 切 env + vault 声明 `alipay_sandbox` + key PKCS#8 修复（#029）+ `scripts/deploy-vault-to-alpha.sh` 本地一键推
- **阶段 C CI 冒烟**：`deploy-staging.yml` 最后一步自动跑"注册 → verify → 买信封 → sandbox qr_code 校验"，每次 main push 都真跑一次

**验证**：commit `f2b1331` 后 deploy-staging 日志:
```
→ register 13900000002
→ verify with TEST_OTP → token len=32
→ envelope buy (sandbox) → qr_code=https://qr.alipay.com/bax03005jwsebsweayie0078
✓ E2E sandbox precreate 通，qr_code 格式合法
```

**阶段 4 (实名沙箱) + 阶段 5 (绿网沙箱)** 留给对应功能立项时接入，不在本 issue 继续。
