如何自动化测试耗时2-5天的业务流程?Playwright新手咨询
长周期端到端测试的最佳实践(Playwright + TypeScript 场景)
针对你这种跨多天的交易-结算流程,核心思路是避免真实等待、拆分流程并复用状态,以下是具体落地方案:
1. 模拟时间推进(最高效方案)
不用等真实的2-4天,直接篡改前端或后端的时间逻辑,把流程压缩到分钟级:
- 前端时间Mock:在Playwright中通过注入脚本修改全局
Date对象,让前端认为已经过了指定天数:await page.addInitScript(() => { const originalNow = Date.now; // 向后推24小时,可根据需求调整时长 Date.now = () => originalNow() + 24 * 60 * 60 * 1000; const originalDate = Date; Date = class extends originalDate { constructor(...args: any[]) { if (args.length === 0) super(Date.now()); else super(...args); } } as typeof Date; }); - 后端时间调整:如果后端校验时间,联系运维开启测试环境的时间修改权限,或者用测试环境专属接口/配置直接跳过时间等待逻辑,比如把结算触发条件从“次日”改成“立即”。
2. 流程拆分与状态持久化
把整个流程拆成交易加载和结算验证两个独立阶段,保存中间状态避免重复执行前置步骤:
- 保存会话状态:用Playwright的
storageState保存登录态、Cookie等信息,下次启动直接复用:// 交易阶段保存会话 await page.context().storageState({ path: './auth-state.json' }); // 结算阶段加载会话 const context = await browser.newContext({ storageState: './auth-state.json' }); const page = await context.newPage(); - 保存业务数据:交易完成后,把交易ID、状态等关键数据写入本地文件,结算阶段直接读取:
import fs from 'fs/promises'; // 交易阶段写入数据 const transactionInfo = { id: await page.locator('#transaction-id').textContent(), status: await page.locator('#transaction-status').textContent() }; await fs.writeFile('./transaction-data.json', JSON.stringify(transactionInfo)); // 结算阶段读取数据 const savedData = JSON.parse(await fs.readFile('./transaction-data.json', 'utf-8')); await page.goto(`/settlement/detail/${savedData.id}`);
3. 分阶段异步执行(无时间Mock权限时用)
如果没法模拟时间,就把测试拆成两个独立脚本,通过CI/CD定时触发:
- 脚本1:执行交易加载流程,输出状态文件后退出。
- 脚本2:读取状态文件,执行结算验证流程。
- 在CI工具(比如GitHub Actions)中设置触发规则,比如脚本1执行完成后,延迟24小时自动运行脚本2,或者手动触发。
4. 测试环境专属配置优化
- 为自动化测试单独配置测试环境:比如缩短结算周期(从24小时改成5分钟)、创建专属测试账号和交易数据池,避免和其他测试任务冲突。
- 提前和后端团队沟通,开启测试环境的“快速结算”开关,不用等自然时间触发结算。
5. 关键节点校验
每个阶段执行后,必须断言核心状态,比如交易加载后确认状态是“待结算”,避免后续结算测试因为前置步骤失败而无效:
// 交易阶段断言 await expect(page.locator('#transaction-status')).toHaveText('待结算'); // 结算阶段断言 await expect(page.locator('#settlement-amount')).toHaveText('¥100.00');
内容的提问来源于stack exchange,提问作者Nishanth Balaji
相关产品推荐
相关产品推荐

