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

Selenium Grid搭配Appium并行测试时每个设备重复执行所有测试用例

问题根因
  • 你当前TestNG suite配置的parallel="tests"规则为每个<test>标签独立并行运行,而你为每台设备单独定义了一个<test>节点,每个节点都指向完整的RunnerTest执行类
  • RunnerTest类中的feature数据提供器会返回所有匹配规则的Cucumber测试用例,因此每个设备对应的测试线程都会全量执行所有用例,最终执行总次数=设备数*用例数,和你预期的「用例分发到空闲设备执行,总次数等于用例数」逻辑不符
修复方案

场景1:期望用例仅执行一次,多设备并行加速执行

  1. 调整TestNG并行配置
    删除多套<test>节点,将并行维度调整为方法级,线程数设置为设备总数,Selenium Grid会自动将测试请求分发到空闲匹配设备:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">

<suite name="Suite" parallel="methods" thread-count="2" data-provider-thread-count="2">
    <test name="all-tests">
        <classes>
            <class name="com.universalapp.runner.RunnerTest"/>
        </classes>
    </test>
</suite>

如果需要限定使用的设备列表,在CapabilityFactory中配置设备匹配规则即可。

  1. 开启数据提供器并行
    修改RunnerTest类的feature注解,允许用例并行生成:
@DataProvider(parallel = true)
public Object[][] feature() {
    return this.testNGCucumberRunner.provideScenarios();
}
  1. 修复ThreadLocal污染问题
    修改DriverManager的teardown方法,退出驱动后清理ThreadLocal存储的实例,避免多线程下驱动实例混乱:
@AfterMethod
public void teardown() {
    getAppiumDriver().quit();
    appiumDriver.remove();
}

场景2:期望所有用例在每台设备上都执行一遍

当前执行结果符合预期,仅需要补充上述第三条的ThreadLocal清理逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 09:00:04