iOS自动化测试:如何用Java工具类实现每次测试前自动启动Appium与应用
我之前在Java环境做iOS自动化测试时,刚好实现过类似的需求——通过Helper类自动搞定Appium服务启动和被测应用拉起,彻底告别手动操作。下面是我实际验证过的方案,你可以直接参考:
1. 封装Appium服务启动/关闭Helper类
Appium本质是Node.js运行的服务,我们可以用Java的ProcessBuilder来调用系统命令启动它,同时封装端口检查、进程关闭的逻辑,避免重复启动或端口冲突。
import java.io.IOException; import java.net.ServerSocket; public class AppiumServerHelper { private static Process appiumProcess; private static final int APPIUM_PORT = 4723; // 自定义Appium端口 // 检查目标端口是否被占用 private static boolean isPortOccupied(int port) { try (ServerSocket socket = new ServerSocket(port)) { return false; } catch (IOException e) { return true; } } // 启动Appium服务 public static void launchAppiumServer() throws IOException { if (isPortOccupied(APPIUM_PORT)) { System.out.println("⚠️ Appium端口" + APPIUM_PORT + "已被占用,跳过启动"); return; } // 构建Appium启动命令,可添加自定义参数(比如指定日志级别、设备UDID) ProcessBuilder processBuilder = new ProcessBuilder( "appium", "--port", String.valueOf(APPIUM_PORT), "--log-level", "info:debug" // 可选:输出详细日志方便调试 ); // 将Appium的控制台输出同步到测试日志中 processBuilder.inheritIO(); appiumProcess = processBuilder.start(); System.out.println("✅ Appium服务已启动,端口:" + APPIUM_PORT); } // 停止Appium服务 public static void shutdownAppiumServer() { if (appiumProcess != null && appiumProcess.isAlive()) { appiumProcess.destroy(); System.out.println("✅ Appium服务已停止"); } } }
2. 封装iOS应用启动配置Helper类
把iOS自动化需要的Desired Capabilities封装成单独的方法,方便测试类复用,也便于后续修改配置。
import io.appium.java_client.remote.MobileCapabilityType; import org.openqa.selenium.remote.DesiredCapabilities; public class IOSAppCapHelper { public static DesiredCapabilities getTestAppCapabilities() { DesiredCapabilities caps = new DesiredCapabilities(); // 基础配置(模拟器示例,真实设备需调整) caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "iOS"); caps.setCapability(MobileCapabilityType.PLATFORM_VERSION, "17.0"); // 你的模拟器系统版本 caps.setCapability(MobileCapabilityType.DEVICE_NAME, "iPhone 15"); // 你的模拟器名称 caps.setCapability(MobileCapabilityType.AUTOMATION_NAME, "XCUITest"); caps.setCapability("bundleId", "com.yourcompany.YourTestApp"); // 被测App的Bundle ID // 如果需要安装新的App包,添加以下配置(路径替换为你的IPA/App文件路径) // caps.setCapability(MobileCapabilityType.APP, "/Users/xxx/Documents/TestApp.ipa"); return caps; } }
3. 在测试基类中整合Helper类
用测试框架(比如TestNG/JUnit)的前置/后置注解,在测试执行前自动启动Appium和应用,测试结束后自动清理资源。
以TestNG为例:
import io.appium.java_client.ios.IOSDriver; import org.openqa.selenium.remote.RemoteWebDriver; import org.testng.annotations.AfterSuite; import org.testng.annotations.BeforeSuite; import java.io.IOException; import java.net.URL; public class BaseTest { protected RemoteWebDriver driver; @BeforeSuite public void initTestEnvironment() throws IOException { // 1. 启动Appium服务 AppiumServerHelper.launchAppiumServer(); // 2. 初始化Driver,自动拉起被测App URL appiumServerUrl = new URL("http://localhost:4723/wd/hub"); driver = new IOSDriver(appiumServerUrl, IOSAppCapHelper.getTestAppCapabilities()); System.out.println("✅ 被测应用已启动"); } @AfterSuite public void cleanTestEnvironment() { // 关闭Appium Driver if (driver != null) { driver.quit(); } // 停止Appium服务 AppiumServerHelper.shutdownAppiumServer(); } }
关键注意事项
- 环境依赖:确保Node.js和Appium已全局安装,且环境变量配置正确,这样Java才能直接调用
appium命令;如果Appium不是全局安装,需要替换为Appium的完整路径(比如Mac下的/usr/local/bin/appium) - 真实设备适配:如果用真实设备测试,需要添加
udid参数(caps.setCapability("udid", "你的设备UDID")),同时确保WebDriverAgent已正确配置并签名 - 进程清理:测试结束后一定要调用
shutdownAppiumServer()和driver.quit(),避免残留进程占用资源
内容的提问来源于stack exchange,提问作者AutoTig
相关产品推荐
相关产品推荐

