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

Playwright并行执行时测试被跳过的问题排查与优化

问题描述

我正在为一个REST接口系统实现自动化测试,通过程序化生成测试用例,验证不同用户对系统各端点的访问权限。测试代码结构如下:

test.describe('Access tests', () => {
  test.beforeAll(async ({request}) => {
    // Create system Data
  })
  test.afterAll(async ({request}) => {
    // Delete system Data
  })

  users.forEach((user) => {
    test.describe(`${user}`, () => {
      test.beforeAll(async ({request}) => {
        // Create user data
      })
      test.afterAll(async ({request}) => {
        // Delete user data
      })

      endpoints.forEach((endpoint) => {
        test(`${endpoint.name}`, async ({request}) => {
          // assert actual access with expected access
        });
      });
    });
  });
});

这些测试在串行模式(默认配置,单文件)下运行正常,但切换到defineConfig({fullyParallel: true})并增加worker数量后,约有一半测试被跳过。调整不同worker数量后,仍有部分测试被跳过,且worker数量超过2后执行时间并未减少。只有串行模式下所有测试才能正常运行。

请问这是什么原因?如何在不跳过测试的前提下提升测试运行效率?


原因分析
  • 全局钩子的并行冲突:外层的test.beforeAll/test.afterAll在全并行模式下会被多个worker同时执行,若系统数据的创建/删除逻辑未做幂等处理,会触发资源冲突:要么重复创建数据触发唯一性报错导致测试前置失败,要么某worker提前删除数据导致其他worker的测试因依赖缺失被跳过。
  • 动态测试用例的上下文竞争:通过forEach动态生成测试用例时,多worker的上下文竞争可能导致部分测试实例未被正确生成,最终被标记为跳过。
  • 系统资源瓶颈:worker数量超过2后执行时间不下降,说明测试瓶颈不在测试执行本身,而是目标REST系统的并发处理能力不足,或者测试中的数据操作(创建/删除用户、系统数据)是串行阻塞的,多worker反而因等待资源增加耗时。

解决方案

1. 修复全局钩子的并行兼容性

  • 给全局钩子中的系统数据添加唯一标识(比如worker ID、随机后缀),确保每个worker拥有独立的测试环境,避免资源冲突。
  • 将全局系统数据的创建逻辑下移到用户级的test.beforeAll中,让每个用户测试组拥有独立的系统数据,彻底隔离并行环境。
  • 确保所有数据操作(创建/删除)是幂等的:比如创建前先检查资源是否存在,删除时忽略不存在的资源。

2. 调整并行策略,避免全量并行

不要使用fullyParallel: true,而是为用户级测试组开启并行,保持全局钩子串行执行,平衡隔离性和效率:

test.describe('Access tests', () => {
  test.beforeAll(async ({request}) => {
    // 全局系统数据创建,仅执行一次
  })
  test.afterAll(async ({request}) => {
    // 全局系统数据删除,仅执行一次
  })

  users.forEach((user) => {
    // 每个用户测试组独立并行执行
    test.describe(`${user}`, () => {
      test.describe.configure({ mode: 'parallel' })
      test.beforeAll(async ({request}) => {
        // 创建当前用户专属数据
      })
      test.afterAll(async ({request}) => {
        // 删除当前用户专属数据
      })

      endpoints.forEach((endpoint) => {
        test(`${endpoint.name}`, async ({request}) => {
          // 断言访问权限
        });
      });
    });
  });
});

若目标系统支持,也可设置单个用户的所有端点测试串行,不同用户的测试组并行。

3. 优化测试执行效率

  • 复用测试数据:在用户级test.beforeAll中创建一次用户数据,在同用户的所有端点测试中复用,减少重复的数据操作耗时。
  • 优化测试环境:提升目标REST系统测试环境的并发处理能力,或为测试配置独立的数据库实例,避免资源竞争。
  • 合理设置worker数量:根据目标系统的并发能力,选择最优worker数(通常2-4),不要盲目增加。

内容的提问来源于stack exchange,提问作者NilsB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 22:42:55