前言

这段时间在进行 公司 android app 自动化测试项目的构建。

在这一过程中,顺便把多机并发运行的功能也大致开发完毕。

下面简单说一下需求来源,实现思路。

运行效果

两台机器

需求分析

现状

  1. android 系统碎片化(品牌,设备,版本)
  2. 一个 app 需要适配各种机型,各种系统的版本
  3. 新功能发布 QA 需要花大量时间测试设备的兼容性

提升效率

  1. 对部分核心流程进行自动化测试
  2. 多机同时运行测试用例(兼容性测试),多机运行不同测试用例,提升单位时间内测试用例的运行速度

方案设计

技术选择

  1. java 语言 (工程化,可维护性高)
  2. appium(平台自动化测试神器)
  3. docker (初始化运行环境)
  4. jenkins (持续化集成)

具体方案

环境准备
分配策略
实现方法

appiumserver

adbdevices

appiumconfig

capaconfig

架构图

本图摘自-本社区用户terrychow文章

主要代码
private static List<AppiumConfig> appiumConfigs = null;
private static ThreadLocal<AppiumConfig> appiumConfigLocal = new ThreadLocal<AppiumConfig>();

/****/
public static AppiumConfig getAvailableServerConfig(){
    if(appiumConfigs == null) {
        appiumConfigs = XmlReader.getAppiumConfigList();
    }

    //获取当前连接的设备
    List<String> udidList = CommandUtil.getUdidList("127.0.0.1");
    //通过设备uid获取对应的appium config
    for (Iterator<AppiumConfig> iterator = appiumConfigs.iterator(); iterator.hasNext();) {
        AppiumConfig config = iterator.next();
        synchronized (config) {
            if (!config.isOccupied()) {
                if (udidList != null && udidList.contains(config.getUdid())) {
                    config.setOccupied(true);
                    LOG.debug("使用设备:ip " + config.getAddress() + " 设备id " + config.getUdid());
                    appiumConfigLocal.set(config);
                    return config;
                }
            }
        }
    }
    return null;
}
 private static ThreadLocal<RemoteWebDriver> remoteWebDriverThreadLocal = new ThreadLocal<>();

 public static void initDriver(Configuration conf) {
         AppiumConfig appiumConfig = AppiumConfigUtil.getAppiumConfig();
         if(appiumConfig == null){
             appiumConfig = AppiumConfigUtil.getAvailableServerConfig();
         }
         //通过 uid 获取对应 desired capability
        CapabilityConfig capabilityConfig = AppiumConfigUtil.getCapabilityConfig(appiumConfig.getUdid());
        RemoteWebDriver driver = AndroidDevice.getDriver(appiumConfig, capabilityConfig);
        remoteWebDriverThreadLocal.set(driver);
} 

注意


↙↙↙阅读原文可查看相关链接,并与作者交流