
本文介绍如何在 appium(v2+)环境下,仅使用一台物理设备顺序执行多个 testng 测试类(非并行),解决因 testng 默认并行策略导致 appium 错误尝试连接多台设备的问题。
本文介绍如何在 appium(v2+)环境下,仅使用一台物理设备顺序执行多个 testng 测试类(非并行),解决因 testng 默认并行策略导致 appium 错误尝试连接多台设备的问题。
在 Appium v2 及更高版本中,配合 Device Farm 插件或标准本地服务运行时,若 TestNG 配置文件(testng.xml)中定义了多个
✅ 正确解决方案:在
修改你的 testng.xml 如下:
<?xml version="1.0" encoding="UTF-8"?><suite name="Test Suite Name"><listeners><listener class-name="Helpers.AnnotationTransformer"></listener><listener class-name="Helpers.Listener"></listener></listeners><test name="some name" parallel="false"><!-- 关键:禁用并行 --><classes><class name="testClass1"></class><class name="testClass2"></class></classes></test></suite>
⚠️ 注意事项:
- parallel="false" 必须作用于
级别(而非 ),因为 TestNG 的并行粒度优先级为:test > classes > methods。 - 若你同时设置了 thread-count 或 data-provider-thread-count,请确保它们不与 parallel="false" 冲突;建议移除或设为 1。
- 在 Base 类构造器中初始化 Driver 是潜在风险点:若 testClass1 和 testClass2 均继承自该 Base 类,且各自实例化 Driver,则仍可能引发端口占用或会话冲突。推荐改用 TestNG 的 @BeforeSuite / @BeforeTest 生命周期方法统一管理 Driver 初始化与复用,例如:
public class DriverManager {
private static AndroidDriver<androidelement> driver;
@BeforeTest
public void setUp() throws MalformedURLException {
if (driver == null) {
DesiredCapabilities caps = new DesiredCapabilities();
caps.setCapability("appium:automationName", "UiAutomator2");
caps.setCapability("appium:deviceName", conf.read("deviceName"));
caps.setCapability("appium:udid", conf.read("udid"));
caps.setCapability("appium:appPackage", conf.read("appPackage"));
caps.setCapability("appium:appActivity", conf.read("appActivity"));
caps.setCapability("appium:autoGrantPermissions", true);
driver = new AndroidDriver(new URL("http://localhost:4723/wd/hub"), caps);
}
}
public static AndroidDriver<androidelement> getDriver() {
return driver;
}
}</androidelement></androidelement>
然后各测试类通过 DriverManager.getDriver() 获取共享实例,避免重复启动会话。
? 总结:Appium 本身不会“主动搜索多台设备”,真正触发多会话的是 TestNG 的并行调度行为。通过 parallel="false" 明确约束执行模式,并配合 Driver 单例管理,即可稳定实现单设备、类间顺序、会话复用的可靠测试流程。











