
本文解决 Appium 升级后(尤其是 v2.x 配合 Device Farm 插件)TestNG 默认并行启动多设备的问题,通过配置 parallel="false" 确保所有测试类严格按顺序复用同一台物理设备执行。
本文解决 appium 升级后(尤其是 v2.x 配合 device farm 插件)testng 默认并行启动多设备的问题,通过配置 `parallel="false"` 确保所有测试类严格按顺序复用同一台物理设备执行。
在 Appium 2.x 版本中,配合 Device Farm 插件或某些新版 WebDriverAgent/UiAutomator2 驱动行为,TestNG 的 <test> 标签默认可能触发“类级并行”(class-level parallelism),即每个 <class> 被视为独立执行单元,导致 Appium 尝试为每个测试类启动一个新会话——进而尝试连接多个设备(即使你只连接了一台)。这与你的预期(单设备、串行、复用同一个 AndroidDriver 实例)相悖。
根本解决方案:显式禁用并行执行
只需在 testng.xml 的 <test> 标签中添加 parallel="false" 属性:
<?xml version="1.0" encoding="UTF-8"?>
<suite name="Test Suite Name">
<listeners>
<listener class-name="Helpers.AnnotationTransformer"/>
<listener class-name="Helpers.Listener"/>
</listeners>
<test name="some name" parallel="false"> <!-- ✅ 关键修改 -->
<classes>
<class name="testClass1"/>
<class name="testClass2"/>
</classes>
</test>
</suite>⚠️ 注意:parallel="false" 必须作用于 <test> 级别(而非 <suite>),因为 <suite parallel="false"> 仅控制测试组间并行,而 <test parallel="false"> 才真正约束该测试块内所有 <class> 的执行模式为串行。
补充建议:确保 Driver 实例复用(避免重复初始化)
你的 Base 构造函数每次实例化都会新建 AndroidDriver,若 testClass1 和 testClass2 分属不同测试实例(如未使用 @BeforeSuite 或静态驱动管理),仍可能导致多次启动会话。推荐优化为单例驱动 + 生命周期管理:
public class Base {
protected static AndroidDriver<AndroidElement> driver;
@BeforeSuite
public void setUpDriver() throws MalformedURLException {
if (driver == null) {
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("appium:automationName", "UiAutomator2");
capabilities.setCapability("appium:deviceName", conf.read("deviceName"));
capabilities.setCapability("appium:udid", conf.read("udid"));
capabilities.setCapability("appium:appPackage", conf.read("appPackage"));
capabilities.setCapability("appium:appActivity", conf.read("appActivity"));
capabilities.setCapability("appium:autoGrantPermissions", true);
driver = new AndroidDriver<>(new URL("http://localhost:4723/wd/hub"), capabilities);
}
}
@AfterSuite
public void tearDownDriver() {
if (driver != null) {
driver.quit();
driver = null;
}
}
}这样,两个测试类将共享同一个 driver 实例,完全符合“单设备、顺序执行、会话复用”的要求。
验证是否生效:
运行后观察 Appium 日志——应仅出现 1 次 /session 创建请求,且后续所有测试操作均复用该 session ID;同时设备端不会出现重复安装/重启应用的行为。
总结:parallel="false" 是治标关键配置,结合驱动单例管理是治本之策。两者协同,即可彻底规避 Appium v2.x 在单设备场景下的误判式并行行为。

















