基于Docker构建Appium容器Genymotion完成
Python自动化,大概也许或者是今年最具热度的话题之一了。七月流火,招聘市场上对于Python自动化的追捧热度仍未消减,那么Python自动化到底能帮我们做些什么呢?
第一,Python自动化可以避免熟练工种的重复工作,对于功能相对完整和成熟的软件,每发布一个新的版本,无论是大版本还是小版本,其中大部分功能和界面都几乎和上一个版本相似或完全相同,但所谓向上兼容,你不能因为新功能的产生而不对老版本功能进行测试工作,而这些老功能又在上一个版本上线时测过,所以这部分功能特别适合于自动化测试,从而可以让测试达到测试每个特征的目的。
第二,Python自动化可以帮助我们提高测试效率:比如一个项目要的开发周期只有短短的几个月,而在测试期间是每周都要发布一个版本供测试人员测试,一个系统的功能点有几千个上万个,人工测试是非常的耗时和繁琐,这样必然会使测试效率低下,而自动化流程恰恰帮我们提高了测试效率。
那么对于移动App测试领域,如果一个新的应用发布版本,QA人员面临的挑战就是如何应对市场上数以千计的机型兼容性测试,毫无疑问,这是一个非常浩大的工程,更别提有些工程机在市面上根本就采购不到,比如谷歌的Nexus和Pixel系列手机,所以本次我们就在Win10系统下尝试利用Genymotion模拟器配合Docker构建Appium容器,实现短时间内上千款机型的自动化测试工作。
首先关于Android模拟器为什么选择Genymotion,诚然,国内也有蓝神等模拟器可供选择,但是Genymotion作为Android模拟器领域的执牛耳者,其启动及运行速度非常快,不仅支持多个Android版本,还可以多个Android系统同时启动运行,这就为我们并行测试脚本提供了便利,当然了,Genymotion也有自身的缺点,就是客户端版本为内核x86架构暂不支持arm框架的应用,但是云端服务已经支持了arm架构,这无疑在模拟器领域是一个重大利好。
进入Genymotion注册页面:https:wwwv1。genymotion。comaccountcreate
注册成功后,注意邮箱需要激活一下,随后进入下载页面:https:www。genymotion。comdownload
这里Win10系统会有两个版本,因为Genymotion内核是基于VirtualBox虚拟机,所以如果未安装VirtualBox,则选择withVirtualbox,否则可以选择withoutVirtualbox,直接选择Genymotion本体即可。
安装成功后,用刚刚注册的账号进行登录,随后选择personaluse(个人版):
随后选择需要测试的机型创建即可:
创建好对应手机的虚拟机,还需要进行一些设置,才能保证虚拟机正常运行。
将Virtualbox设置常规选项中的版本重新选择OhterLinux64位
同时将网络选项的混杂模式选择:允许虚拟电脑,这个稍后链接虚拟机的时候会用到:
最后,为了安全起见,最好将宿主机的hyperv功能关闭,管理员权限打开终端,执行命令bcdeditsethypervisorlaunchtypeoff
重启电脑后,启动手机模拟器,出现Android界面则表示配置成功:
接着我们来配置AndroidADB,AndroidADB又是什么?ADB全称是AndroidDebugBridge,是开发或使用Android时很常用到的工具。可以从电脑透过USB连线到Android手机上,利用指令列来控制你的手机。
这里我们主要是通过ADB命令来获取虚拟机的终端ip,直接下载压缩包文件:https:dl。google。comandroidrepositoryplatformtoolslatestwindows。zip
将其解压到C盘根目录,C:platformtoolsr31。0。2windowsplatformtools
然后将该目录配置全局环境变量,使其可以在终端内直接访问:C:UsersliuyueadbversionAndroidDebugBridgeversion1。0。41Version31。0。27242960InstalledasC:platformtoolsr31。0。2windowsplatformtoolsadb。exe
现在执行设备列表命令:C:UsersliuyueadbdevicesListofdevicesattached192。168。42。103:5555device
可以看到,刚刚我们启动的虚拟机已经出现在设备列表中了,直接通过connect命令就可以进行连接,和真机几乎没有任何差别:C:UsersliuyueadbdevicesListofdevicesattached192。168。42。103:5555deviceC:Usersliuyueadbconnect192。168。42。103:5555alreadyconnectedto192。168。42。103:5555C:Usersliuyue
下面轮到Docker出场了,Docker的任务主要是利用容器运行Appuim自动化脚本,这样就避免了繁缛的Appuim安装配置环节,当然了,您的电脑得提前装好Docker,如果没有,请移步:win10系统下把玩折腾DockerToolBox以及更换国内镜像源(各种神坑)
随后下载Appium基础镜像,Dockerhub上的镜像鱼龙混杂,这里还是推荐官方的版本:https:hub。docker。comrappiumappium
执行命令:dockerpullappiumappium
查看镜像:liuyueDESKTOPNVU6CCVMINGW32dockerimagesREPOSITORYTAGIMAGEIDCREATEDSIZEappiumappiumlatest70f3d328b9496weeksago1。55GB
紧接着启动容器:dockerrunprivilegeddp4723:4723nameappiumappiumappium
这里我们启动Appium容器,端口映射到4723,privileged参数让其具备root权限,d后台执行。
随后查看容器运行状态:liuyueDESKTOPNVU6CCVMINGW32dockerrunprivilegeddp4723:4723nameappiumappiumappiuma2e8f11fdf7c561b075b563dfcc1efb6e5381e78dc3d4435a89cf8f97be52f6dliuyueDESKTOPNVU6CCVMINGW32dockerpsCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMESa2e8f11fdf7cappiumappiumbinshcrootw7minutesagoUp19seconds4567tcp,0。0。0。0:47234723tcpappium
此时,我们就可以利用docker容器内的adb服务进行操作了:dockerexecitappiumadbconnect192。168。42。103:5555
可以看到,docker连接手机配对成功:liuyueDESKTOPNVU6CCVMINGW32dockerexecitappiumadbconnect192。168。42。103:5555connectedto192。168。42。103:5555
常用的adb命令都可以进行操作,例如查看手机Android版本:liuyueDESKTOPNVU6CCVMINGW32dockerexecitappiumadbshellgetpropro。build。version。release5。0
下面我们来编写一套简单的Appium自动化测试脚本,首先安装Appium库:pipinstallAppiumPythonClient
编写appiumtest。py:fromappiumimportwebdrivercap{platformName:Android,platformVersion:5,deviceName:192。168。42。103:5555,udid:192。168。42。103:5555,真机的platformName:Android,platformVersion:7。1。2,deviceName:10d4e4387d74,noReset:True,unicodeKeyboard:True,resetkeyboard:True}driverwebdriver。Remote(https:192。168。99。100:4723wdhub,cap)安装APPdriver。installapp(apppathC:test。apk,replaceFalse,不允许覆盖timeout10000,超时时间为10秒allowTestPackagesTrue,允许测试包useSdcardFalse,不要安装在SdcardgrantPermissionsFalse)授予权限driver。quit()
这里的192。168。42。103:5555是Genymotion模拟的手机客户端地址,而https:192。168。99。100:4723wdhub则是基于Docker的Appium容器,这里我们为手机安装一款测试的app。
安装操作脚本执行以后,可以判断是否安装成功:fromappiumimportwebdrivercap{platformName:Android,platformVersion:5,deviceName:192。168。42。103:5555,udid:192。168。42。103:5555,真机的platformName:Android,platformVersion:7。1。2,deviceName:10d4e4387d74,noReset:True,unicodeKeyboard:True,resetkeyboard:True}driverwebdriver。Remote(https:192。168。99。100:4723wdhub,cap)判断APP是否安装,传递的参数为包名resdriver。isappinstalled(com。tencent。android。qqdownloader)print(res)driver。quit()
也可以利用脚本启动一些app,比如内置的计算器应用:fromappiumimportwebdriverfromtimeimportsleepcap{platformName:Android,platformVersion:5,deviceName:192。168。42。103:5555,udid:192。168。42。103:5555,真机的platformName:Android,platformVersion:7。1。2,deviceName:10d4e4387d74,appPackage:com。android。calculator2,appActivity:com。android。calculator2。Calculato,noReset:True,unicodeKeyboard:True,resetkeyboard:True}driverwebdriver。Remote(https:192。168。99。100:4723wdhub,cap)等待3秒sleep(3)将APP置于后台运行5秒钟,然后再切回前台driver。backgroundapp(5)关闭APPdriver。closeapp()sleep(3)重新启动APPdriver。launchapp()sleep(3)driver。quit()
这里计算器的包名和activity信息都配置在cap变量中。
杀死应用进程:fromappiumimportwebdrivercap{platformName:Android,platformVersion:5,deviceName:192。168。42。103:5555,udid:192。168。42。103:5555,真机的platformName:Android,platformVersion:7。1。2,deviceName:10d4e4387d74,appPackage:com。android。calculator2,appActivity:com。android。calculator2。Calculato,noReset:True,unicodeKeyboard:True,resetkeyboard:True}driverwebdriver。Remote(https:192。168。99。100:4723wdhub,cap)等待3秒sleep(3)如果应用程序没有运行或正在后台运行,则激活该应用程序driver。activateapp(com。android。calculator2)sleep(3)终止应用程序driver。terminateapp(com。android。calculator2)sleep(3)driver。quit()
几乎所有的移动端应用操作都可以编写Python脚本进行自动化测试,我们可以将Appium理解为移动端的Selenium,使用起来非常方便。
结语:莎士比亚说过,一千个观众眼中有一千个哈姆雷特。而在千万个Genymotion模拟器中,移动App也可以是千万种样子,通过编写Appium自动化脚本就可以将测试人员将这千万种的重复测试劳动中解放出来,何乐而不为呢?