You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自动化测试耗时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 13:42:41