You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:43:40