基于Docker构建Appium容器Genymotion完成移动端Python自动化测试
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://www-v1.genymotion.com/account/create/
注册成功后,注意邮箱需要激活一下,随后进入下载页面:https://www.genymotion.com/download/
这里Win10系统会有两个版本,因为Genymotion内核是基于VirtualBox虚拟机,所以如果未安装VirtualBox,则选择with Virtualbox,否则可以选择without Virtualbox,直接选择Genymotion本体即可。
安装成功后,用刚刚注册的账号进行登录,随后选择personal use(个人版):
随后选择需要测试的机型创建即可:
创建好对应手机的虚拟机,还需要进行一些设置,才能保证虚拟机正常运行。
将Virtualbox设置常规选项中的版本重新选择Ohter Linux-64位
同时将网络选项的混杂模式选择:允许虚拟电脑,这个稍后链接虚拟机的时候会用到:
最后,为了安全起见,最好将宿主机的hyper-v功能关闭,管理员权限打开终端,执行命令 bcdedit /set hypervisorlaunchtype off
重启电脑后,启动手机模拟器,出现Android界面则表示配置成功:
接着我们来配置Android ADB,Android ADB又是什么?ADB 全称是 Android Debug Bridge,是开发或使用 Android 时很常用到的工具。可以从电脑透过 USB 连线到 Android 手机上,利用指令列来控制你的手机。
这里我们主要是通过ADB命令来获取虚拟机的终端ip,直接下载压缩包文件:https://dl.google.com/android/repository/platform-tools-latest-windows.zip
将其解压到C盘根目录,C:platform-tools_r31.0.2-windowsplatform-tools
然后将该目录配置全局环境变量,使其可以在终端内直接访问: C:Usersliuyue>adb --version Android Debug Bridge version 1.0.41 Version 31.0.2-7242960 Installed as C:platform-tools_r31.0.2-windowsplatform-toolsadb.exe
现在执行设备列表命令: C:Usersliuyue>adb devices List of devices attached 192.168.42.103:5555 device
可以看到,刚刚我们启动的虚拟机已经出现在设备列表中了,直接通过connect命令就可以进行连接,和真机几乎没有任何差别: C:Usersliuyue>adb devices List of devices attached 192.168.42.103:5555 device C:Usersliuyue>adb connect 192.168.42.103:5555 already connected to 192.168.42.103:5555 C:Usersliuyue>
下面轮到Docker出场了,Docker的任务主要是利用容器运行Appuim自动化脚本,这样就避免了繁缛的Appuim安装配置环节,当然了,您的电脑得提前装好Docker,如果没有,请移步:win10系统下把玩折腾DockerToolBox以及更换国内镜像源(各种神坑)
随后下载Appium基础镜像,Dockerhub上的镜像鱼龙混杂,这里还是推荐官方的版本:https://hub.docker.com/r/appium/appium
执行命令: docker pull appium/appium
查看镜像: liuyue@DESKTOP-NVU6CCV MINGW32 ~ $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE appium/appium latest 70f3d328b949 6 weeks ago 1.55GB
紧接着启动容器: docker run --privileged -d -p 4723:4723 --name appium appium/appium
这里我们启动Appium容器,端口映射到4723,privileged参数让其具备root权限,-d后台执行。
随后查看容器运行状态: liuyue@DESKTOP-NVU6CCV MINGW32 ~ $ docker run --privileged -d -p 4723:4723 --name appium appium/appium a2e8f11fdf7c561b075b563dfcc1efb6e5381e78dc3d4435a89cf8f97be52f6d liuyue@DESKTOP-NVU6CCV MINGW32 ~ $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a2e8f11fdf7c appium/appium "/bin/sh -c "/root/w…" 7 minutes ago Up 19 seconds 4567/tcp, 0.0.0.0:4723->4723/tcp appium
此时,我们就可以利用docker容器内的adb服务进行操作了: docker exec -it appium adb connect 192.168.42.103:5555
可以看到,docker连接手机配对成功: liuyue@DESKTOP-NVU6CCV MINGW32 ~ $ docker exec -it appium adb connect 192.168.42.103:5555 connected to 192.168.42.103:5555
常用的adb命令都可以进行操作,例如查看手机Android版本: liuyue@DESKTOP-NVU6CCV MINGW32 ~ $ docker exec -it appium adb shell getprop ro.build.version.release 5.0
下面我们来编写一套简单的Appium自动化测试脚本,首先安装Appium库: pip install Appium-Python-Client
编写appium_test.py: from appium import webdriver cap = { "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 } driver = webdriver.Remote("https://192.168.99.100:4723/wd/hub", cap) # 安装APP driver.install_app(app_path="C:test.apk", replace=False, # 不允许覆盖 timeout=10000, # 超时时间为10秒 allowTestPackages=True, # 允许测试包 useSdcard=False, # 不要安装在Sdcard grantPermissions=False) # 授予权限 driver.quit()
这里的192.168.42.103:5555是Genymotion模拟的手机客户端地址,而https://192.168.99.100:4723/wd/hub则是基于Docker的Appium容器,这里我们为手机安装一款测试的app。
安装操作脚本执行以后,可以判断是否安装成功: from appium import webdriver cap = { "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 } driver = webdriver.Remote("https://192.168.99.100:4723/wd/hub", cap) # 判断APP是否安装,传递的参数为包名 res = driver.is_app_installed("com.tencent.android.qqdownloader") print(res) driver.quit()
也可以利用脚本启动一些app,比如内置的计算器应用: from appium import webdriver from time import sleep cap = { "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 } driver = webdriver.Remote("https://192.168.99.100:4723/wd/hub", cap) # 等待3秒 sleep(3) # 将APP置于后台运行5秒钟,然后再切回前台 driver.background_app(5) # 关闭APP driver.close_app() sleep(3) # 重新启动APP driver.launch_app() sleep(3) driver.quit()
这里计算器的包名和activity信息都配置在cap变量中。
杀死应用进程: from appium import webdriver cap = { "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 } driver = webdriver.Remote("https://192.168.99.100:4723/wd/hub", cap) # 等待3秒 sleep(3) # 如果应用程序没有运行或正在后台运行,则激活该应用程序 driver.activate_app("com.android.calculator2") sleep(3) # 终止应用程序 driver.terminate_app("com.android.calculator2") sleep(3) driver.quit()
几乎所有的移动端应用操作都可以编写Python脚本进行自动化测试,我们可以将Appium理解为移动端的Selenium,使用起来非常方便。
结语:莎士比亚说过,"一千个观众眼中有一千个哈姆雷特"。而在千万个Genymotion模拟器中,移动App也可以是千万种样子,通过编写Appium自动化脚本就可以将测试人员将这千万种的重复测试劳动中解放出来,何乐而不为呢?
零百只要1。1秒,贴地飞行器来了!特斯拉Roadster开启预定全新超级跑车Roadster重新开启预定(去年年底停止预定)新车订金仍然是33。2万元人民币,美国定金为5000美元。至于新车会有哪些亮点呢?下面就和玩车弟去看看吧。早在2008年
余承东又在吹牛皮了华为余大嘴也挺难,作为消费者业务ceo,其领导的手机终端业务遭受抵制(制裁),而在刚上任不久的华为智能汽车buceo职位上又遇到汽车芯片断供潮,原来1020元的汽车芯片现在居然能被
比亚迪带头停产下架!燃油车离物种灭绝还有多久?自从新能源车成为了全球公认的未来,转型电动化就成了传统车企绕不开的主线任务。但当大家都在按部就班的时候,比亚迪居然当上了新能源销冠,最近还把燃油车给停产了其实最早用上48V轻混技术
中国知网知识的传播者变为垄断者?文大象知道编辑大象知道图互联网今天,又有一条新闻上了热搜,中科院将从20号起停用中国知网。根据网传消息,中国知网的续订费用近千万,导致很多高校不堪重负。对此,中科院图书馆相关负责人
java八股文(值得收藏)Java基础1。String和StringBuffer和StringBuilder的区别?2。sleep()区间wait()区间有什么区别?3。Object中有哪些方法?其中clo
老实人刘强东,不应该被无脑黑经历性侵奶茶妹妹出局和京东裁员等风波的刘强东近两年被黑得很惨,我斗胆为东哥讲几句话。刘强东被人黑,正是因为他站出来了,因为他有所作为,树大招风就是这个道理。认真了解一下什么是自杀式
董事长对高管多严格,24小时内不回邮件电话的,直接开除京东董事长刘强东曾经说过作为我公司的高管,24小时内不回邮件电话消息的人直接开除,没有商量的余地。其他公司的高层基本也都一样,那么哪些是公司一把手不能触碰的呢?一接受贿赂。这是所有
他14岁辍学当保安,31岁身家33亿美元,却47岁突然去世,为啥论出生,他是香港首富李嘉诚的老乡。论年龄,他是昔日布鞋首富宗庆后的同龄人。论职业,他是昔日房产中介领袖左晖的同行兼前辈。论人生暴富逆袭的历程,他不比以上任何一个人轻松,也不比任何一
油价调整消息今天4月18日,全国加油站调价后9295号汽油价格新的一周的开始,我们也迎来国内成品油第八次价格调整计价周期,根据现在原油价格显示,油价预计上调。但是大家也别过于担心,因为汽柴油价格调整是要看十个工作日内的平均原油滚动价格。现在市
俄乌冲突持续,中国和日本可能将要为持有美债转而向美国付款美国4月15日公布的3月进口物价指数意外大幅升至2。6(远超前值并超越所有经济学家的预期),比2月1。4的数值更是涨超近一倍,4月14日公布的3月生产者物价指数(PPI)再创逾12
不得以等待核酸结果为由限制通行刘鹤出席全国保障物流畅通促进产业链供应链稳定电视电话会议并讲话部署十项重要举措要求努力实现民生要托底货运要畅通产业要循环4月18日,全国保障物流畅通促进产业链供应链稳定电视电话会议