Appium 简介与自动化测试环境搭建
1. Appium 简介
2. Appium 自动化测试环境搭建
1. Appium 简介
Appium 是一个开源的自动化测试框架,适用于原生的、混合的、移动端 Web 的应用程序,其使用 WebDriver 协议来驱动 iOS、Android 和 Windows 应用程序。
- 原生应用:指用 iOS、Android 或者 Windows SDKs 编写的应用。
- 移动 Web 应用:指用移动端浏览器访问的应用(Appium 支持 Safari、Chrome 和 Android 上的内置浏览器)。
- 混合应用:指带有一个 WebView 的包装器,用来和 Web 内容交互的原生空间。
1)Appium 优势
- 开源免费。
- 跨平台:允许使用相同的 API 针对多个平台(iOS、Android、Windows)编写测试脚本。
- 支持多种类型的应用:可以测试原生的、混合的、移动端 Web 项目。
- 支持多种编程语言:可以用任何编程语言编写的Appium客户端向 Appium 服务端发送 HTTP 请求。
Appium 支持 Selenium WebDriver 支持的所有语言,更可以使用 Selenium WebDriver 的 API。Appium 支持任何一种测试框架。如果只使用 Apple 的 UIAutomation,我们只能用 javascript 来编写测试用例,而且只能用 Instruction 来运行测试用例。同样,如果只使用 Google 的 UIAutomation,我们就只能用 Java 来编写测试用例。Appium 实现了真正的跨平台自动化测试。
Appium 选择了 Client/Server 的设计模式,只要 Client 能够发送 HTTP 请求给 Server,那么 Client 用什么语言来实现都是可以的,这就是 Appium 及 WebDriver 能做到支持多语言的原因。
2)Appium 架构
Appium 使用的是 C/S 架构(客户端/服务器):
- Appium Client:即编写的自动化脚本(支持多种语言,如 Python、Java 等),使用 JSONWire 协议与 Appium 服务端进行通信,即给服务端发送请求会话来执行自动化任务。
- Appium Server:Appium 的服务端,即一个 Web 接口服务,使用 Node.js 编写的 HTTP 服务器,用于处理 Appium 客户端传送过来的指令。
- Appium Desktop:一款适用于 Mac、Windows 和 Linux 的开源应用程序(封装了 Appium Server),它以美观而灵活的用户界面提供 Appium 自动化服务器的强大功能。
- 启动 Appium 服务端(默认开启 4723 端口),接收来自 Appium 客户端的连接,监听指令。
- Appium 客户端通过执行脚本,将指令转换成 JSON Wire 协议规定的 JSON 格式数据,通过 HTTP 请求发送给 Appium 服务端。
- Appium 服务端接收到指令后(实现对 JSON Wire 协议的处理),基于 Socket 将指令发送给代理程序(Bootstrap.jar/ Bootstrap.js),安装在手机上的 Bootstrap 监听 4724 端口并接收 Appium 的命令。
- Bootstrap 代理程序接收到指令后,通过调用移动设备(Android/iOS)自带的测试框架(UIAutomator/UIAutomation)执行这些指令,进行 UI 操作。
- 执行完毕后,将执行结果以 HTTP 响应的方式返回给 Appium 服务端,再由 Appium 服务端返回给 Appium 客户端。
3)Appium 组件
- UIAutomator:由谷歌推出的一款 UI 测试框架,提供 API 对 Android 系统进行一系列的自动化测试操作,Android 4.2 之后系统自带的 UI 自动化测试工具。
- UIAutomation:由苹果公司发布的一个测试框架,主要用于自动化测试 iOS 和 OS X 应用的 UI 交互情况,iOS 系统自带的 UI 自动化测试工具。
- Bootstrap.jar:Appium 在 Android 上基于 UIAutomator 实现的测试代理程序,可以调用 UIAutomator 的方法实现一系列 UI 操作。
- Bootstrap.js:Appium 在 iOS上基于 UIAutomation 实现的测试代理程序,可以调用 UIAutomation 的方法实现一系列 UI 操作。
UiAutomator API
UiAutomator 对外提供了很多方法,便于 UI 自动化测试调用执行。
UiDevice | 操作物理按键、拖拽、滑动、通知栏、截屏等,如 pressHome、pressRecentApps、pressKeyCode、waitForIdle、drag、swipe、isScreenOn、openNotification、openQuickSetting 等。 |
UiSelector | 可通过 Text、description、class、package、index 等属性定位。获取到的 UiSelector 可通过 UiObject 封装后进行操作。 |
UiObject | click、drag、swipe、setText、属性获取、是否存在等方法。 |
UiCollection | 是 UiObject 的子类,是控件的集合,如计算器是数字按键。 |
UiScrollable | 是 UiObject 的子类,滚动控件。 |
Bootstrap 类的实现
1 package io.appium.android.bootstrap; 2 import io.appium.android.bootstrap.exceptions.SocketServerException; 3 import com.android.uiautomator.testrunner.UiAutomatorTestCase; 4 /** 5 * The Bootstrap class runs the socket server. uiautomator开发的脚本,可以直接在pc端启动 6 */ 7 public class Bootstrap extends UiAutomatorTestCase { 8 public void testRunServer() { 9 SocketServer server; 10 try { 11 // 启动socket服务器,监听4724端口。 12 server = new SocketServer(4724); 13 server.listenForever(); 14 } catch (final SocketServerException e) { 15 Logger.error(e.getError()); 16 System.exit(1); 17 } 18 } 19 }
从源代码中能够看到:
- 这个类是继承 UiAutomatorTestCase 的,这样它就能被 UIAutomator 作为测试用例类来运行了。而 UiAutomatorTestCase 类是继承自 Junit TestCase,可以直接使用它的一些方法和 Junit 单元测试框架中的 Assert 断言机制。
- Bootstrap 创建一个 SocketServer 并监听 4724 端口,通过该端口可以与 Appium 服务端进行通信。
- 通过循环监听获取 Appium 服务端发送过来的指令,就可以进行相应的处理了。
4)Appium 与 Robotium 的区别
Appium
- Appium 是基于 UIAutomator 框架实现的。
- Appium 测试进程与目标应用进程是分开的,所以 Appium 不能直接访问目标应用的各种 element 属性进行 Copy&Paste,而只能模拟触发相应的事件对目标应用进行操作。
Robotium
- Robotium 是基于 Instrumentation 框架的。
- Robotium 测试进程与目标应用是在同一个进程中作为两个不同的线程运行的。也就是说 Robotium 测试线程是有办法直接访问目标应用的各种 element 属性的,可以访问浮层、Intent 之类的,所以它根本不需要触发任何事件,直接就可以在内部修改相应的数据。
以文本输入为例
- Robotium 是直接 Copy&Paste,所以效率当然会更高;特别是在长字符串输入时,如输入一篇文章,如果在 Appium 上调用键盘,当安卓设备性能不高的情况下,会明显感觉到卡顿。
- Robotium 因为不需要调出键盘,所以很容易就能输入各种不同语言;而 Appium 就不一样了,如果当前输入法为英文而你需要输入中文,那么你要去设置应用把语言设置成中文或选择中文输入法等,然后再切换到目标应用进行输入操作。
总结
Appium 更能模拟用户的行为操作;而 Robotium 偏向测试金字塔更底层点的 Unit Test(所以 Robotium 除了能支持测试目标应用的 Activity 外,还能测试 Content Provider 等)。
Appium 是基于 WebDriver 协议添加对移动设备自动化API 扩展而成的,所以具有和 WebDriver 一样的特性,很多语法也是保持一致的,从而减少了学习成本。
2. Appium 自动化测试环境搭建
1)安装 Node.js
访问 https://nodejs.org/en/download/ 下载 node.js,根据操作系统下载对应的安装包。
安装完成后,会自动将路径加入到环境变量中,在命令行窗口中运行 node -v,如果出现版本号,表示安装正常。
2)安装 JDK
下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html。
安装并配置好环境变量后,新打开一个命令行窗口,在其中输入 java -version,若出现 jdk 的版本号,表示配置正确。
3)安装 Android SDK
Android SDK 是 Google 提供的 Android 开发工具包,可以通过引入工具包来调用 Android 的 API。
3.1)Android SDK 下载
下载地址:https://developer.android.com/,考虑到有可能会打不开这个链接,提供一个中文社区的SDK下载链接:http://tools.android-studio.org/index.php/sdk。
3.2)安装 API 版本和对应的工具包
双击打开 SDK Manage.exe,选择需要安装的 API 版本和对应的工具包进行安装,这些在运行模拟器和真机测试的时候会使用到。
安装包很多,哪些是必须的呢?根据官方文档的描述:
- SDK Tools 必须
- SDK Platform-tools 必须
- SDK Platform 必须至少安装一个版本
- System Image 建议安装
- Android Support 建议安装
- SDK Samples 建议安装
这些工具包都安装完成后,sdk 的目录如下图所示:
问题:Android SDK Manager 国内无法更新的解决方案
- 启动 Android SDK Manager ,打开主界面,依次选择「Tools」、「Options…」,弹出『Android SDK Manager - Settings』窗口。
- 在『Android SDK Manager - Settings』窗口中,在「HTTP Proxy Server」和「HTTP Proxy Port」输入框内填入 mirrors.neusoft.edu.cn 和 80,并且选中「Force https://… sources to be fetched using http://…」复选框。设置完成后单击「Close」按钮关闭『Android SDK Manager - Settings』,窗口返回到主界面。
- 依次选择「Packages」、「Reload」。
3.3)配置 SDK 的环境变量
在 Path 中配置:
- %ANDROID_HOME%\platform-tools
- %ANDROID_HOME%\tools
配置好环境变量后,在命令行窗口中运行 adb -version,出现以下信息则表示配置正确:
4)安装客户端测试脚本所用语言
如 Python 下载地址:https://www.python.org/downloads/,安装好后将 Python 安装目录配置到环境变量 Path 中,然后在 cmd 中运行 Python 命令:
5)安装 Appium Server
下载地址:https://github.com/appium/appium-desktop/releases
- 可选择 Appium Server 版如 Appium-windows-1.12.1.exe:安装完成后会在桌面生成快捷方式,每次启动快。
- 或选择 Appium Desktop 版如 appium-desktop-Setup-1.5.0-ia32.exe:Appium Desktop 封装了 Appium server 和 Node.js,且不会生成安装目录和快捷方式,每次启动等待时间长,但功能更加稳定(如桌面版 start session 获取元素属性)。
点击start server 后出现如下图,则 Appium 安装成功。
6)下载 Appium Client
这里选择 Python,下载链接:https://pypi.python.org/pypi/Appium-Python-Client/。
- 下载后解压到 Python 的安装目录,进入目录下,运行 python setup.py install 命令。
- 或者在命令行中运行 pip install Appium-Python-Client。
安装完成后,进入 Python 命令行环境,输入 from appium import webdriver,出现如下图则说明 Appium-Python-Client 安装成功。
7)运行简单实例进行测试
到此为止,所有需要安装的软件和工具包以及环境变量都安装配置好了,下面就可以利用这个环境来实现 Appium+Python 的自动化测试脚本的编写了。
1 from appium import webdriver 2 import time 3 4 5 # 配置Appium会话(Session),告诉Appium服务器需要自动化的平台和APP 6 desired_caps = {} 7 desired_caps['platformName'] = 'Android' # 手机操作系统 8 desired_caps['platformVersion'] = '7.1.1' # 手机操作系统版本号 9 desired_caps['deviceName'] = 'xxxxxxxxx' # 设备名称(通过adb获取) 10 desired_caps['appPackage'] = 'com.android.bbkcalculator' # APP包名 11 desired_caps['appActivity'] = '.Calculator' # APP最先启动的Activity(窗体) 12 13 # 打开APP,返回webdriver对象 14 driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) # 连接appium server(需先启动appium server) 15 16 # 在APP中点击元素 17 driver.find_element_by_id("com.android.bbkcalculator:id/digit7").click() 18 19 time.sleep(1) 20 # 退出APP 21 driver.quit() 22
执行 Appium 客户端脚本,即可在服务端控制台看到对应日志,示例如下: