Protractor-Flake重试时所有实例运行同一脚本,如何仅启用单实例重试?
问题根源
你当前配置的核心问题是:每个multiCapabilities子项都绑定了固定的测试文件路径,而protractor-flake发起重试时,会将识别到的失败用例文件全量覆盖注入到所有已配置的capability的specs字段中,导致所有实例都会重复执行相同的失败用例,也就出现了你日志中两个Chrome实例同时跑Test2.spec.js的情况。日志中的告警是因为配置同时存在capabilities和multiCapabilities字段,protractor优先使用multiCapabilities,不影响功能但可以清理配置避免告警。
解决方案
第一步:调整Protractor配置
将测试文件从capability的独立配置中抽离为全局specs,开启分片执行能力,修改后的配置如下:
// 如果用json格式可以对应调整字段,protractor推荐使用js配置支持动态逻辑 exports.config = { // 删掉单独配置的capabilities字段避免告警 multiCapabilities: [{ browserName: 'chrome', chromeOptions: { w3c: false } }, { browserName: 'chrome', chromeOptions: { w3c: false } }], // 全局配置所有测试文件 specs: ['../tests/Test1.spec.js', '../tests/Test2.spec.js'], // 开启测试文件分片,每个文件分配给不同的实例执行 shardTestFiles: true, // 最大并发会话数设为2,和你原来的双实例需求一致 maxSessions: 2, // 其余原有配置保持不变,比如框架、超时等 }
如果需要更灵活的动态调整实例数,可以将配置改为函数形式,根据重试阶段的失败用例数量自动调整并发数:
exports.config = () => { // 从环境变量读取protractor-flake传入的失败用例列表,也可以自己解析重试标记 const failedSpecs = process.env.PROTRACTOR_FLAKE_FAILED_SPECS ? process.env.PROTRACTOR_FLAKE_FAILED_SPECS.split(',') : []; const isRetry = failedSpecs.length > 0; return { multiCapabilities: [{ browserName: 'chrome', chromeOptions: { w3c: false } }, { browserName: 'chrome', chromeOptions: { w3c: false } }], specs: isRetry ? failedSpecs : ['../tests/Test1.spec.js', '../tests/Test2.spec.js'], shardTestFiles: true, // 重试阶段并发数等于失败用例数量,最多不超过2 maxSessions: isRetry ? Math.min(failedSpecs.length, 2) : 2, } }
第二步:调整protractor-flake启动命令
确保启动时没有额外传入capabilities相关参数,示例启动命令:
protractor-flake --parser multi --max-attempts 3 -- path/to/your/protractor.conf.js
效果验证
- 首次执行:2个实例并行,分别执行Test1和Test2,符合原有需求
- 单用例失败重试:仅启动1个实例执行唯一的失败用例,不会出现重复执行
- 双用例失败重试:2个实例各分配1个失败用例并行执行,满足预期的重试逻辑
内容的提问来源于stack exchange,提问作者Manuela Molina
相关产品推荐
相关产品推荐

