乐于分享
好东西不私藏

移动端自动化进阶:基于Appium的跨平台(iOS/Android)统一测试框架搭建

移动端自动化进阶:基于Appium的跨平台(iOS/Android)统一测试框架搭建

在移动应用测试领域,iOSAndroid双平台并行已是常态。不少团队初期会为两个平台分别搭建自动化测试框架,后续维护时却陷入重复开发、脚本冗余、适配成本高的困境。

Appium作为开源的跨平台移动端自动化测试工具,核心优势在于支持iOSAndroid统一脚本编写,无需针对不同平台重构核心逻辑。今天就带大家从01搭建一套可复用、易扩展的跨平台统一测试框架,助力测试效率翻倍!

一、为什么要搭建跨平台统一测试框架?

在聊搭建步骤前,先明确核心价值——解决多平台测试的痛点

降低维护成本:一套核心代码适配双平台,无需为iOSAndroid分别维护脚本,减少重复工作量;

提升脚本复用率:公共业务逻辑(如登录、支付)抽象为通用组件,各测试用例直接调用;

简化人员学习成本:测试人员无需同时掌握两套平台的自动化逻辑,专注于业务用例设计;

便于CI/CD集成:统一框架可快速对接Jenkins等工具,实现双平台测试用例的自动化触发与报告反馈。

二、框架搭建前置准备

1. 核心技术选型

结合跨平台适配需求和行业主流实践,选型如下:

组件类别

选型

核心作用

自动化核心引擎

Appium

提供跨平台自动化API,兼容iOSXCUITest)和AndroidUIAutomator2

编程语言

Java/Python

生态完善,Appium客户端支持良好(本文以Java为例)

测试框架

TestNG

支持用例分组、依赖、参数化,适配跨平台用例设计

元素定位工具

Appium Inspector

可视化定位iOS/Android元素,生成统一定位表达式

报告生成

Allure Report

生成美观、详细的测试报告,区分双平台测试结果

依赖管理

Maven/Gradle

统一管理AppiumTestNG等依赖包,简化环境配置

2. 环境搭建(关键步骤)

跨平台框架的环境配置核心是统一基础环境,区分平台特定依赖

1)通用环境

安装JDK1.8+),配置JAVA_HOME环境变量;

安装Maven/Gradle,配置镜像源(加速依赖下载);

安装Appium Server(推荐用Appium Desktop,可视化操作更友好);

安装对应编程语言的Appium客户端(Java:引入appium-java-client依赖)。

2)平台特定环境

Android环境:安装Android SDK,配置ANDROID_HOME,下载对应API版本的SDK Build-Tools

iOS环境:需在MacOS系统搭建,安装Xcode(包含XCUITest框架),配置Xcode Command Line Tools

提示:环境配置时建议记录各组件版本(如Appium版本、Java版本、SDK版本),避免因版本兼容问题导致框架异常。

三、跨平台统一框架核心设计(分层架构)

采用分层架构设计,核心思路是上层业务与下层平台解耦,确保一套业务脚本可适配双平台。整体分为5层,从下到上依次为:

基础配置层→ 核心驱动层 → 公共组件层 → 业务逻辑层 → 测试用例层

1. 基础配置层:统一管理平台配置

核心作用:将iOSAndroid的平台配置(如设备信息、App路径、启动参数)抽离为配置文件,避免硬编码。

实现方式:使用properties/xml文件存储配置,通过工具类读取。示例(config.properties):

properties# 通用配置appium.server.url=http://127.0.0.1:4723/wd/hubwait.timeout=10# Android配置android.app.path=./apps/AndroidDemo.apkandroid.device.name=emulator-5554android.platform.version=13android.app.package=com.demo.appandroid.app.activity=com.demo.app.SplashActivity# iOS配置ios.app.path=./apps/iOSDemo.ipaios.device.name=iPhone 14ios.platform.version=16.4ios.bundle.id=com.demo.appios.automation.name=XCUITest

配套工具类(ConfigUtil.java):提供静态方法读取配置,如getConfig(“android.app.package”),统一获取平台参数。

2. 核心驱动层:统一初始化Appium Driver

核心作用:根据测试平台(iOS/Android)动态初始化Appium Driver,封装驱动创建逻辑,简化上层调用。

关键思路:通过工厂模式创建Driver,判断平台类型后加载对应配置,生成统一的AndroidDriver/iOSDriver实例(均继承自AppiumDriver)。

javapublic class DriverFactory {private static AppiumDriver driver;public static AppiumDriver getDriver(String platform) {DesiredCapabilities caps = new DesiredCapabilities();// 加载通用配置caps.setCapability(“noReset”, true);caps.setCapability(“newCommandTimeout”, Integer.parseInt(ConfigUtil.getConfig(“wait.timeout”)));// 根据平台加载特定配置switch (platform.toLowerCase()) {case “android”:caps.setCapability(MobileCapabilityType.PLATFORM_NAME, “Android”);caps.setCapability(MobileCapabilityType.DEVICE_NAME, ConfigUtil.getConfig(“android.device.name”));caps.setCapability(MobileCapabilityType.PLATFORM_VERSION, ConfigUtil.getConfig(“android.platform.version”));caps.setCapability(“appPackage”, ConfigUtil.getConfig(“android.app.package”));caps.setCapability(“appActivity”, ConfigUtil.getConfig(“android.app.activity”));caps.setCapability(“app”, ConfigUtil.getConfig(“android.app.path”));break;case “ios”:caps.setCapability(MobileCapabilityType.PLATFORM_NAME, “iOS”);caps.setCapability(MobileCapabilityType.DEVICE_NAME, ConfigUtil.getConfig(“ios.device.name”));caps.setCapability(MobileCapabilityType.PLATFORM_VERSION, ConfigUtil.getConfig(“ios.platform.version”));caps.setCapability(“bundleId”, ConfigUtil.getConfig(“ios.bundle.id”));caps.setCapability(“automationName”, ConfigUtil.getConfig(“ios.automation.name”));caps.setCapability(“app”, ConfigUtil.getConfig(“ios.app.path”));break;default:throw new RuntimeException(“不支持的平台:” + platform);}// 初始化Drivertry {driver = new AppiumDriver(new URL(ConfigUtil.getConfig(“appium.server.url”)), caps);} catch (MalformedURLException e) {e.printStackTrace();throw new RuntimeException(“Driver初始化失败:” + e.getMessage());}return driver;}// 封装Driver关闭方法public static void quitDriver() {if (driver != null) {driver.quit();}}}

3. 公共组件层:封装通用操作,适配跨平台

核心作用:将移动端通用操作(如点击、输入、滑动、等待)封装为公共方法,处理平台差异,确保上层调用统一。

关键思路:对于平台差异较大的操作(如返回键、滑动方向),通过判断平台类型执行不同逻辑;通用操作直接封装为统一方法。

javapublic class BaseAction {protected AppiumDriver driver;public BaseAction(AppiumDriver driver) {this.driver = driver;}// 统一点击方法(支持元素定位符传入)public void click(By locator) {WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(Integer.parseInt(ConfigUtil.getConfig(“wait.timeout”))));wait.until(ExpectedConditions.elementToBeClickable(locator)).click();}// 统一输入方法public void input(By locator, String text) {WebElement element = new WebDriverWait(driver, Duration.ofSeconds(Integer.parseInt(ConfigUtil.getConfig(“wait.timeout”)))).until(ExpectedConditions.visibilityOfElementLocated(locator));element.clear();element.sendKeys(text);}// 跨平台返回操作(Android按返回键,iOS滑动返回)public void back() {String platform = driver.getCapabilities().getCapability(MobileCapabilityType.PLATFORM_NAME).toString();if (platform.equalsIgnoreCase(“Android”)) {driver.navigate().back();} else if (platform.equalsIgnoreCase(“iOS”)) {// iOS滑动返回(从左到右滑动)Dimension size = driver.manage().window().getSize();int startX = (int) (size.width * 0.1);int endX = (int) (size.width * 0.8);int y = (int) (size.height * 0.5);new TouchAction(driver).press(PointOption.point(startX, y)).waitAction(WaitOptions.waitOptions(Duration.ofMillis(500))).moveTo(PointOption.point(endX, y)).release().perform();}}}

4. 业务逻辑层:抽象公共业务,复用脚本

核心作用:将各页面的业务逻辑(如登录、首页跳转、支付流程)封装为PageObject,上层用例直接调用,避免重复编写。

示例(登录页面LoginPage.java):

javapublic class LoginPage extends BaseAction {// 元素定位(统一用By定位符,适配双平台)private By usernameInput = By.id(“com.demo.app:id/et_username”); // Android用id,iOS可共用accessibilityIdprivate By passwordInput = By.id(“com.demo.app:id/et_password”);private By loginBtn = By.id(“com.demo.app:id/btn_login”);private By successToast = By.xpath(“//*[contains(@text,’登录成功’)]”); // 适配Android文本,iOS可调整xpathpublic LoginPage(AppiumDriver driver) {super(driver);}// 封装登录业务逻辑public void login(String username, String password) {input(usernameInput, username);input(passwordInput, password);click(loginBtn);// 等待登录成功提示new WebDriverWait(driver, Duration.ofSeconds(5)).until(ExpectedConditions.visibilityOfElementLocated(successToast));}}

注意:元素定位优先选择双平台通用的定位方式(如accessibilityId),若平台差异无法避免,可在定位符中通过平台判断动态选择(如AndroididiOSxpath)。

5. 测试用例层:编写跨平台统一用例

核心作用:基于TestNG的参数化功能,实现一套用例,双平台执行,通过参数指定测试平台。

示例(登录测试用例LoginTest.java):

javapublic class LoginTest {private AppiumDriver driver;private LoginPage loginPage;// 用例执行前初始化Driver和Page@BeforeMethod@Parameters({“platform”})public void setUp(String platform) {driver = DriverFactory.getDriver(platform);loginPage = new LoginPage(driver);}// 统一登录用例(双平台共用)@Test(description = “正确账号密码登录”)public void testSuccessfulLogin() {loginPage.login(“test_user”, “123456”);// 断言:登录后跳转首页(通过首页元素是否可见判断)By homeTitle = By.id(“com.demo.app:id/tv_home_title”);WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));Assert.assertTrue(wait.until(ExpectedConditions.visibilityOfElementLocated(homeTitle)).isDisplayed());}// 用例执行后关闭Driver@AfterMethodpublic void tearDown() {DriverFactory.quitDriver();}}

TestNG配置文件(testng.xml):通过参数指定测试平台,可单独执行单平台用例或并行执行双平台用例:

xml<?xml version=”1.0″ encoding=”UTF-8″?><!DOCTYPE suite SYSTEM “http://testng.org/testng-1.0.dtd”><suite name=”跨平台测试套件” parallel=”tests” thread-count=”2″><!– Android测试用例 –><test name=”Android测试”><parameter name=”platform” value=”android”/><classes><class name=”com.demo.test.LoginTest”/></classes></test><!– iOS测试用例 –><test name=”iOS测试”><parameter name=”platform” value=”ios”/><classes><class name=”com.demo.test.LoginTest”/></classes></test></suite>

四、跨平台框架优化技巧

1. 元素定位优化:优先选择通用定位符

优先使用accessibilityIdAndroid对应contentDescriptioniOS对应accessibilityIdentifier),双平台可共用;

避免使用坐标定位(不同设备尺寸适配差),尽量用语义化定位(idxpathcss);

若平台元素差异大,可在PageObject中通过平台判断动态选择定位符。

2. 稳定性优化:处理平台特有异常

Android:处理弹窗权限(如定位、存储权限),可在Driver初始化时加入自动授权逻辑;

iOS:处理弹窗(如是否允许推送),封装弹窗处理工具类,用例执行前自动关闭;

加入重试机制:对易失败的用例(如滑动、网络请求相关),通过TestNG的重试监听器实现失败重试。

3. 报告优化:区分双平台测试结果

集成Allure Report,在测试用例中加入平台标签,生成的报告可清晰区分iOSAndroid的测试结果,包括用例通过率、失败原因、截图(失败时自动截图)等。

4. CI/CD集成:实现双平台自动化触发

将框架对接Jenkins,配置两个任务(Android测试、iOS测试),或通过参数化构建一键触发双平台并行测试,测试完成后自动发送报告邮件,实现代码提交自动测试结果反馈的闭环。

五、框架落地效果与总结

搭建完成后,框架具备以下核心优势:

脚本复用率提升60%+:一套核心代码适配双平台,新增业务用例无需重复开发;

维护成本降低50%+:仅需维护一套框架,平台适配逻辑集中处理;

执行效率翻倍:支持双平台并行测试,配合CI/CD可实现夜间自动执行,次日直接查看报告。

最后提醒:跨平台框架的核心是解耦”——通过分层设计分离平台差异和业务逻辑,让上层用例专注于业务验证,下层统一处理平台适配。实际落地时,可根据团队业务场景(如是否需要支持多设备、是否涉及混合应用)灵活扩展框架功能(如加入设备管理、接口联调等)。

如果在框架搭建过程中遇到Appium版本兼容、元素定位适配等问题,欢迎在评论区留言交流!需要框架完整代码示例的同学,可关注公众号回复“Appium跨平台框架获取~

本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » 移动端自动化进阶:基于Appium的跨平台(iOS/Android)统一测试框架搭建

评论 抢沙发

4 + 4 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
×
订阅图标按钮