一、简介
上篇文章讲解了Docker环境下搭建STF平台的步骤,在之后的测试实践中发现Docker环境的STF服务并不稳定,新接入设备后需要重启STF服务才能识别,后转入到Mac平台下,服务稳定性有一定提高。
建议:如果仅是尝鲜的话,可以试着在docker中执行搭建流程并且完成安卓设备的接入,但是若需要stf服务稳定运行并且集成UI自动化或者Monkey的话还是建议转战Mac平台。
二、背景
公司项目需要,Android、IOS的UI自动化基本完成全量的需求场景,但考虑到设备碎片化以及兼容性等问题,需要将UI自动化脚本同时运行到不同的设备中,完成测试环境以及生产环境的冒烟。而多设备执行则涉及到测试机管理的问题,所以搭建此平台完成Android、IOS设备的同时介入,方便脚本的统一运行及管理,节省测试时间,提高测试效率。
三、环境搭建
1.完成Android设备介入
Android设备的接入依赖于SDK与JAVA环境,所以需要配置adb以及jdk
下载安装mac版的adb和jdk文件,安装完成后需要进行环境变量的配置
打开mac终端窗口,执行命令open .bash_profile打开配置文件
配置Android-SDK环境:
export ANDROID_HOME='/Users/用户名/android-sdk'
export PATH=${PATH}:/Users/用户名/android-sdk/tools
export PATH=${PATH}:/Users/用户名/android-sdk/platform-tools
配置JAVA环境:
JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home
PATH=$JAVA_HOME/bin:$PATH:.
CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:.
export JAVA_HOME
export PATH
export CLASSPATH
保存配置文件,然后继续在终端执行命令source .bash_profile使配置生效
检查软件是否配置正常:
分别在终端输入java -version和adb version,正常返回版本信息即代表配置正常,如下图:
2.搭建STF环境
安装node.js,建议安装8.X的版本,不要使用最新版本。亲身踩过此坑,高版本的node对接stf时会出现依赖包不兼容的情况,若出现该问题需要卸载当前的node,并且安装8.X版本。
node安装完成后,执行node -v以及npm -v查验软件是否安装成功
安装数据库rethinkdb
brew install rethinkdb
安装完成后打开浏览器http://localhost:8080/,能正常返回本地rethinkdb数据库信息即为安装成功
安装stf依赖包
brew install graphicsmagick zeromq protobuf yasm pkg-config
安装完成后执行stf doctor,无明显报错即为安装完成
启动命令窗口,输入rethinkdb命令
再启动一个窗口,输入stf local则可以正常启动stf服务
打开浏览器输入地址http://localhost:7100/auth/mock则可以访问本地stf平台
连入Android设备则可在平台上看到相关设备信息
至此Android的搭建完成。
3.完成IOS设备接入
STF作为一个支持安卓设备管理的开源项目,可从github上下载相关项目源码,虽然官网地址不支持IOS的设备接入,但是进行二次改造可以实现Android、IOS的同时管控。
我们先来看下的Android的设备是怎么连接上的。在STF中,设备是通过供应商进程来管理的,一个供应商可以连接多个设备,设备的连接就是通过提供这个进程来处理的。我们先找到提供商的代码,在/stf/lib/units/provider/index.js文件,注意以下代码段:
首先,通过传入参数adbHost和adbPort创建一个adbkit的对象客户端时,调用client.trackDevices返回跟踪对象,然后监听跟踪器的添加/变更/删除事件,顾名思义,这三个事件分别就是设备的增加/改变/删除了。我们主要看下添加事件的处理函数里做了什么,首先有个匿名函数
这个函数的作用就是通过ZMQ发送DeviceIntroductionMessage消息通知其他模块,我发现了一个设备。接下来有一个产卵函数
这个options.fork是什么呢?我们知道选项是传入的参数对象,那我们先看看提供商的传入参数有哪些,找到文件/stf/stf/lib/cli/provider/index.js
这里可以看到叉参数实际上是一个函数,在这个函数里通过叉的方式启动了一个设备的子进程。再回到前面产卵函数,也就是说,产卵函数实际上是开启了一个装置子进程,后面的代码就是对设备子进程事件和消息的处理了可能有人已经注意到了列表,这个列表的定义如下:
列表用来存储所有设备和两种状态的设备列表,设备首先会添加到等待列表,只有当设备进程的所有模块加载完成,收到设备进程的准备消息才会被添加到准备列表,同时从等待列表移除。接下来有个工作函数
这个主要是调用产卵函数启动设备进程,如果进程抛出异常则重启设备进程那么工作函数又是在哪调用的呢,这里面的函数调用链如下:匿名函数发送DeviceIntroductionMessage消息返回寄存器 - >寄存器。然后(()=>检查()) - >工作 - >开启设备子进程这就是设备连接的大致过程。
基于以上内容,完成IOS设备的接入需要完成设备的获取、设备的连接,有设备新增时发送一个加入消息,有设备断开时,发送删除消息,github上已有大佬开源了这部分功能https://github.com/mrx1203/stf.git
IOS设备的获取连接需要安装libimobiledevice等依赖工具
brew install usbmuxd;brew link usbmuxd;brew install libimobiledevice;brew install ideviceinstaller;brew install carthage;brew install socat
在STF连接IOS设备时会出现lockdown的问题,解决办法为卸载当前版本的libimobiledevice,安装高版本的,命令可更改为brew install --HEAD libimobiledevice;brew install --HEAD ideviceinstaller
IOS的集成主要依赖于WebDriverAgent,需要下载WDA并根据网上教程配置WDA相关证书以及完成Test测试。
如果Build Succeed则IOS测试机上会安装一个无图标的WebDriverAgentRunner
若在STF服务运行中日志无法打印出wda启动成功等信息,需要在xcode中手动执行wda工程,并且查看日志是否能正常打印出url等信息。成功打印出url,并且在浏览器中输入该url+status能正常返回json信息,则wda与stf的通信无误
clone上述git地址,并进入stf目录中执行切换到stf目录下,安装依赖库npm install;npm install --save request;npm install --save request-promise;npm link即完成iOS设备的接入。