用途
migrate-to-e2e 是一个迁移技能,用于把已有的端到端测试套件逐步搬到 e2e 运行器上。它不追求一次完成,而是按会话推进:每次只移植一个切片(one slice),证明它通过,并让新旧两套套件同时保持绿色——旧运行器保留它原有的全部测试,新 e2e 测试在其旁边通过。进度文件 MIGRATION.md 记录哪些已迁移、哪些剩余及原因,供下一次会话(无论是否由同一个智能体执行)接着做。旧测试何时退出由用户决定。
主要能力
- 识别源运行器:通过配置文件和依赖检测 Playwright、Cypress、Selenium、Detox、Maestro,并对应到相应的迁移指南和引擎(web 或 mobile)。
- WebdriverIO 和 Appium 没有专门指南,但可用 Selenium 指南映射其 WebDriver 调用,用 Detox 和 Maestro 指南映射 Appium 的设备命令,结果会被明确告知为部分映射。
- 维护 MIGRATION.md 进度文件,逐文件(或逐测试)记录状态、断言数量(源 → e2e)、通过情况和备注。
- 构建测试脚手架(harness):配置、应用启动和一条绿色冒烟测试,每个平台或浏览器对应一个目标。
- 逐切片移植:先移植共享辅助,再逐条翻译测试,保留标题并标注来源。
- 验证严格度:e2e 断言数量不低于源套件清单,每个源断言都有对应 e2e 断言,不弱化断言、不无故放宽超时、不为通过而删步骤。
- 双套件并行运行:在用户确认前,已移植测试仍保留在旧套件中;CI 中两套运行器可并存,但不会同时驱动同一设备。
使用方式
迁移遵循一套分步流程:
- 恢复或开始:查找 e2e 配置旁或仓库根目录的 MIGRATION.md,存在则按进度文件继续,否则视为首次会话。
- 清点套件(首次会话):确定源运行器、测试、共享代码、运行方式、e2e 存放位置,以及旧套件能否在此运行,并据此写出 MIGRATION.md。
- 构建脚手架(仅一次):没有 e2e 配置时运行
npx e2e init --yes。可询问用户 agent 步骤使用哪个模型并配置,纯字面移植不需要模型。移植 CI 任务的编排,复用仓库自身脚本。把最简单的源测试(通常是登录或启动)移植为冒烟测试。 - 选择切片:一个会话能跑绿的范围,通常 1 至 5 条测试,如一个文件、一个文件夹、一个标签或一个功能区域。把切片写入进度文件的 Next 段。
- 移植切片:先移植共享辅助(放在如 tests/support/ 下的普通 .ts 文件,而非 .e2e.ts),再逐条翻译测试。按指南表格逐字面翻译,每个源步骤对应一个 await 调用。
- 证明每个移植:在源覆盖的每个目标上运行(如
npx e2e run <file> --repeat-each 3),三次全过才算完成。 - 运行两套套件:已移植测试也保留在旧套件中;删源测试须用户确认后标记 retired。CI 中可并存,但两个运行器不同时驱动同一设备或模拟器。
- 维护进度文件:随做随更新,而非最后补。
- 交接:说明本次会话迁移了什么、证明了什么、被阻塞或保留的内容及原因、报告的缺口和下一个切片,并询问哪些已移植源测试可退役。
适用场景
- 团队希望把 Playwright、Cypress、Selenium、Detox 或 Maestro 套件迁移到 e2e。
- 需要渐进式、可中断、可接力的迁移,而非一次性重写。
- 需要在新旧套件并行期间保持两套都绿,以降低风险。
- 多平台(web 与 mobile)或多源运行器(一次迁移一个)的项目。
限制
- WebdriverIO 和 Appium 没有专门迁移指南,映射为部分映射,需要告知用户。
- 每个会话只做一个切片,不作一次性整体迁移。
- 未经用户确认,不得删除或编辑源测试、辅助或旧运行器配置。
- 指南标记为 missing 或 "No equivalent" 的步骤使用其变通方法;没有变通方法时测试留在旧运行器,并标注原因。
- 只能基于仓库实际情况移植,进度文件中的每条命令至少要运行一次;无法在此运行的命令需在进度文件中注明。
- 不得修改应用代码;需要测试 id 时应提出应用变更建议而非直接修改。
- 不得把密钥放入测试、配置或进度文件。