# SaaS E2E 测试框架（测试环境版）

当前框架使用 Python 3.11 + pytest + Playwright，已先落地 `E2E-SAAS-001`：

租户平台注册企业 -> SaaS 主站企业认证审核通过 -> 租户端验证认证状态。

## 环境准备

```powershell
py -3.11 -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
python -m playwright install chromium
Copy-Item .env.example .env
```

## 运行

```powershell
.\.venv\Scripts\Activate.ps1
pytest e2e/tests/注册登录权限/test_e2e_saas_001_enterprise_certification.py
```

手动短信验证码模式需要允许终端输入，建议使用：

```powershell
.\scripts\run_e2e_with_allure.ps1
```

测试执行后会生成 Allure 原始结果：

```text
reports/allure-results
```

如果本机已安装 Allure CLI，可生成 HTML 报告：

```powershell
allure generate reports/allure-results -o reports/allure-report --clean
allure open reports/allure-report
```

也可以直接使用项目脚本：

```powershell
.\scripts\run_e2e_with_allure.ps1
```

## 用例执行分层

当前用例分成三类：

- `e2e_seed`：种子用例，会注册或生成后续流程需要的账号数据。
- `e2e_standalone`：可作为入口单独运行；如果依赖台账，也有兜底测试账号。
- `e2e_chain`：链路推进用例，需要 `runtime/e2e_accounts.json` 中已有匹配状态的数据。
- `e2e_ledger`：会从 `runtime/e2e_accounts.json` 读取账号，并在成功后更新账号状态。

账号台账文件：

```text
runtime/e2e_accounts.json
```

## 用例执行矩阵

| 用例 | 类型 | 是否适合直接跑 | 前置数据 | 成功后更新 |
| --- | --- | --- | --- | --- |
| `E2E-SAAS-001` 注册商户并完成主站认证 | `e2e_seed`, `e2e_standalone` | 是 | 无。需要短信验证码/图形验证码能力 | 新增 `certification_status=approved` 账号 |
| `E2E-SAAS-003` 已认证商户开通丸友集 | `e2e_ledger`, `e2e_standalone` | 是 | 优先取 `approved + not_opened` 丸友集账号；无台账时用 `.env` 固定已认证账号 | 更新 `wanyouji_status=opened` |
| `E2E-SAAS-004` 已认证商户开通丸掌柜 | `e2e_ledger`, `e2e_standalone` | 单独准备丸掌柜账号时运行 | 优先取 `approved + not_opened` 丸掌柜账号；无台账时用 `.env` 固定已认证账号 | 更新 `wanzhanggui_status=opened` |
| `E2E-AUTH-001` 丸友集绑定默认丸掌柜并配置权限 | `e2e_ledger`, `e2e_chain` | 有数据才适合 | 需要 `wanyouji_status=opened` 且未绑定，或 `permission_pending` 账号 | 更新绑定状态为 `bound` |
| `E2E-PUSH-001` 丸掌柜新增丸友集工作室授权 | `e2e_ledger`, `e2e_chain` | 有数据才适合 | 需要丸友集已绑定目标丸掌柜，但还没有 `workshop_authorizations` | 更新 `workshop_authorizations` |
| `E2E-PUSH-003` 丸掌柜新增分单策略 | `e2e_ledger`, `e2e_chain` | 有数据才适合 | 需要已完成工作室授权。多工作室同时分发/多平台分发至少需要 2 个已授权工作室。策略类型通过 `E2E_PUSH_STRATEGY_TYPE` 指定 | 记录 `dispatch_strategies` |
| `E2E-MAIN-001` 主流程闭环 | `e2e_ledger`, `e2e_chain` | 是 | 固定使用丸掌柜账号 `19147509308`，依次执行除 `E2E-SAAS-004` 外的主链路 | 完成注册、开通、授权、配置、发单、接单验证 |

## 推荐执行入口

只生成基础账号：

```powershell
pytest -m e2e_seed --alluredir=reports/allure-results
```

只跑适合直接启动的用例：

```powershell
pytest -m e2e_standalone --alluredir=reports/allure-results
```

跑后续链路推进用例：

```powershell
pytest -m e2e_chain --alluredir=reports/allure-results
```

按当前完整链路顺序跑一次：

```powershell
pytest `
  e2e/tests/注册登录权限/test_e2e_saas_001_enterprise_certification.py `
  e2e/tests/应用开通授权/test_e2e_saas_003_wanyouji_app_opening.py `
  e2e/tests/应用开通授权/test_e2e_auth_001_authorization_closed_loop.py `
  e2e/tests/推单配置/test_e2e_push_001_wanzhanggui_workshop_authorization.py `
  e2e/tests/推单配置/test_e2e_push_003_dispatch_strategy.py `
  --alluredir=reports/allure-results
```

直接执行主流程闭环：

```powershell
pytest e2e/tests/组合大流程/test_e2e_main_001_full_closed_loop.py --alluredir=reports/allure-results
```

主流程默认策略类型为 `单平台指定`，可通过 `E2E_MAIN_STRATEGY_TYPE` 切换：

```powershell
$env:E2E_MAIN_STRATEGY_TYPE="多工作室同时分发"
pytest e2e/tests/组合大流程/test_e2e_main_001_full_closed_loop.py --alluredir=reports/allure-results
```

当前主链路默认使用已开通丸掌柜账号：

```text
19147509308 / test123456
```

`E2E-SAAS-004` 暂时作为独立的丸掌柜账号准备用例，不放入默认主链路。需要新丸掌柜账号时再单独执行：

```powershell
pytest -m e2e_saas_004 --alluredir=reports/allure-results
```

单独跑某条链路用例时，如果前置数据不足，脚本会 `skip` 并提示缺少哪类台账状态。此时先跑上游用例补数据即可。

`E2E-PUSH-003` 默认策略类型为 `单平台指定`，可通过环境变量切换：

```powershell
$env:E2E_PUSH_STRATEGY_TYPE="多工作室同时分发"
pytest -m e2e_push_003 --alluredir=reports/allure-results
```

可选策略类型：

```text
单平台指定
多工作室同时分发
多平台分发
```

## 说明

- 注册密码统一为 `test123456`，可在 `.env` 的 `E2E_REGISTER_PASSWORD` 调整。
- 手机号默认随机生成；如页面提示已注册，脚本会尝试退出并换号重新注册。
- 短信验证码支持 `manual`、`feishu`、`static` 三种模式；当前建议先用 `manual`，脚本会提示你在终端输入飞书测试通知群里的验证码。
- 页面选择器已按常见中文表单和按钮写成兜底形式；如果实际页面字段文案不同，只需要在 `e2e/pages/` 中补充定位器。
