E

E2E测试执行引擎

作者:鹿Sir开发工具v1

基于项目测试用例执行E2E测试,通过浏览器自动化验证远程环境功能,记录Bug到Markdown,支持断点续测,生成测试报告。

下载量
248
点赞
62
价格
免费

技能文档

---
name: e2e-test-runner
title: E2E测试执行引擎
category: 开发工具
description: 基于项目测试用例执行E2E测试,通过浏览器自动化验证远程环境功能,记录Bug到Markdown,支持断点续测,生成测试报告。
---

# QA E2E Runner(E2E 测试执行技能)

## Overview

本技能用于对远程测试环境执行端到端(E2E)测试。AI 从 `test-project/ai-version/` 读取测试用例,通过 Browser Agent 操控浏览器逐步验证功能,将发现的 Bug 记录到 Markdown 文件,支持中断后断点续测,并在测试完成后生成 Markdown 格式的测试报告。

**关键特性:**
- 自动读取配置:如果当前项目存在 `test-config.md`,自动读取作为默认配置;不存在则询问用户
- 断点续测:通过进度文件追踪执行状态,中断后可从上次位置继续
- Bug 追踪:以 Markdown 格式记录所有发现的 Bug,字段完整、便于跟踪
- 测试报告:自动生成包含统计、模块分析、风险建议的 Markdown 报告

---

## 路径配置

本技能中所有路径均相对于**仓库根目录** `c:\TestTools\code\busyming-mcp-service` 描述。如果项目结构不同,仅需在本章节调整对应路径,其他章节引用将自动沿用。

| 路径 | 用途 |
|------|------|
| `test-project/ai-version/` | 测试用例源文件(AI 执行依据,只读) |
| `test-project/bug-reports/` | Bug Markdown 报告目录,按 `YYYYMMDD` 日期分子文件夹 |
| `test-project/test-reports/` | Markdown 格式测试报告 |
| `test-project/test-progress.json` | 断点续测进度文件 |
| `test-config.md`(项目根目录下) | 测试环境默认配置文件(可选) |

---

## 使用方式(How to Use)

通过以下方式调用本技能:

```
/qa-e2e-runner
```

或附带参数:

```
/qa-e2e-runner --resume          # 从上次中断处继续执行
/qa-e2e-runner --module 001      # 仅执行指定模块
/qa-e2e-runner --module 001,003  # 仅执行多个指定模块
/qa-e2e-runner --quick              # 冒烟模式:仅执行 P0 优先级用例
/qa-e2e-runner --priority P0,P1     # 指定优先级范围
/qa-e2e-runner --quick --module 001 # 组合使用
```

---

## 执行粒度与自动串行策略

### 核心原则

Browser Agent 存在上下文窗口限制,全量测试必须拆分为小批次串行执行,由 Leader 自动调度,**全程无需用户干预**。

### 规则

#### RULE-EXEC-001:单批次用例上限

- 每个 Browser Agent 单次执行**不超过 15 个用例**
- 如果单模块用例数 ≤ 15:一个 Agent 执行完整模块
- 如果单模块用例数 > 15:按优先级拆分为多批次(P0 优先),每批 ≤ 15 个

#### RULE-EXEC-002:自动串行调度

- Leader 按模块编号顺序(001 → 012)逐个调度 Browser Agent
- 当前模块所有批次执行完毕后,自动启动下一模块
- 无需用户确认或手动触发

#### RULE-EXEC-003:弹窗自动处理

- Browser Agent 遇到 confirm/alert/prompt 弹窗时,必须立即使用 handle_dialog 工具处理
- **禁止**等待用户手动干预
- **注意:handle_dialog 仅对浏览器原生弹窗(alert/confirm/prompt)有效**,对于 IDE 级弹窗或自定义组件弹窗无效,此类情况参见 RULE-EXEC-007B
- 其他业务弹窗:根据上下文选择合适操作

#### RULE-EXEC-004:进度持久化

- 每完成一个模块,立即更新 test-progress.json 中该模块状态
- 记录格式:`{ "module": "001", "status": "completed", "passed": X, "failed": X, "skipped": X }`
- 支持中断恢复:重新启动时从 test-progress.json 中读取已完成模块,跳过已完成的

#### RULE-EXEC-005:单 Agent 职责边界

- 每个 Browser Agent 只负责执行用例 + 记录结果
- 禁止在 Agent 内生成最终测试报告(由 Leader 汇总)
- Agent 输出格式固定为结构化表格(用例ID/名称/状态/备注)

#### RULE-EXEC-006:失败不阻断

- 单个用例失败不阻断后续用例执行
- 单个模块全部失败不阻断下一模块调度
- 连续 5 个用例中失败 ≥ 3 个时:自动重新登录后继续

#### RULE-EXEC-007:页面导航优先于URL猜测

- Browser Agent 进入新模块时,**必须优先通过导航菜单或页面内链接**进入目标页面
- **禁止**直接猜测URL路径访问(SPA应用的路由可能是hash路由如 `#/audit`,直接访问会404)
- 导航策略优先级:
  1. 点击顶部导航栏菜单项(如"审计")
  2. 点击页面内的跳转链接(如"前往密钥管理")
  3. 从测试用例文件中读取明确的页面路径
  4. 最后才尝试直接URL访问
- 如果通过URL直接访问返回404,**不可**立即判定为"模块未部署",必须回到首页通过导航菜单重试

#### RULE-EXEC-007B:强制重登保护

- 当以下任一情况发生时,必须**自动重新登录并清除浏览器缓存**:
  1. 页面显示"会话已过期"提示
  2. 页面被自动重定向到登录页(URL 变为 login 或出现登录表单)
  3. 页面显示"请重新登录"或"登录已失效"等文案
  4. 登录态丢失(用户头像消失、权限菜单缺失)
- **禁止依赖 handle_dialog 处理登出弹窗**(该弹窗可能是 IDE 级弹窗,无法被浏览器捕获)
- 重新登录后必须清除所有缓存(localStorage/sessionStorage 中的非认证数据 + HTTP 缓存),确保后续测试不受脏数据影响

#### RULE-EXEC-008:禁止执行会触发登出的测试操作

- Browser Agent **绝对禁止**执行以下操作:
  1. 清除/修改 localStorage/sessionStorage 中的认证token
  2. 调用登出API或点击登出按钮
  3. 任何会导致当前登录态失效的操作
- 原因:这些操作会触发系统级登出确认弹窗(非浏览器原生dialog),Browser Agent无法处理该弹窗,会导致浏览器完全卡死,阻断所有后续测试
- 涉及的用例类型(如"清除Token后跳转登录页"、"Token篡改后跳转"等)必须标记为 skip(skip_reason: `cannot_simulate`),归入「需人工验证清单」
- 如果测试用例描述中包含"清除token"、"token失效"、"登出"、"退出登录"等关键词,直接跳过,不得尝试执行

> **执行约束**:本章所有涉及"清除Token"、"篡改Token"、"触发登出"的测试操作,受 RULE-EXEC-008 约束——Browser Agent 禁止执行此类操作。相关用例统一标记为 `skip`(skip_reason: `cannot_simulate`),归入「需人工验证清单」。本章规则仅用于定义测试覆盖维度和用例生成,不影响自动化执行决策。

#### RULE-EXEC-009:未开发模块排除规则

- 以下情况的模块视为**未开发模块**,不纳入测试范围:
  1. 导航栏无入口 **且**
  2. 其他已开发页面中无任何跳转链接指向该模块 **且**
  3. 直接访问对应路由hash后,页面未加载该模块内容(仍显示首页或空白)
  - 以上三条必须**同时满足**才能判定为未开发
- 判定时机:每次全量测试开始前,先执行"模块可达性扫描"——逐个检查测试用例文件对应的模块页面是否可达
- 可达性验证方式(任一方式可达即判定为已开发):
  1. 顶部导航栏有入口
  2. 其他已开发页面中有链接/按钮可跳转到该模块
  3. 直接访问路由hash后页面正常加载了模块内容(非首页、非空白、非404)
- 未开发模块不执行用例、不计入统计、不记录Bug
- 测试报告中单独列出"未纳入测试的模块"及判定依据

#### RULE-EXEC-010:字段准确性校验禁止使用造数据替代真实链路

- 涉及**字段准确性校验**的测试用例(如审计日志的caller、callTime等),**必须基于真实业务操作产生的数据**进行验证
- **禁止**通过SQL插入或API直接写入"已知正确值"来替代真实链路验证
- 正确做法:先执行真实业务操作(如用API Key调用MCP工具)→ 等待数据生成 → 再验证各字段是否正确记录
- SQL造数据仅允许用于:分页测试、排序测试、大数据量压力测试等不涉及字段来源准确性的场景
- (同时覆盖漏测防护场景:造数据掩盖真实Bug)

#### RULE-EXEC-011:浏览器原生导航行为验证

- 每个页面的测试用例中,必须包含对**浏览器返回按钮**行为的验证:
  1. 从页面A导航到页面B后,点击浏览器返回按钮,必须回到页面A
  2. SPA应用中,路由切换必须正确管理 history 栈,不得出现返回到非预期页面的情况
- 验证场景优先级:
  - **P1**:详情页返回列表页(如MCP详情页→MCP列表页)
  - **P2**:跨模块导航返回(如从审计页点击链接进入MCP详情页→返回审计页)
- 执行方式:在进入目标页面后,调用浏览器返回操作(`history.back()`或点击返回按钮),验证URL和页面内容是否为预期的上一页

#### RULE-LEAK-003 & 005:E2E测试漏测防护规则(强制)

> 注:RULE-LEAK-001已融入RULE-EXEC-010,RULE-LEAK-002已融入Skip判定规则,RULE-LEAK-004已融入测试执行完整性保障章节。

基于v0.14全量测试漏测复盘,以下漏测根因必须在测试执行中主动防御:

| 编号 | 漏测类型 | 防护规则 | 违反后果 |
|------|---------|---------|----------|
| RULE-LEAK-003 | Failed未诊断根因 | 用例Failed后,不能仅描述表象(如"数据为空"),**必须追加根因诊断**(如"认证失败导致接口返回空") | 报告中Failed用例必须附带根因分析 |
| RULE-LEAK-005 | 判定逻辑过松 | 验证字段值时,不能仅判断"非空"或"有区分",**必须验证具体内容是否符合业务预期**(如caller应为中文姓名,而非仅"不同账号caller不同") | 判定条件必须具体到业务语义层面 |

**Skip合法性判定标准:**
- ✅ 合法Skip:功能确认未开发/未上线(产品确认),且用例文档中标注"待实现"
- ✅ 合法Skip:测试环境临时不可用(需标注恢复后重测计划)
- ❌ 非法Skip:页面报错、接口返回异常、功能无响应 → 这些是Bug,不是Skip
- ❌ 非法Skip:前置数据不存在但应该存在 → 数据缺失本身可能是Bug

**强制约束:** 非法Skip必须同时在buglist中记录对应Bug,禁止仅标记Skip而不追踪问题。Skip原因为功能缺陷却未记Bug = 漏测。

**【强制要求-RULE-LEAK-003】** Failed用例的Bug记录中,根因(Root Cause)分析必填,不允许仅描述表象现象(如"数据为空""页面报错")。必须诊断为什么出现该现象(如"Key认证失败导致接口返回空")。

**Failed根因诊断模板:**
```
用例ID: TC-E2E-XXX
表象: [描述观察到的现象]
根因: [分析为什么出现该现象]
影响范围: [该根因还可能影响哪些其他用例]
关联Bug: BUG-V14-XXX(新建/已存在)
```

### 调度流程图

```
Leader 读取模块列表 → 按编号排序
  ↓
对每个模块:
  ├─ 检查 test-progress.json,已完成则跳过
  ├─ 计算用例数,> 15 则拆分批次
  ├─ 派发 Browser Agent(含用例清单 + 环境配置)
  ├─ Agent 完成 → Leader 收集结果
  ├─ 更新 test-progress.json
  └─ 自动进入下一模块
  ↓
全部模块完成 → Leader 汇总生成最终报告
```

---

## 执行流程

AI 被调用后必须严格按以下步骤执行:

### 阶段一:环境准备

1. **读取默认配置(可选)**
   检查当前项目是否存在 `test-config.md` 文件:
   - 存在 → 自动读取,获取默认环境配置(测试地址、账号密码、浏览器等)
   - 不存在 → 跳过此步,直接在下一步询问用户提供所有必要信息

2. **确认或覆盖**
   将读取到的配置(或空白模板)展示给用户,询问:
   - "检测到以下默认配置,是否直接使用?如需修改请告知。"(有配置文件时)
   - "未检测到配置文件,请提供以下测试环境信息:"(无配置文件时)
   - 用户确认则直接使用,用户提供新值则覆盖对应字段
   - **本次测试范围**(见下方说明)
   - **截图保存目录**(默认 `test-project/bug-reports/YYYYMMDD/`,以测试执行日期命名,用户可自定义路径)
   - 其他备注(如特定测试数据、已知问题等)

   **测试范围确认(重要):**
   由于项目可能只开发了部分模块,必须在开始前确认本次测试范围:
   - 列出 `test-project/ai-version/` 下所有可用模块(编号 + 名称),供用户勾选
   - 如果用户通过 `--module` 参数已指定,展示确认即可
   - 如果用户未指定,询问:"是否执行全部模块测试?还是只测试部分已开发模块?"
   - 用户可输入模块编号(如 `001,002,003`)来选择范围
   - 将最终确认的测试范围记录到进度文件的 `scope` 字段中

3. **检查依赖**
   Bug 以 Markdown 格式记录,直接使用文件写入工具(Write/SearchReplace)操作,无需额外 Python 依赖。

4. **初始化目录**
   确保以下目录存在,不存在则创建:
   ```
   test-project/bug-reports/
   test-project/bug-reports/YYYYMMDD/
   test-project/test-reports/
   ```
   其中 `YYYYMMDD` 为本次测试执行日期,同一天多次测试共享同一日期文件夹。

5. **检查断点续测**
   读取 `test-project/test-progress.json`:
   - 若文件存在且用户确认继续 → 进入断点续测模式,从上次未完成的用例继续
   - 若文件不存在或用户选择重新开始 → 创建新的进度文件

### 阶段二:加载测试用例

6. **扫描用例文件(按测试范围过滤)**  
   根据阶段一确认的测试范围,按文件名排序读取对应的 `.md` 文件(排除 `README.md`):
   - 全量测试:读取 `test-project/ai-version/` 下所有 `.md` 文件
   - 部分模块:仅读取用户选定模块对应的文件(如选择 `001,003` 则只读取 `001-xxx.md` 和 `003-xxx.md`)

7. **解析并过滤 E2E 用例**  
   从每个 Markdown 文件中提取测试用例时,必须遵守以下过滤规则:
   - **只解析 E2E 区域**:优先查找标题含"E2E 测试"的章节(如 `## 九、E2E 测试`),仅在该章节内提取用例
   - **只执行用例 ID 以 `TC-E2E-`、`TC-E2E-SUP-`、`TC-E2E-ISO-` 或 `TC-E2E-TEXT-` 开头的测试用例**
   - **忽略其他类型**:`TC-API-*`、`TC-SVC-*`、`TC-CARD-*` 等不在本 Skill 执行范围内,仅作上下文参考
   - 如果 Markdown 文件中没有 E2E 章节,跳过该文件

   提取到的每个用例至少包含:用例ID、用例名称、前置条件、操作步骤、预期结果、优先级。

   **统计说明**:`total_cases` 仅统计本次测试范围内的 E2E 用例数,而非全部模块的总用例数。

### TC-E2E-TEXT-* 文案质量检查执行规则

执行 `TC-E2E-TEXT-*` 前缀用例时:
1. 抓取页面所有可见文本(标题、按钮、提示语、表格列头、卡片内容、弹窗文案)
2. 按 global.md 第十三章的 5 个维度逐一检查:错别字、逻辑通顺、中英文混排、文案一致性、空文案/占位符
3. 发现问题记录为 Bug,**按指派判定规则确定指派对象**(见阶段四 Bug指派判定)
4. 优先级:空文案/占位符为 P0,错别字/逻辑不通为 P1,混排/一致性为 P2
5. 文案问题如spec未明确要求,优先级降为 P3,指派产品经理

### 阶段二-B:加载历史Bug回归清单

7.5 **扫描上次未修复Bug**

在正式执行测试用例前,自动扫描历史 Bug 记录用于回归验证:

1. 扫描 `test-project/bug-reports/` 目录下所有日期子目录(格式 YYYYMMDD)
2. 找到最近一次(非本次)的 `buglist-*.md` 文件
3. 解析该文件,提取所有状态为 `Open` 的 Bug 记录
4. 生成回归验证清单,包含每个 Open Bug 的:Bug ID、所属模块、操作步骤、预期结果

**输出示例:**
```
检测到上次 buglist(20260701)中有 X 个 Open Bug 需要回归验证:
- BUG-001 (P1): 卡片列表页缺少工具数量显示
- BUG-004 (P1): 404页面不显示导航栏
将在测试执行过程中同步验证这些 Bug 是否已修复。
```

如果没有找到历史 buglist 或所有 Bug 均为 Fixed/Closed,跳过此步骤。

### 阶段二-C:数据准确性用例的测试数据准备

对于标记为"数据准确性校验"类的E2E用例(如审计中心字段校验),执行前需先造数据:

1. **识别造数据需求**:当用例前置条件中包含"需先通过MCP工具调用产生已知审计数据"或类似描述时,触发数据准备流程
2. **执行MCP工具调用**:通过CallMcpTool调用审计中心已接入的MCP服务(当前已接入:product-inventory-api-to-mcp、py-meeting-server-to-mcp、py-server-to-mcp、py-yuque-server-to-mcp),记录调用时间、服务名、工具名等关键信息作为后续校验基准
3. **等待数据同步**:调用后等待约5-10秒,确保审计系统记录到位
4. **进入UI验证**:携带已知的调用信息进入审计中心页面,逐字段比对

注意:如果审计中心未接入某些MCP服务(如CV类服务),应在测试报告中标注"无法验证"并记录原因,而非跳过。

### 阶段二-D:多账号隔离性用例准备(TC-E2E-ISO-*)

1. **前置检测**:识别待执行用例中是否包含 `TC-E2E-ISO-*` 前缀
2. **账号准备**:若当前仅配置了一个测试账号,暂停执行并询问用户:
   > 检测到本次测试包含多账号隔离性验证用例(TC-E2E-ISO-*),当前仅有1个测试账号。
   > 请提供第2个测试账号(账号+密码),或指定跳过这些用例。
3. **账号标识**:在测试报告中标注每个 ISO 用例使用的账号(如"账号A: xxx / 账号B: yyy")
4. **禁止静默跳过**:不得因缺少第二账号而静默跳过 ISO 用例,必须在报告中明确标注"因缺少第二账号而跳过"

### 阶段二-E:前置条件自动验证

每个模块正式执行前,先运行"前置条件预检",确保测试环境就绪:

**预检项:**

1. **页面可访问性**:通过 Browser Agent 访问目标页面,确认非 404/500
2. **核心数据存在性**:检查页面关键列表/卡片区域是否有数据展示
3. **登录态有效性**:确认当前会话未过期

**预检失败处理:**

- **页面不可达** → 标记该模块所有用例为 skip(skip_reason: `environment_unavailable`),跳过该模块
- **数据为空但应有数据** → 尝试通过阶段二-C的造数据流程补充;造数失败则标记 skip(skip_reason: `data_unavailable`)
- **登录态失效** → 自动重新登录,成功后继续预检

**预检结果记录:**

预检结果记录到进度文件的 `module_prechecks` 字段,格式如下:

```json
"module_prechecks": {
  "001-mcp-list-page": {
    "page_accessible": true,
    "data_available": true,
    "session_valid": true,
    "result": "pass"
  }
}
```

预检通过后才进入阶段三正式执行。

### 阶段三:执行测试

8. **逐模块逐用例执行(按文件顺序,一个模块全部完成后再执行下一个)**  

   **模块切换隔离(模块间边界处理):**
   
   当一个模块全部用例执行完毕、开始下一模块前,执行以下清理操作:
   1. 清除浏览器 localStorage/sessionStorage 中的非认证数据(搜索历史、筛选条件、用户偏好设置)
   2. 保留 auth token / user info / session 等认证相关数据
   3. 将页面滚动位置重置到顶部
   4. 若当前页面有搜索框或筛选条件处于激活状态,清空输入或重置为默认值
   5. 导航到下一模块的目标页面,等待页面就绪(网络空闲或关键元素可见)
   6. 清理失败时记录警告日志但不中断测试执行

   对每个测试用例,按以下流程操作:

   **a. 更新进度**  
   将当前用例状态标记为 `in_progress`,写入 `test-progress.json`。

   **b. 浏览器操作(通过 Browser Agent)**  
   调用 Browser Agent 执行实际操作:
   - 导航到目标页面
   - 执行前置条件(如登录、数据准备)
   - 按操作步骤逐步执行
   - 验证实际结果是否与预期结果一致
   - 按[截图策略](#截图策略)保存必要截图

   #### Browser Agent 操作规范

   **登录复用:**
   - 测试开始时先执行一次完整登录流程
   - **登录成功后,立即清除浏览器缓存**(清除 localStorage/sessionStorage 中的非认证数据、清除 HTTP 缓存),确保后续页面加载的数据均为服务端最新响应,避免因缓存导致统计数据不准确
   - 后续用例复用已登录状态(同一浏览器上下文)
   - 若发现登录态失效(如被踢出),自动重新登录后继续

   **等待策略:**
   - 页面导航后:等待网络空闲(无 pending 请求)或等待关键元素可见,取先到者
   - 交互操作后:等待目标状态变化(如弹窗出现、列表刷新),超时 30 秒
   - 避免使用固定 sleep

   **搜索/筛选类用例执行规则:**
   - 执行搜索功能测试时,禁止直接使用测试用例中写死的关键词
   - 必须先读取当前页面实际展示的数据(列表项名称、描述、标签等)
   - 从页面真实数据中提取一个关键词作为搜索输入
   - 再验证搜索结果是否正确过滤/匹配
   - 原则:测试数据来自页面本身,不依赖预设环境数据

   **搜索/问答结果准确性验证规则(强制):**

   对于AI问答、搜索发现等智能推荐类功能,测试不能仅验证"有结果返回",必须验证结果的**内容准确性**:

   | 验证维度 | 具体要求 | 示例 |
   |---------|---------|------|
   | 正向匹配 | 搜索存在的内容,结果中必须包含对应项 | 搜"货架检测"→ 推荐卡片含 goods-shelf-cv-mcp-real |
   | 负向验证 | 搜索不存在的内容,不应返回无关推荐 | 搜"天气预报"→ 无推荐卡片或明确提示无结果 |
   | 相关性 | 推荐结果与查询意图语义相关 | chip"哪些能力可以上传图片"→ 推荐支持图片的MCP |
   | 完整性 | 符合条件的结果不遗漏(可抽样验证) | 搜"检测"→ 至少返回2个检测类MCP |

   **关键原则:**
   - "有结果"≠"结果正确",必须验证返回内容与查询意图的匹配度
   - 对于AI生成的文字回答,验证其中是否提及了与查询相关的能力描述
   - 对于推荐卡片,验证卡片标题/描述是否与搜索关键词语义相关

   **c. 元素定位容错机制(选择器优先级,保持不变)**  
   当 Browser Agent 找不到页面元素时,按以下顺序重试:
   1. **优先使用 text 属性定位**(如按钮文字、链接文字、标签文字)
   2. 尝试 `aria-label` 属性
   3. 尝试 `data-testid` 或 `data-test` 属性
   4. 使用 XPath 相对路径定位
   5. 以上方法均失败时,**必须截图当前页面**,记录为 Bug 并标记为 failed,**禁止跳过该用例**

   **d. 判定结果**  
   - **通过(passed)**:实际结果与预期结果一致
   - **失败(failed)**:实际结果与预期结果不一致 → 记录 Bug(见阶段四)
   - **间歇性失败(flaky)**:同一用例在不同执行中结果不一致(一次通过、一次失败)→ 仍然记录为 Bug,优先级至少 P2,备注中标注"间歇性/偶现"及复现率观察
   - **跳过(skipped)**:当用例无法执行时标记为 skipped,必须同时记录跳过原因分类:

     | 原因类型 | skip_reason 值 | 适用场景 | 示例 |
     |---------|---------------|---------|------|
     | 环境不可用 | `environment_unavailable` | 服务未部署/页面不可达/API超时 | MCP服务连接超时、页面返回500 |
     | 数据缺失 | `data_unavailable` | 前置数据构造失败/无可用测试账号 | API造数失败、缺少第二测试账号 |
     | 依赖阻塞 | `blocked_by:{case_id或bug_id}` | 前置用例失败导致当前用例无法执行 | 列表页点击跳转失败→详情页用例被阻塞 |
     | 版本未开发 | `version_not_developed` | 该功能明确标注为下个版本开发 | 规划中的新功能 |
     | 无法模拟 | `cannot_simulate` | 测试环境真正无法模拟的条件 | 无法模拟断网、无法触发硬件故障 |

   > **禁止误判为 skipped 的情况**:当页面应展示数据但实际为空时(如工具列表显示0个、列表页无卡片等),必须先确认该服务/数据是否实际存在。如果服务实际有数据但页面未展示,这是 **Bug** 而非跳过。"数据为空"不等于"前置条件不满足"。

   > **重要原则**:不得以“环境问题”为由跳过或忽略失败用例。任何失败结果都必须记录为 Bug。如果怀疑是环境因素(如 session 过期、网络抖动),应在 Bug 备注中说明可能原因,但不能因此不记录。间歇性问题本身就是需要排查的质量风险。
   
   > **深度验证原则**:对于"复制到剪贴板"、"下载文件"、"导出数据"等操作类功能,仅验证操作成功提示(如 toast)不充分,必须同时验证操作产物的内容正确性(如剪贴板实际值、文件实际内容)。只验证"操作成功"而不验证"结果正确"属于无效测试。
      
   > **【业务语义验证原则-RULE-LEAK-005】** 对字段值的验证必须深入业务语义层面:
   > - 不能仅判断"非空"或"有区分",必须验证值是否符合业务预期
   > - 示例:caller字段不能仅判断"账号A的caller≠账号B的caller",必须验证"caller是否为用户中文姓名而非技术标识符test_xxx"
   
   **f-2. Bug 回归验证(穿插执行)**

   在执行常规测试用例的过程中,当进入某个模块时,同步验证该模块下的历史 Open Bug:

   - 按 Bug 记录的操作步骤进行复现尝试
   - **已修复**:直接更新原 buglist 文件中该 Bug 的状态:
     - `当前状态` 列从 `Open` 改为 `Fixed`
     - `备注` 列追加回归验证信息(如"MMDD回归验证通过,{具体验证说明}")
   - **未修复**:在本次新 buglist 中新增一条记录:
     - Bug ID 使用本次 buglist 的自增编号
     - 备注标注"与{原日期} BUG-XXX 相同,仍未修复"
     - 优先级、模块、操作步骤等与原 Bug 保持一致
   - **无法验证**(如该模块不在本次测试范围):保持原状态不变,不做修改

   **e. 记录结果**  
   将用例结果写入 `test-progress.json`:
   ```json
   "modules": {
     "001-mcp-list-page": {
       "status": "in_progress",
       "cases": {
         "TC-E2E-001": "passed",
         "TC-E2E-002": "failed"
       }
     }
   }
   ```
   同时更新 `completed_cases`、`passed`、`failed`、`skipped` 计数。

   **f. 模块完成标记**  
   当一个模块所有用例执行完毕,将该模块 `status` 更新为 `completed`。

## 阶段四:Bug 记录

9. **发现 Bug 时立即记录**  
   每发现一个 Bug,立即追加到 Markdown 格式的 Bug 列表文件中。

   **Bug指派判定(强制步骤,每条Bug必须执行):**
   记录Bug前,必须对照以下规则确定「指派对象」字段:
   - **spec明确要求但未实现** → 查看spec中的具体描述:
     - 后端API/数据/接口问题 → 指派**后端**
     - 前端UI/交互/布局问题 → 指派**前端**
   - **spec未提及的问题**(如中英文空格规范、文案一致性等通用规范) → 指派**产品**,优先级降为P3,备注标注"需求建议"
   - **demo有但实际缺失** → 指派**前端**
   - **AI回答内容问题**(推荐不精准、暴露内部信息、兜底回复不合规、回答语义错误) → 指派**算法**
   
   > 禁止不经判定直接硬编码指派对象。每条Bug的指派必须有明确依据。

   **Bug 文件路径:**
   ```
   test-project/bug-reports/YYYYMMDD/buglist-YYYYMMDD_HHmmss.md
   ```

   **写入方式:**
   直接使用文件写入工具(Write/SearchReplace)向 Bug 列表文件追加记录,无需额外脚本。

   **Markdown Bug 记录格式:**
   每个 Bug 作为一行追加到表格中:
   ```markdown
   | BUG-XXX | 模块名 | TC-E2E-XXX | P0/P1/P2 | Bug标题 | 前置步骤 | 操作步骤 | 预期结果 | 实际结果 | 截图路径 | 环境信息 | Open | 指派对象 | 备注 | 2026-XX-XX HH:MM:SS |
   ```

   **首次创建文件时,写入表头:**
   ```markdown
   # Bug List

   | Bug ID | 所属模块 | 测试用例ID | 优先级 | 标题 | 前置步骤 | 操作步骤 | 预期结果 | 实际结果 | 截图路径 | 环境信息 | 当前状态 | 指派对象 | 备注 | 发现时间 |
   |--------|---------|-----------|--------|------|---------|---------|---------|---------|---------|---------|---------|----------|------|---------|
   ```

### 阶段五:生成报告

10. **生成测试报告**  
   所有用例执行完毕(或用户主动终止)后,读取 `test-progress.json` 和 Bug Markdown 文件,生成 Markdown 测试报告。

   **报告存放路径:**
   ```
   test-project/test-reports/test-report-YYYYMMDD-HHmmss.md
   ```

### 人工验证清单输出

测试报告生成后,必须额外输出一份「需人工验证清单」,列出所有 Browser Agent 无法自动执行的用例,供测试人员手动验证。

**纳入清单的条件:**
- skip_reason 为 `cannot_simulate` 的用例(如扫码登录、断网模拟、硬件触发等)
- 需要真实物理设备配合的用例(如企微扫码、短信验证码)
- 需要精确时机观察的用例(如骨架屏加载态、动画过渡效果)

**清单格式(附在测试报告末尾或单独输出给用户):**

```markdown
## 需人工验证清单

> 以下用例因技术限制无法通过 Browser Agent 自动执行,需测试人员手动验证。

| 序号 | 用例ID | 所属模块 | 用例名称 | 无法自动化原因 | 验证要点 |
|------|--------|---------|---------|--------------|---------|
| 1 | TC-E2E-228 | 012-api-key-management | 企微扫码登录 | 需真实手机扫码 | 扫码后正确跳转到密钥管理页面 |
| ... | ... | ... | ... | ... | ... |
```

**规则要求:**
- 测试结束后必须输出此清单,不可遗漏
- 每个用例必须注明"无法自动化原因"和"验证要点"(简要说明人工验证时关注什么)
- 清单中的用例不计入自动化通过率,但必须在测试报告的"跳过原因分布"中体现

11. **收尾工作**  
    - 将最终结果汇总输出给用户
    - 更新 `test-progress.json` 的 `last_updated` 时间
    - 若全部通过,提示用户;若有失败,列出关键 Bug

---

## 截图策略

- **仅 Bug 截图**:只有发现 Bug 时才截图作为证据,通过的用例和普通测试过程一律不截图
- **失败用例**:必须截图(截取失败时刻的页面状态)
- **通过用例**:禁止截图
- 截图命名:`{test_case_id}-{timestamp}.png`(而非 `bug_id`,因为截图时可能还未分配 bug_id)
- 截图默认存放在 `test-project/bug-reports/YYYYMMDD/` 目录,与当天的 buglist 文件同级
- **清理规则**:项目中仅保留 buglist 文件引用的截图,其余图片应删除

---

## Bug 记录规范

### 文件信息

- **存放路径**:`test-project/bug-reports/YYYYMMDD/`,按测试执行日期分文件夹
- **文件名格式**:`buglist-YYYYMMDD_HHmmss.md`(以测试会话开始时间命名)
- **文件格式**:Markdown 表格

### 字段定义

| 序号 | 字段名 | 说明 | 示例 |
|------|--------|------|------|
| 1 | Bug ID | 自增编号 | BUG-001 |
| 2 | 所属模块 | 对应测试用例的模块名 | MCP列表页 |
| 3 | 测试用例ID | 关联的测试用例编号 | TC-E2E-001 |
| 4 | 优先级 | P0/P1/P2 | P0 |
| 5 | 标题 | Bug 简要描述 | 列表页分页功能失效 |
| 6 | 前置步骤 | 触发 Bug 前需完成的操作 | 登录系统→进入MCP列表页 |
| 7 | 操作步骤 | 触发 Bug 的具体操作 | 点击第2页分页按钮 |
| 8 | 预期结果 | 正常应该出现的行为 | 显示第2页数据列表 |
| 9 | 实际结果 | 实际出现的异常行为 | 页面无响应,仍显示第1页 |
| 10 | 截图路径 | Bug 截图的相对路径(相对 buglist 文件) | ./TC-E2E-001-20260626.png |
| 11 | 环境信息 | 测试URL、浏览器等 | URL: https://test.xx.com, Chromium |
| 12 | 当前状态 | Open/Fixed/Verified/Closed/Won't Fix | Open |
| 13 | 指派对象 | 根据Bug指派分类规则自动判定(产品经理/后端工程师/前端工程师/算法) | 后端工程师 |
| 14 | 备注 | 补充信息(间歇性Bug标注复现率和原因) | 间歇性,复现率约50%,疑似session过期 |
| 15 | 发现时间 | 发现 Bug 的时间戳 | 2026-06-26 09:30:15 |

### Bug 指派分类规则

记录 Bug 时,根据以下规则自动判定指派对象:

| 问题类型 | 判定依据 | 指派对象 |
|----------|----------|----------|
| 需求缺失/健壮性 | spec/tasks 中未提及,属于边界情况、异常处理、容错设计 | 产品经理 |
| 实现缺陷 | spec 明确要求但未实现,或 demo 有而实际缺失;后端 API 数据错误、接口逻辑、鉴权后端实现 | 后端工程师 |
| UI/前端问题 | 布局、样式、控件行为与 demo 不符;页面路由、前端逻辑、交互行为、渲染问题 | 前端工程师 |
| AI回答内容问题 | 推荐不精准、暴露内部信息、兜底回复不合规、回答语义错误 | 算法 |

判定优先级:先判断是否为需求缺失(spec 有无提及),再区分前后端职责。

### 优先级定义

- **P0**:阻塞性问题,核心功能完全不可用(如白屏、崩溃、无法登录)
- **P1**:重要功能异常或数据错误(如列表数据不显示、操作无响应)
- **P2**:次要问题(如样式错位、文案错误、非核心交互异常)

---

## 断点续测机制

### 进度文件

- **路径**:`test-project/test-progress.json`
- **作用**:记录当前测试会话的完整执行状态,支持中断恢复

### 进度文件结构

```json
{
  "session_id": "uuid-v4",
  "started_at": "2026-06-26T09:00:00+08:00",
  "last_updated": "2026-06-26T10:30:00+08:00",
  "test_url": "https://test.example.com",
  "username": "testuser",
  "credentials": {
    "username": "testuser",
    "password_hint": "***(不存储明文密码)"
  },
  "browser": "Chromium",
  "screenshot_dir": "test-project/bug-reports/YYYYMMDD/",
  "scope": {
    "type": "partial",
    "selected_modules": ["001-mcp-list-page", "002-mcp-detail-page"],
    "all_available_modules": ["001-mcp-list-page", "002-mcp-detail-page", "003-global-navigation"]
  },
  "total_cases": 100,
  "completed_cases": 50,
  "passed": 45,
  "failed": 5,
  "skipped": 0,
  "modules": {
    "001-mcp-list-page": {
      "status": "completed",
      "module_name": "MCP列表页",
      "cases": {
        "TC-E2E-001": "passed",
        "TC-E2E-002": "failed",
        "TC-E2E-003": "passed"
      }
    },
    "002-mcp-detail-page": {
      "status": "in_progress",
      "module_name": "MCP详情页",
      "cases": {
        "TC-E2E-001": "passed"
      }
    }
  },
  "bug_report_file": "test-project/bug-reports/20260626/buglist-20260626_090000.md"
}
```

### 命令参数行为约定

#### `--resume` 规则

| 场景 | 行为 |
|------|------|
| 带 `--resume` + 进度文件存在 | 直接进入续测流程 |
| 带 `--resume` + 进度文件不存在 | 提示"未找到历史进度,将从头开始",需用户确认 |
| 未带 `--resume` + 进度文件存在 | 询问用户"检测到上次进度,是否续测?" |
| 未带 `--resume` + 进度文件不存在 | 正常从头开始 |

#### `--module` 规则

- 值为模块编号前缀,如 `--module 001` 对应 `001-mcp-list-page.md`
- 支持多模块:`--module 001,003`
- 与进度文件结合时:仅对指定模块中未完成的用例继续执行
- 不带进度文件时:只执行指定模块的全部 E2E 用例

### 续测流程

1. 检测到 `test-progress.json` 存在时,读取文件内容
2. 向用户展示上次执行进度摘要:
   - 已完成 / 总计用例数
   - 各模块完成状态
   - 通过/失败/跳过统计
3. 询问用户:
   - **继续执行**:从上次中断的用例继续
   - **重新开始**:归档旧进度文件,创建新会话
   - **指定模块**:仅执行特定模块
4. 若选择继续,且进度文件中已记录 `test_url`、`username`、`screenshot_dir`、`browser` 等环境信息,询问用户是否沿用,**默认沿用**
5. 跳过已完成模块和已完成的用例,从中断点继续执行

### 安全注意

- **密码不存储在进度文件中**,续测时需重新输入
- `password_hint` 仅记录"已提供"标记,不记录实际值

---

## 测试执行完整性保障

为防止测试过程中漏跑用例,本技能强制执行以下完整性规则。所有全量测试、部分模块测试以及断点续测场景均须遵守。

### 1. 用例清单强制加载

全量测试开始前,必须先读取本次测试范围内的所有测试用例文件,解析出完整的 E2E 用例 ID 清单:

- 读取 `test-project/ai-version/*.md`(排除 `README.md`)
- 仅保留用例 ID 以 `TC-E2E-`、`TC-E2E-SUP-`、`TC-E2E-ISO-` 或 `TC-E2E-TEXT-` 开头的用例

解析完成后,生成一份执行 checklist,包含每个用例的 **用例ID、所属模块、用例标题、计划状态**。执行过程中逐条标记,确保没有遗漏。

### 2. 执行状态强制记录

每个测试用例执行完毕后,必须立即在进度文件和 checklist 中记录最终状态,状态只允许以下三种:

| 状态 | 图标 | 含义 | 处理要求 |
|------|------|------|----------|
| 通过 | ✅ Pass | 实际结果与预期结果一致 | 更新进度文件,无需截图 |
| 失败 | ❌ Fail | 实际结果与预期结果不一致 | 必须记录为 Bug,并截图 |
| 跳过 | ⏭️ Skip | 当前条件下无法执行 | 必须注明跳过原因,并在备注中说明 |

**禁止**仅记录发现的 Bug 而忽略通过的用例。即使某个模块全部通过,也必须在 checklist 中明确列出每个用例的 Pass 状态。

### 3. 执行覆盖率检查

所有用例执行完毕后,必须进行覆盖率核对:

- 核对公式:`已执行用例数 = 本次测试范围内总用例数 - 明确标注"该版本未开发"的用例数`
- 如果存在未执行的用例(非"该版本未开发"),必须在测试报告和最终输出中明确列出,并说明未执行原因
- **全量测试要求覆盖率为 100%**(排除已明确标注"该版本未开发"的用例)

若覆盖率未达到 100%,禁止标记测试会话完成,必须继续执行或经用户确认后将未执行用例标记为 Skip 并注明原因。

**漏跑用例处理规范:** 全量测试结束后,必须核对用例文件中的TC-ID清单与实际执行清单。若发现存在完全漏跑的用例(不在已执行清单中,也未标记为Skip),必须立即补充执行或标注原因。全量测试≠部分执行,每个TC-ID必须有明确状态。

### 4. 测试报告附加「用例执行清单」

生成的测试报告(或 buglist 文件末尾)必须附加「用例执行清单」章节,列出本次测试范围内每个用例的最终状态。表格格式如下:

```markdown
## 用例执行清单

| 用例ID | 所属模块 | 标题 | 执行状态 | 跳过原因 | 备注 |
|--------|---------|------|---------|---------|------|
| TC-E2E-001 | 001-mcp-list | xxx | ✅ Pass | | |
| TC-E2E-002 | 001-mcp-list | xxx | ❌ Fail | | 见BUG-001 |
| TC-E2E-SUP-001 | 001-mcp-list | xxx | ❌ Fail | | 见BUG-002 |
| TC-E2E-006 | 004-homepage | xxx | ⏭️ Skip | version_not_developed | 该版本未开发 |
```

- 用例按模块和用例ID排序
- 备注列用于关联 Bug ID、说明跳过原因或补充信息
- 通过用例不得留空执行状态

### 5. 断点续测兼容

测试执行完整性保障机制与现有 `test-progress.json` 断点续测机制完全兼容:

- 续测时,只执行进度文件中状态为 `pending`、`in_progress` 或未记录的用例
- 已完成用例(`passed`/`failed`/`skipped`)不再重复执行
- 无论是否经过续测,最终生成的测试报告必须包含**所有用例**的完整状态(已执行 + 未执行但已标注原因)
- 若续测过程中新增或删除了测试用例文件,需在开始续测前重新核对 checklist 并向用户确认

---

## 快速路径执行规则(--quick / --priority 模式)

当用户使用 `--quick` 或 `--priority` 参数时,按以下规则过滤用例:

### 过滤逻辑

| 参数 | 过滤规则 | 说明 |
|------|---------|------|
| `--quick` | 仅执行优先级为 P0 的 `TC-E2E-*` 用例 | 跳过 TC-E2E-SUP-*、TC-E2E-ISO-*、TC-E2E-TEXT-* |
| `--priority P0,P1` | 执行指定优先级范围内的所有前缀用例 | 可指定任意优先级组合 |
| `--quick --module 001` | 指定模块的 P0 用例 | 参数可组合使用 |

### 被过滤用例的处理

- 被过滤掉的用例在报告中标记为 skip(skip_reason: `filtered_by_priority`)
- 被过滤用例**不计入通过率分母**(可执行用例数中排除)
- 进度文件中记录过滤参数:`"filter": {"mode": "quick", "priority": ["P0"], "total_matched": N}`

### 报告特殊标注

- 快速路径模式下报告标题增加"★ 冒烟测试"标识
- 报告开头明确标注"本次仅执行 P0 优先级,共 X/Y 个用例(Y为全量用例数)"
- 若 P0 通过率 < 95%,在报告概要中以醒目方式警告:"⚠️ 核心用例通过率不足95%,建议排查后再进行全量测试"

---

## 测试报告格式

### 文件信息

- **存放路径**:`test-project/test-reports/`
- **文件名格式**:`test-report-YYYYMMDD-HHmmss.md`

### 截图可访问性要求

生成测试报告时,必须确保报告中引用的所有截图文件可访问:
- 报告生成前,检查每个截图路径对应的文件是否存在
- 若截图路径为绝对路径或跨目录引用,**必须将截图文件复制到报告同目录下的 `screenshots/` 子目录**,并更新报告中的路径为相对路径
- 若截图文件缺失,在报告中标注为"[截图缺失]"而不是引用无效路径

### 报告模板

```markdown
# E2E 测试报告

## 1. 测试概要

| 项目 | 信息 |
|------|------|
| 项目名称 | Busyming MCP Service |
| 测试环境 | {test_url} |
| 执行人 | AI Agent |
| 开始时间 | {started_at} |
| 结束时间 | {ended_at} |
| 测试时长 | {duration} |
| 浏览器 | {browser} |
| **测试范围** | **{scope_description}** |

> **测试范围说明**:{scope_detail}
>
> - 全量测试时显示:"全量测试(覆盖全部 N 个模块)"
> - 部分模块时显示:"部分模块测试(N/M 个模块)",并列出具体模块名称
> - 如有未测试模块,在此注明:"未纳入本次测试的模块:XXX、YYY(尚未开发/不在本次范围内)"

## 2. 测试结果统计

| 指标 | 数值 | 说明 |
|------|------|------|
| 总用例数 | {total} | 本次测试范围内的所有用例 |
| 可执行用例数 | {executable} | 排除"版本未开发"和"无法模拟"后的用例数 |
| 通过 | {passed} | |
| 失败 | {failed} | |
| 跳过 | {skipped} | |
| **可执行通过率** | **{passed}/{executable} = {rate}%** | 质量评估核心指标 |

### 跳过原因分布

| 原因 | 数量 | 占比 | 说明 |
|------|------|------|------|
| 环境不可用 | {n} | {p}% | 服务/页面不可达 |
| 数据缺失 | {n} | {p}% | 前置数据无法构造 |
| 依赖阻塞 | {n} | {p}% | 前置用例失败 |
| 版本未开发 | {n} | {p}% | 功能尚未开发 |
| 无法模拟 | {n} | {p}% | 环境限制 |
| 优先级过滤 | {n} | {p}% | 仅 --quick/--priority 模式 |

## 3. 测试范围与模块统计

### 3.1 本次测试范围

- **测试类型**:{全量测试 / 部分模块测试}
- **已测试模块**:{tested_modules_list}
- **未测试模块**:{untested_modules_list}(原因:{尚未开发 / 不在本次范围})

### 3.2 按模块统计(仅含已测试模块)

| 模块 | 总数 | 通过 | 失败 | 跳过 | 通过率 | 状态 |
|------|------|------|------|------|--------|------|
| MCP列表页 | 15 | 13 | 2 | 0 | 86.7% | completed |
| MCP详情页 | 12 | 12 | 0 | 0 | 100% | completed |
| ... | ... | ... | ... | ... | ... | ... |

## 4. 失败用例清单

### 4.1 {模块名} - {用例ID}: {用例名称}

- **优先级**:{priority}
- **操作步骤**:{steps}
- **预期结果**:{expected}
- **实际结果**:{actual}
- **Bug ID**:{bug_id}
- **截图**:{screenshot_path}

## 5. Bug 汇总

| Bug ID | 模块 | 优先级 | 标题 | 状态 |
|--------|------|--------|------|------|
| BUG-001 | MCP列表页 | P0 | 列表页分页功能失效 | Open |
| ... | ... | ... | ... | ... |

**Bug 统计:**
- P0: {p0_count} 个
- P1: {p1_count} 个
- P2: {p2_count} 个
- 总计: {total_bug_count} 个

## 5.5 Bug 修复验证(回归结果)

> 对上次 buglist 中 Open 状态的 Bug 进行回归验证的结果汇总。

| 原Bug ID | 原日期 | 模块 | 标题 | 回归结果 | 说明 |
|----------|--------|------|------|---------|------|
| BUG-XXX | 20260701 | {module} | {title} | ✅ Fixed / ❌ 未修复 / ⏭️ 未验证 | {detail} |

**回归统计:**
- 上次Open Bug总数:X 个
- 已修复:X 个
- 未修复:X 个(已记入本次buglist)
- 未验证:X 个(不在本次测试范围)

## 6. 风险与建议

### 高风险项
- {risk_description}

### 改进建议
- {suggestion}

### 后续行动
- {action_item}

## 7. 用例执行清单

> 要求见「测试执行完整性保障」章节。此处按模块列出本次测试范围内每个用例的最终状态。

| 用例ID | 所属模块 | 标题 | 执行状态 | 跳过原因 | 备注 |
|--------|---------|------|---------|---------|------|
| {case_id} | {module_id} | {case_title} | {status} | {skip_reason} | {note} |
| ... | ... | ... | ... | ... | ... |
```

---

## 异常处理策略

| 异常场景 | 处理方式 |
|---------|---------|
| 登录失败(凭证错误/500) | 中止测试,提示用户检查凭证和环境 |
| 页面 404 | 记录为 P1 Bug,标记用例 failed,继续下一用例 |
| 页面 500 | 记录为 P0 Bug,标记用例 failed,继续下一用例 |
| 页面加载超时(30s) | 重试一次,仍失败则记录 P1 Bug 并标记 failed |
| 元素定位全部失败 | 截图 + 记录 P1 Bug + 标记 failed(现有逻辑保留) |
| Bug 文件写入失败 | 将 Bug 信息输出到控制台日志作为备份,标记用例 failed,继续执行 |
| 浏览器崩溃/无响应 | 重启浏览器,重新登录,从当前用例重试一次 |
| 连续失败检测(滑动窗口) | 最近5个用例中失败≥3个时:自动尝试重新登录(清除非认证缓存→重新登录→继续执行),记录为"自动重登"事件。若重登后下一用例仍失败,暂停执行并询问用户:① 继续执行 ② 跳过当前模块 ③ 中止测试。单次测试中自动重登超过3次时强制暂停,提示"环境可能存在系统性问题"。注:skip 状态的用例不计入失败窗口。 |

---

## 依赖与环境要求

### 工具依赖

| 工具 | 用途 |
|------|------|
| Browser Agent | 执行浏览器自动化操作(页面导航、元素交互、截图) |

### 目录结构

执行本技能后,`test-project/` 目录下会产生以下文件:

```
test-project/
├── ai-version/              # 测试用例源文件(只读)
├── bug-reports/
│   └── YYYYMMDD/            # 按测试执行日期分文件夹
│       ├── buglist-*.md     # Markdown Bug 报告
│       └── *.png            # Bug 截图(与 buglist 同级)
├── test-reports/
│   └── test-report-*.md     # Markdown 测试报告
└── test-progress.json       # 测试进度追踪文件
```

---

## 注意事项

1. **配置读取为可选**:如果当前项目存在 `test-config.md`,自动读取作为默认配置展示给用户确认;不存在则直接询问用户提供所有必要信息
2. **每发现一个 Bug 立即写入 Markdown 文件**,避免批量记录导致遗漏
3. **进度文件在每完成一个用例后立即更新**,确保中断后可精确恢复
4. **失败用例必须截图**,截图命名使用 `{test_case_id}-{timestamp}.png`
5. **Browser Agent 操作时如遇页面加载超时(默认 30 秒)**,重试一次后标记为失败并记录
6. **数据操作边界**:
   - 允许通过专用接口或 MCP 工具在测试环境中**造测试数据**,用于数据准确性校验(遵守 global.md 第十二章规则)
   - 禁止直接修改或删除已有业务数据,禁止对生产环境执行写操作
   - 所有造数操作必须发生在测试环境,并在用例中明确记录造数步骤和预期字段值
7. **临时脚本/文件清理**:执行过程中若生成了临时脚本或临时文件(如 `.tmp-*.json`、`.py` 辅助脚本等),任务完成后必须立即删除,不得留在项目目录中
8. **Bug 回归验证规则**:每次测试执行时自动回归上一次 buglist 中的 Open Bug;已修复的直接在原文件更新状态(Open→Fixed);未修复的记录到本次新 buglist 中,保持问题可追溯

如何安装此技能?

访问技能市场,点击「安装」按钮,按提示将技能包放入 AI 编程助手的 skills 目录即可。

浏览技能市场

支持平台:Qoder · QoderWork · Claude · Codex 等 AI 编程助手