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
相关产品推荐
相关产品推荐

