Selenium Grid搭配Appium并行测试时每个设备重复执行所有测试用例
问题根因
- 你当前TestNG suite配置的
parallel="tests"规则为每个<test>标签独立并行运行,而你为每台设备单独定义了一个<test>节点,每个节点都指向完整的RunnerTest执行类 RunnerTest类中的feature数据提供器会返回所有匹配规则的Cucumber测试用例,因此每个设备对应的测试线程都会全量执行所有用例,最终执行总次数=设备数*用例数,和你预期的「用例分发到空闲设备执行,总次数等于用例数」逻辑不符
修复方案
场景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中配置设备匹配规则即可。
- 开启数据提供器并行
修改RunnerTest类的feature注解,允许用例并行生成:
@DataProvider(parallel = true) public Object[][] feature() { return this.testNGCucumberRunner.provideScenarios(); }
- 修复ThreadLocal污染问题
修改DriverManager的teardown方法,退出驱动后清理ThreadLocal存储的实例,避免多线程下驱动实例混乱:
@AfterMethod public void teardown() { getAppiumDriver().quit(); appiumDriver.remove(); }
场景2:期望所有用例在每台设备上都执行一遍
当前执行结果符合预期,仅需要补充上述第三条的ThreadLocal清理逻辑即可。
内容的提问来源于stack exchange,提问作者tiredqa_18
相关产品推荐
相关产品推荐

