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

TestCafe 3人以上多用户E2E测试重复执行卡顿问题求解

TestCafe多用户可重复执行E2E测试解决方案

问题根因

  • 你当前代码的显性缺陷:scenario-gist.js末尾的三个End阶段没有等待执行完成,主进程提前退出,导致Scenario实例未销毁、浏览器进程残留
  • 官方示例的Scenario采用全局单例存储,单次测试执行完成后未清空全局状态,二次初始化时出现状态冲突
  • 并发创建多个浏览器实例时存在资源竞争,二次运行时残留的浏览器进程占用端口/用户配置目录,导致新实例启动卡住

修复方案

1. 完善场景执行生命周期的等待逻辑

把末尾的三个End阶段改为Promise.all并行等待,确保所有用户的测试完全执行完成后再结束主流程,同时新增Scenario销毁逻辑:

// 替换原来三个无等待的runStage调用
await Promise.all([
    user1.runStage('End'),
    user2.runStage('End'),
    user3.runStage('End')
]);
// 新增销毁逻辑,清空实例绑定的所有事件与子进程
await scenario.destroy();

2. 新增全局状态清理逻辑

修改示例中getScenario方法所在的入口文件,新增全局状态重置方法,每次执行场景前清空之前残留的场景实例:

// 入口文件新增导出方法
module.exports.resetScenarios = () => {
    global.__scenarios = {};
};

在scenario-gist.js初始化Scenario前先调用重置方法:

const { Scenario, resetScenarios } = require('..');

module.exports = async () => {
    // 先清空之前的残留状态
    resetScenarios();
    const scenario = new Scenario('An example of synchronizing multiple tests');
    // 其余原有逻辑
};

3. 优化多用户创建逻辑,增加超时与重试

给createUser调用增加超时控制,避免无限制卡住,同时错开实例启动时间减少资源竞争:

// 封装带超时的createUser
const createUserWithTimeout = async (scenario, name, path, browser, timeout = 30000) => {
    return Promise.race([
        scenario.createUser(name, path, browser),
        new Promise((_, reject) => setTimeout(() => reject(new Error(`创建用户${name}超时`)), timeout))
    ]);
};

// 串行错开创建,避免并发资源竞争
const user1 = await createUserWithTimeout(scenario, 'First user', 'test/first-user-test.js', 'chrome');
await new Promise(resolve => setTimeout(resolve, 1000));
const user2 = await createUserWithTimeout(scenario, 'Second user', 'test/second-user-test.js', 'chrome --incognito');
await new Promise(resolve => setTimeout(resolve, 1000));
const user3 = await createUserWithTimeout(scenario, 'Third user', 'test/third-user-test.js', 'chrome --incognito');

4. 前置清理残留资源

每次测试执行前,先杀掉残留的Chrome进程,避免端口/目录占用:

  • Windows环境执行命令:taskkill /im chrome.exe /f 2>nul
  • Mac/Linux环境执行命令:pkill -f "chrome --incognito" 2>/dev/null || true
    可以将命令集成到测试脚本的前置钩子中自动执行。

5. 长期优化方案

如果需要支持更多用户的场景,建议直接使用TestCafe原生的t.useRole API结合用户角色隔离,配合自定义的阶段同步逻辑,比官方示例的多进程调度方案稳定性更高。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 04:54:04