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

如何在TestCafe中并发运行同一测试以构造竞态条件?

TestCafe 同测试用例并发执行构造竞态条件实现方案

TestCafe原生提供了多维度的并发执行能力,不需要引入第三方工具就能实现同用例同时运行的竞态场景,根据你要构造的竞态粒度选对应方案即可:

  • 方案1:命令行全局并发(适合测试公共资源抢占、接口幂等性这类跨会话竞态)
    直接使用TestCafe内置的-c/--concurrency参数指定并发实例数,启动后TestCafe会为同一个测试用例启动对应数量的独立浏览器上下文,所有实例会在测试初始化完成后近乎同时启动执行。
    示例命令(同时启动3个实例运行目标测试用例):
    testcafe chrome tests/race-condition-test.js -c 3
    每个并发实例的会话、Cookie、本地存储完全隔离,不会互相干扰。如果需要进一步对齐所有实例的执行起始时间,可以在用例开头加统一屏障:比如所有实例启动后先轮询一个公共状态标识,等所有实例都就绪后再往下执行业务操作,时间差可以控制在5ms以内。高并发场景建议搭配无头浏览器使用,减少本地资源开销带来的启动延迟,示例命令:testcafe chrome:headless tests/race-condition-test.js -c 15

  • 方案2:用例内细粒度并发(适合测试同页面多用户操作冲突,比如同时编辑、同时抢单这类场景)
    如果不需要启动多浏览器实例,要在单个测试流程里模拟多个用户同时触发操作,直接用TestCafe角色能力配合Promise.all并行触发操作即可,示例代码:

    import { Role, Selector } from 'testcafe';
    
    // 定义两个独立登录态的用户角色
    const user1 = Role('/login', async t => {
      await t.typeText('#username', 'test01').typeText('#password', '123456').click('#loginBtn');
    });
    const user2 = Role('/login', async t => {
      await t.typeText('#username', 'test02').typeText('#password', '123456').click('#loginBtn');
    });
    
    fixture('竞态场景测试').page('/target-operation-page');
    
    test('两用户同时提交操作触发竞态', async t => {
      // 先让两个用户都提前进入目标操作页,减少页面加载带来的时间差
      await t.useRole(user1).navigateTo('/target-operation-page');
      await t.useRole(user2).navigateTo('/target-operation-page');
    
      // 并行触发点击操作,保证请求近乎同时发出
      await Promise.all([
        t.useRole(user1).click('#submitBtn'),
        t.useRole(user2).click('#submitBtn')
      ]);
    
      // 校验竞态下的系统表现,比如是否出现重复数据、超卖、报错等不符合预期的问题
      await t.expect(Selector('#resultMsg').innerText).notContains('系统异常');
    });
    

避坑提示

  • 不要尝试在多个并发实例间通过Node.js全局变量传递状态,每个并发实例运行在独立的执行上下文中,全局变量不互通,校验竞态结果时直接读数据库公共数据、页面公共展示状态即可。
  • 并发数不要超过本机CPU核心数的2倍,否则浏览器实例调度会出现明显延迟,反而无法实现“同一时刻执行”的效果。
  • 如果测试的是后端接口竞态,可以直接在Promise.all里放接口请求逻辑,不用触发页面点击,时间差会更小。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 21:57:37