
本文介绍如何在基于 bdd 的 appium 测试框架中,将应用重置(resetapp)和 webdriver 实例清理操作从“每测试类执行一次”调整为“每测试用例执行一次”,确保测试间完全隔离。
本文介绍如何在基于 bdd 的 appium 测试框架中,将应用重置(resetapp)和 webdriver 实例清理操作从“每测试类执行一次”调整为“每测试用例执行一次”,确保测试间完全隔离。
在 Appium 自动化测试中,保持测试用例之间的独立性至关重要。若多个 @Given/@When/@Then 步骤共用同一 Appium session 和应用状态(如登录态、缓存数据、页面栈等),极易引发偶发性失败。默认情况下,许多 BDD 框架(如基于 Cucumber + TestNG/JUnit 的 MasterAppiumFramework_BDD)会在每个测试类(@BeforeClass/@AfterClass)生命周期内复用同一个 AppiumDriver 实例,并仅在类结束时调用 driver.quit() —— 这意味着单个类内的多个场景(Scenario)会共享同一应用上下文。
要实现每个测试用例(Scenario)后彻底重置应用并重建干净的 driver 实例,关键在于:
✅ 在 Cucumber 的 @After 钩子中执行 resetApp();
✅ 紧接着调用 driver.quit() 释放 session;
✅ 并在下一个 @Before 钩子中重新初始化 driver(确保后续场景不复用旧实例)。
以 MasterAppiumFramework_BDD 项目为例,需修改 src/test/java/hooks/Hooks.java 中的 quit() 方法(通常位于 @After 注解方法内):
@After
public void quit(Scenario scenario) {
if (scenario.isFailed()) {
// 可选:添加截图逻辑
final byte[] screenshot = ((TakesScreenshot) DriverManager.getDriver()).getScreenshotAs(OutputType.BYTES);
scenario.attach(screenshot, "image/png", "failed_screenshot");
}
// ✅ 关键步骤:先重置应用状态(清空数据、重启 Activity)
DriverManager.getDriver().resetApp();
// ✅ 关键步骤:立即销毁当前 driver session
DriverManager.getDriver().quit();
// ✅ 可选但推荐:显式置空静态 driver 引用,防止内存泄漏或误复用
DriverManager.setDriver(null);
}⚠️ 注意事项:
- resetApp() 是 Appium 原生命令,会触发 adb shell am force-stop
+ 启动默认 Activity,效果等同于手动卸载重装(但更快),适用于 Android;iOS 上等效行为由 mobile: terminateApp + mobile: launchApp 组合实现(需确认 Appium 版本支持)。 - 若使用 driver.closeApp() 而非 resetApp(),仅关闭前台应用,不清理数据,无法保证状态隔离。
- 必须在 quit() 前调用 resetApp(),否则 session 已销毁将抛出 InvalidSessionIdException。
- 若框架中 DriverManager.getDriver() 返回 null(如未初始化),需增加空值校验,避免 NPE:
AppiumDriver<?> driver = DriverManager.getDriver(); if (driver != null) { driver.resetApp(); driver.quit(); DriverManager.setDriver(null); }
通过上述改造,每个 Cucumber Scenario 执行完毕后都会:
- 清除应用全部本地状态(SharedPreferences、数据库、缓存等);
- 终止当前 Appium session;
- 为下一个 Scenario 准备全新、无污染的启动环境。
这显著提升了测试稳定性和可重复性,尤其适用于多账号切换、表单提交验证、异常流程覆盖等强状态依赖场景。











