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

Appium Server启停最佳实践及Socket挂起问题咨询

Appium Server 启动与停止的最佳实践

别频繁启停!这是你遇错的根源

你现在每个测试类都启停一次Appium,跑几个类就出socket hang up,本质是频繁启停导致端口没彻底释放、残留僵尸进程,累积后引发网络连接异常。

推荐的几种最佳实践

1. 全局单例启停(最常用)

整个测试套件只启动一次Appium,所有测试跑完再停一次,完全避免频繁启停的问题。对应TestNG的@BeforeSuite和@AfterSuite注解:

public class AppiumServerHandler {
    private static AppiumDriverLocalService appiumService;

    @BeforeSuite
    public void startAppium() {
        // 构建默认服务,也可自定义端口、日志路径等参数
        appiumService = AppiumDriverLocalService.buildDefaultService();
        if (!appiumService.isRunning()) {
            appiumService.start();
        }
    }

    @AfterSuite
    public void stopAppium() {
        if (appiumService != null && appiumService.isRunning()) {
            appiumService.stop();
            // 可选:强制杀掉残留的node/appium进程,防止端口占用
            killResidualProcesses();
        }
    }

    private void killResidualProcesses() {
        // 这里可以根据系统写进程清理逻辑,比如Linux下用lsof,Windows用taskkill
        // 示例:Linux清理4723端口进程
        try {
            Runtime.getRuntime().exec("lsof -ti:4723 | xargs kill -9");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2. 按测试组/模块启停(多环境隔离场景)

如果不同测试组需要不同的Appium配置(比如不同端口、不同设备),可以用@BeforeGroups和@AfterGroups,让同一组测试共享一个Appium实例:

@BeforeGroups(groups = "android-tests")
public void startAndroidAppium() {
    // 配置安卓专属的Appium服务参数
    AppiumServiceBuilder builder = new AppiumServiceBuilder()
            .usingPort(4723)
            .withLogFile(new File("android-appium.log"));
    appiumService = AppiumDriverLocalService.buildService(builder);
    appiumService.start();
}

@AfterGroups(groups = "android-tests")
public void stopAndroidAppium() {
    if (appiumService.isRunning()) {
        appiumService.stop();
    }
}

3. CI/CD环境:独立启停Appium

在持续集成流程里,直接用命令行提前启动Appium,测试结束后再停止,不依赖测试代码里的注解:

  • 启动命令:appium -p 4723 -bp 4724 --log appium-ci.log(指定主端口、bootstrap端口和日志文件)
  • 停止命令:根据系统杀掉进程,比如Linux:pkill -f appium,Windows:taskkill /F /IM node.exe

快速解决当前socket hang up的小技巧

  • 把@BeforeTest/@AfterTest换成@BeforeSuite/@AfterSuite,先试试全局启停。
  • 每次停止Appium后,手动检查对应端口(默认4723)是否被占用,确保进程彻底杀掉。
  • 给Appium配置固定端口,启动前先检查端口可用性,避免冲突。

内容的提问来源于stack exchange,提问作者masudr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 21:17:43