原文转载自「刘悦的技术博客」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
评论