# {模块名称} — 业务流程测试编排

> **版本**: v3.0
> **创建日期**: YYYY-MM-DD
> **最后更新**: YYYY-MM-DD
> **维护者**: FFOA QA Team
> **参考文档**: `05-ui-interaction-spec.md`, `09-test-scenarios.md`
> **执行方式**: AI + Playwright MCP（不编写测试代码）
> **前置条件**: 后端集成测试（L1）全部通过

---

## 本文档的定位

- `09-test-scenarios.md` 定义"测什么"（场景清单：正常/异常/边界/权限）
- **本文档（10-e2e-test-spec.md）定义"怎么测"**（流程编排剧本：角色、步骤序列、步骤间依赖、每步断言）
- L2 MCP 执行以本文档为主驱动，以 09 为场景覆盖参考

---

## 执行规范

### 鉴权
- 使用 `storageState` 避免重复登录
- 首次登录后保存 storageState 供后续流程复用

### 元素定位
- 使用 accessibility tree（role/name），不使用 data-testid
- 被遮挡元素使用 evaluate 点击
- React 受控输入使用 nativeInputValueSetter

### 断言要求
- 每个步骤至少 1 个断言
- 页面导航后断言 URL 或页面标题
- 数据操作后断言数据回显正确

### 等待策略
- domcontentloaded + 条件等待，禁止硬编码 waitForTimeout

### 测试账号

| 账号 | 密码 | 角色 | 组织 |
|------|------|------|------|
| {admin账号} | {密码} | 管理员 | 全部 |
| {employee账号} | {密码} | 员工 | {所属组织} |
| {leader账号} | {密码} | 主管 | {所属组织} |

---

## 流程依赖关系

> 流程按编号顺序执行，后续流程依赖前置流程的输出。跳过前置流程会导致后续流程缺少必要数据。

```
流程 1（管理员初始化）
  └→ 流程 2（员工操作） ── 依赖流程 1 创建的周期/配置
       └→ 流程 3（主管操作） ── 依赖流程 2 员工提交的数据
            └→ 流程 4（结果确认） ── 依赖流程 3 主管审批的结果
```

---

## 流程 1：{管理员初始化}（P0）

**角色**: {admin账号}（管理员）
**前置**: {描述前置条件，如"空数据库"或"流程 X 已完成"}
**目标**: {描述本流程要验证什么}

### 步骤

| # | 操作 | 断言 |
|---|------|------|
| 1.1 | 登录 {admin账号} → 进入{目标页面} | {预期结果，如"左侧导航显示xx菜单"} |
| 1.2 | {具体操作} | {预期结果} |
| 1.3 | {具体操作} | {预期结果} |

---

## 流程 2：{员工操作}（P0）

**角色**: {employee账号}（员工）
**前置**: 流程 1 完成（{具体依赖说明}）
**目标**: {描述本流程要验证什么}

### 步骤

| # | 操作 | 断言 |
|---|------|------|
| 2.1 | 登录 {employee账号} → 进入{目标页面} | {预期结果} |
| 2.2 | {具体操作} | {预期结果} |

### 角色切换说明
> 当流程中需要切换角色时（如从员工切到主管），用对应账号重新登录或加载对应 storageState。

---

## 流程 N：{可选流程}（P1）

**角色**: {账号}
**前置**: {依赖的流程编号}
**目标**: {描述}

### 步骤

| # | 操作 | 断言 |
|---|------|------|
| N.1 | ... | ... |

---

## 编写指南

### 流程粒度
- 每个流程对应一个**角色的一段连续操作**
- 需要切换角色时，开始新流程
- P0 流程必须全部执行，P1 按需

### 步骤编写要求
- 操作列使用用户视角描述（"点击xx按钮"、"填写xx字段"），不使用技术术语
- 断言列描述可观察的结果（"Toast 显示xx"、"列表新增一行"、"状态变为xx"）
- 写操作后必须有状态验证断言（提交后按钮变 disabled、列表刷新等）

### 流程间数据传递
- 如果流程 2 依赖流程 1 创建的数据，在流程 2 的"前置"中明确写出
- 具体的数据标识（如周期名称、KPI 名称）应在步骤中写明，便于 MCP 定位

### 跨页面状态联动
- 模块 A 操作后，需在模块 B 页面验证状态更新的，作为独立步骤写入
- 例：员工自评完成后，切换到主管账号验证"待我评估"列表出现对应条目
