原文转载自「刘悦的技术博客」https://v3u.cn/a_id_196

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-windows\platform-tools

然后将该目录配置全局环境变量,使其可以在终端内直接访问:

C:\Users\liuyue>adb --version
Android Debug Bridge version 1.0.41
Version 31.0.2-7242960
Installed as C:\platform-tools_r31.0.2-windows\platform-tools\adb.exe

现在执行设备列表命令:

C:\Users\liuyue>adb devices
List of devices attached
192.168.42.103:5555 device

可以看到,刚刚我们启动的虚拟机已经出现在设备列表中了,直接通过connect命令就可以进行连接,和真机几乎没有任何差别:

C:\Users\liuyue>adb devices
List of devices attached
192.168.42.103:5555 device C:\Users\liuyue>adb connect 192.168.42.103:5555
already connected to 192.168.42.103:5555 C:\Users\liuyue>

下面轮到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自动化脚本就可以将测试人员将这千万种的重复测试劳动中解放出来,何乐而不为呢?

原文转载自「刘悦的技术博客」 https://v3u.cn/a_id_196

Win10系统下基于Docker构建Appium容器连接Android模拟器Genymotion完成移动端Python自动化测试的更多相关文章

  1. 上穷碧落下凡尘:Win10系统下基于Docker配置Elasticsearch7配合Python3进行全文检索交互

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_166 基于文档式的全文检索引擎大家都不陌生,之前一篇文章:使用Redisearch实现的全文检索功能服务,曾经使用Rediseac ...

  2. Docker在手,天下我有,在Win10系统下利用Docker部署Gunicorn+Flask打造独立镜像

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_164 书接上回,之前一篇:Win10环境下使用Flask配合Celery异步推送实时/定时消息(Socket.io)/2020年最 ...

  3. Win7系统下,docker构建nginx+php7环境实践

    前面两章介绍的是Windows系统下如何安装和配置docker,主要原因在于,公司大多人数用的是Windows环境,想通过在Windows环境上,通过docker,构建一个公用的配置. 首先要说明的是 ...

  4. Ubuntu系统下基于docker部署Jenkins环境

    本文是在ubuntu环境下安装jenkins,jenkins运行在docker容器中, 至于docker如何安装,请参考https://www.cnblogs.com/xingyunqiu/p/115 ...

  5. 海纳百川无所不容,Win10环境下使用Docker容器式部署前后端分离项目Django+Vue.js

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_179 随着现代化产品研发的不断推进,我们会发现,几乎每个产品线都会包含功能各异的服务,而且服务与服务之间存在也会存在着错综复杂的依 ...

  6. Win10系统下安装编辑器之神(The God of Editor)Vim并且构建Python生态开发环境(2020年最新攻略)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_160 众神殿内,依次坐着Editplus.Atom.Sublime.Vscode.JetBrains家族.Comodo等等一众编辑 ...

  7. 【原创】基于Docker的CaaS容器云平台架构设计及市场分析

    基于Docker的CaaS容器云平台架构设计及市场分析 ---转载请注明出处,多谢!--- 1 项目背景---概述: “在移动互联网时代,企业需要寻找新的软件交付流程和IT架构,从而实现架构平台化,交 ...

  8. 视频私有云实战:基于Docker构建点播私有云平台

    私有云是为一个客户单独使用而构建的,因而提供对数据.安全性和服务质量的最有效控制.前置条件是客户拥有基础设施,并可以使用基础设施在其上部署应用程序.其核心属性是专有的资源.本篇文章将会结合网易云信的实 ...

  9. Docker从入门到掉坑(二):基于Docker构建SpringBoot微服务

    本篇为Docker从入门到掉坑第二篇:基于Docker构建SpringBoot微服务,没有看过上一篇的最好读过 Docker 从入门到掉坑 之后,阅读本篇. 在之前的文章里面介绍了如何基于docker ...

随机推荐

  1. SUSE系统---keepalived的搭建

    作为博客第一篇,先小尝初试一下搭建keepalived,因为项目需要搭建集群,为了满足需要,需要服务器对外暴露个虚拟IP,进行集群部署. 第一步:先把keepalived.tra.gz压缩包放到相应目 ...

  2. 聊聊C#中的Visitor模式

    写在前面 Visitor模式在日常工作中出场比较少,如果统计大家不熟悉的模式,那么它榜上有名的可能性非常大.使用频率少,再加上很多文章提到Visitor模式都着重于它克服语言单分派的特点上面,而对何时 ...

  3. 113_Power Pivot 销售订单之重复购买率及购买间隔天数相关

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 1.背景 在论坛中看到朋友在提复购率(重复购买率)等相关问题,今天把结果贴出来. 问题原贴:计算订单中的老顾客复购率 感谢 ...

  4. 揭秘华为云GaussDB(for Influx)最佳实践:hint查询

    摘要:GaussDB(for Influx)通过提供hint功能,在单时间线的查询场景下,性能有大幅度的提升,能有效满足客户某些特定场景的查询需求. 本文分享自华为云社区<华为云GaussDB( ...

  5. 一个 curl 配置引发的惨案

    问题 这两天想装新版本的 node,发现 nvm 一直报下面这个错误.我反复 Google 了,但是并没有找到一条我能用的. 痛苦 我起初一直怀疑是我用的 zsh-nvm 抽疯,所以今天有空就把它还有 ...

  6. 【Java面试】Mybatis中#{}和${}的区别是什么?

    一个工作2年的粉丝,被问到一个Mybatis里面的基础问题. 他跑过来调戏我,说Mic老师,你要是能把这个问题回答到一定高度,请我和一个月奶茶. 这个问题是: "Mybatis里面#{}和$ ...

  7. numpy中的np.round()取整的功能和注意

    numpy中的np.round()取整的功能和注意 功能 np.round() 是对浮点数取整的一个函数,一般的形式为 np.round(a, b),其中a为待取整的浮点数,b为保留的小数点的位数 注 ...

  8. JavaScript中动态生成表格

    动态生成表格,首先需要输入并获取动态的数字,html中结构代码如下:行:<input type="text" id="row" value="5 ...

  9. RPA工单查询和下载流程机器人

    1.登录业务系统,输入用户名和密码 2.进入下载模块 3.输入下载查询条件 4.进入文件明细单 5.下载文件 视频地址:https://www.bilibili.com/video/BV1964y1D ...

  10. NC14893 栈和排序

    NC14893 栈和排序 题目 题目描述 给你一个1->n的排列和一个栈,入栈顺序给定 你要在不打乱入栈顺序的情况下,对数组进行从大到小排序 当无法完全排序时,请输出字典序最大的出栈序列 输入描 ...