Android App测试:如何单次启动App并在同一会话运行多组Cucumber测试?
如何在Appium-Cucumber-TestNG中复用设备会话完成多组测试
当然可以实现只启动一次App、复用同一设备会话跑完所有测试,核心是控制Appium驱动的生命周期,避免每组测试都重建驱动实例。具体操作如下:
利用TestNG的全局生命周期注解
把Appium驱动的初始化逻辑放到@BeforeSuite标注的方法中,驱动销毁逻辑放到@AfterSuite方法里。这样整个测试套件启动时只会创建一次设备会话,所有测试用例都复用这个会话:public class AppiumDriverSetup { public static AndroidDriver<MobileElement> driver; @BeforeSuite public void setupDriver() throws MalformedURLException { DesiredCapabilities caps = new DesiredCapabilities(); caps.setCapability("deviceName", "YourDevice"); caps.setCapability("platformName", "Android"); caps.setCapability("appPackage", "com.your.app.package"); caps.setCapability("appActivity", "com.your.app.MainActivity"); caps.setCapability("noReset", true); // 关键:禁止每次会话重置应用 driver = new AndroidDriver<>(new URL("http://localhost:4723/wd/hub"), caps); } @AfterSuite public void tearDownDriver() { if (driver != null) { driver.quit(); } } }共享驱动实例给所有步骤定义
让你的步骤定义类直接引用上述全局的driver实例,或者通过依赖注入方式传递,不要在步骤类中重新初始化驱动。同时,不要在Cucumber的@Before/@After钩子中重启App或重建驱动。处理测试间的状态隔离
复用会话的前提下,每组测试后需要手动重置应用状态(比如回到首页、清空输入框等),避免测试间互相干扰。可以写一个通用方法,用TestNG的@BeforeMethod注解调用:@BeforeMethod public void resetAppState() { driver.navigate().back(); // 回到首页的操作,比如点击底部导航的首页按钮 driver.findElement(By.id("com.your.app:id/home_btn")).click(); }关键Appium参数配置
一定要设置noReset为true,这个参数会让Appium跳过每次会话前的应用重置操作,保留当前应用的安装状态。如果需要在测试前清理部分数据但不重启App,可以配合手动清除应用内缓存的步骤,不要开启fullReset。
注意:如果你的测试用例之间存在强依赖(比如必须依赖上一个测试的执行结果),复用会话没问题;但如果是完全独立的测试,一定要确保状态重置彻底,避免测试结果出现异常。
内容的提问来源于stack exchange,提问作者Vikram
相关产品推荐
相关产品推荐

