前言
Appium 官方参考地址:http://appium.io/docs/en/2.0/
任何一门测试工具要想深入地掌握,必须对测试工具本身的架构、原理、使用的协议及相关知识。要有深入的了解和认识,才能做到灵活使用。更重要的是,测试开发过程中一旦出了问题,在寻找解决问题答案的时候就会有思路,大概能够知道问题出在什么地方,再有针对性地解决。其实任何工具单纯使用都不是很难,只是低手和高手之间就只隔着九个字“知其然,且知其所以然”。所以此篇文章,我们将要学习Appium,了解其架构,实现原理,从而更好的服务于我们的项目中去。
提示:以下是本篇文章正文内容,下面案例可供参考
一、Appium介绍
1. Appium
Appium是一款可以用来测试原生应用,WebApp和混合型应用,且是跨平台的开源的移动端测试框架。它是由nodejs的express框架写的HttpServer。Appium不是它自己创建一套新的测试框架,而是将现有的优秀测试框架进行集成,以Selenium Webdriver协议(Json WireProtocol/Restful Web Service)统一起来,使框架满足多方面需求。Appium在不同平台中使用标准的自动化API,所以在跨平台测试时,不需要重新编译或者修改自己的移动应用。
跨平台是指可以针对不同的平台用一套API来开发测试用例脚本,现在Appium支持IOS、Android及FirefoxOS平台。
APP platform | Android,iOS,windows,linux,mac |
Dev script | Java Python json C# Ruby… |
Browser | Chrome, Firefox, Safari |
Desktop | macOS, Windows |
TV | Roku, tvOS, Android TV, Samsung |
appium类库封装了标准Selenium客户端类库,为用户提供所有常见的JSON格式selenium命令以及额外的移动设备控制相关的命令,如多点触控手势和屏幕朝向。
2. Appium理念
Appium是基于以下四个理念设计来满足移动应用测试自动化的要求的:
- 不应该因为需要自动化测试移动应用而去重新编译或者修改你的移动应用。
- 不应该固定一门编程语言和在一个特定的框架上去实现和运行测试。
- 当用到测试自动化API的时候,移动测试框架不应该做“重新发明轮子”的事情。
- 移动测试自动化框架应该是开源的,无论是在精神上,实际上还是名义上。
3. Appium架构设计
Appium测试框架的架构设计在实际行动上也支持以上四个理念的:
3.1 使用系统自带的自动化框架
为了实现第一个理念, appium使用各个系统自带的自动化框架可以让appium 独立运行,而不需要把 Appium 特定的或者第三方的代码编译进应用,更不用为了自动化而重新编译或修改应用。
以下是各个系统使用的自动化框架:
系统 | 自动化框架 |
---|---|
iOS 9.3 及以上 | 苹果的 XCUITest |
iOS 9.3 及以下 | 苹果的 UIAutomation |
Android 4.3+ | 谷歌的 UiAutomator / UiAutomator2 |
Android 2.3+ | 谷歌的 Instrumentation (通过绑定独立的项目—— Selendroid 提供对 Instrumentation 的支持) |
Windows | 微软的 WinAppDriver |
3.2 支持多种语言 --Selenium WebDriver API
为了实现第二个理念,Appium的做法是把不同的移动平台供应商的自动化测试框架进行更高层次的封装,做成一套统一的API,也就是大家常说的WebDriver API。WebDriver(也叫做“Selenium WebDriver”)指定使用一套客户端-服务器端协议(也就是JSON Wire Protocol), 基于这一套协议,客户端无论是用任何语言编写的测试脚本都能够通过HTTP请求发送到服务器。
Appium客户端的库仅仅是一个HTTP客户端而已,测试开发工程师可以用任何自己喜欢的方式把它嵌入到自己的框架代码中去。换一个说法就是,Appium WebDriver客户端实际上并不是真正的”测试框架“,而是"自动化测试库”,测试开发工程师可以借助它们按照自己喜欢的方式来搭建管理测试环境。
Appium WebDriver 客户端在技术上而言不是「测试框架」,而是「自动化程序库」
Appium使用同样的方法实现了第三个理念:鉴于WebDriver事实上已经是网络浏览器自动化测试的标准,并且已经草案立为W3C的标准,测试开发工程师只需要扩展相应的WebDriver API来方便移动平台测试自动化的使用就行了。
4. Appium架构
4.1 C/S 架构
Appium的核心是一个遵守REST设计风格的web 服务器,它接受客户端的连接,接收客户端的命令,在手机设备上执行命令,然后通过HTTP的响应收集命令执行的结果。
这样的设计思想带来了一些好处:
- 可以带来多语言的支持;
- 可以把server放在任意机器上,哪怕是云服务器都可以,appium和webdriver天生适合云测试。
4.2 Appium client
Appium 客户端,不同客户端支持不同语言来发起http命令。比如postman,Appium server Gui等等
- 让Appium客户端与Appium Server服务器交互
- 解读WebDriver协议,将WebDriver协议转换为我们可以轻松使用的客户端库。Appium提供了相应客户端的库。比如C# 有NuGet包,java 有java-client包。
下表是支持Appium的语言客户端列表:
语言/框架 | Github版本库以及安装指南 |
---|---|
Ruby | https://github.com/appium/ruby_lib |
Python | https://github.com/appium/python-client |
Java | https://github.com/appium/java-client |
JavaScript(Node.js) | https://github.com/admc/wd |
Objective C | https://github.com/appium/selenium-objective-c |
PHP | https://github.com/appium/php-client |
C#((.NET)) | https://github.com/appium/appium-dotnet-driver |
RobotFramework | https://github.com/jollychang/robotframework-appiumlibraryc |
4.3 Appium service
Appium 是一个用 Node.js 写的服务器。可以从源码构建安装或者从 NPM 直接安装:
$ npm install -g appium
$ appium
- 它监听符合API规范,从WebDriver 传入的HTTP request。
- WebDriver是一个W3C规范,Appium团队为该协议添加了一些扩展,使其适用于web浏览器,同时也适用在任何设备上测试的任何应用程序。
- Appium Server服务器需要在Node.js web服务器中运行。
Node.js web服务器可以在运行测试之前在本地机器上启动,也可以托管Appium服务器-让它作为运行测试的一部分。
4.4 Session
自动化过程始终在一个会话session的上下文中执行。
通过客户端程序库以各自的方式发起与服务器的会话,但最终都会发给服务器一个 POST /session 请求,请求中包含一个被称作「预期能力(Desired Capabilities)」的 JSON 对象。这时服务器就会开启这个自动化会话,并返回一个用于发送后续命令的会话 ID。
4.6 预期能力(Desired Capabilities)
Desired Capabilities 对象是一个key-value的集合,里面包含了各种各样的信息,它(Desired Capabilities 对象类似java里的map,python里的字典以及javascript里的json对象。实际上Appium Server和移动设备之间的会话属性就是通过json对象传输)发送到服务器端后,服务器解析这些信息就知道客户端需要那种Session,然后就会启动相应的session。这里面的信息会影响服务器启动Session的类型。比如platformName的值为ios,就是请求服务器启动一个ios的Session,而不是Android seesion。如果safariAllowPopups的值为true,这是告诉safari类的自动化Session,可以使用js打开新窗口。
这是android的例子:
capabilities = {
‘appium-version’: ‘1.0’,
‘platformName’: ‘Android’,
‘platformVersion’: ‘5.1’,
‘deviceName’: ‘test’,
‘app’: ‘/Users/xuyao/Downloads/Yydys0627.apk’,
}
二、 Appium工作原理
- Client端将自动化测试脚本发送给Appium Service;
:: appium针对每种语言都开发了对应的Client,我们只需要选择想用的语言对应的Client。 - Appium Server端与移动设备连接,将脚本解析后通过UiAutomator命令控制和监听移动设备;
:: appium针对主流语言分别开发的相应的appium库(Python Java PHP Ruby等),均已经集成在Server端,所以Service端可解析多种语言的测试脚本;
2.1 Appium Client (java Appium_client jar包)
一般来说就是指运行代码的机器,即我们是用Java语言编写的代码,也可以用其他Selenium支持Python,ruby,C#等语言来编写,Appium提供的Appium-client API是Appium通过扩展Selenium的Webdriver协议而来的,我们编写代码的时只要实现Webdriver标准协议即可。
2.2 Appium Server (Node.js 写的服务器)
Appium Server功能是监听接口,接收client端发送的command,然后将command转为移动端能够识别的command,然后发送给移动设备进行操作,再等待移动设备返回来的操作结果,将操作结果发送给client端。 Appium server是可以放在client端,也可以放在云端。 Appium server 默认的端口号是4723,用于Appium server监听client端的发送来的请求。
2.3 Android设备
Android端,Appium基于Webdriver协议,利用Bootstrap.jar,最后通过调用UIautomatior命令,实现APP的自动化测试(Android4.2以前的版本是用Instrumentation框架,通过绑定另外一个独立的selendroid项目来实现),Android4.2以后的版本是用UIautomator)。UIAutomator测试框架是Android SDK自带的APP UI自动化测试Java库,另外UIAutomator对H5支持有限,Appium引入了Chromedriver以及Safaridriver来实现H5的自动化。
故**在Android设备的工作过程**:
- Appium server将监听到的4723端口的指令,转发给中间件Bootstrap.jar,Bootstrap.jar是用Java编写的,安装在Android手机上;
- Bootstrap监听4724端口并接收Appium server的指令;
- Bootstrap再通过调用UIautomator的命令来实现具体的command操作。
- 最后Bootstrap将执行的结果返回给Appium server。
关于Appium原理,更多可参考 https://www.jianshu.com/p/30b3b2d6b901
三、Appium Java环境配置
- java 1.8以上版本
- Android sdk
- Node js(>=10版本),npm(>=6版本)
- 安装Appium:Appium 有命令行版本和桌面版本。可以两个都装上,
4.1. 桌面版本:在appium官网下载并安装Appium。
4.2. 命令行版本,管理员模式运行cmd:npm install -g appium
可能需要设置网络代理。 - 开发工具 Eclipse
- 夜神安卓模拟器
- 代码示例测试驾考宝典下载地址:https://www.wandoujia.com/apps/280597
点击普通下载,下载apk - 电脑启用“开发者模式”
安装结束后,在cmd界面输入appium-doctor
检测appium环境是否正常。
附Appium service cmd 安装详解:
#先安装node.js
https://nodejs.org/en/download/
# 安装cnpm
npm install -g cnpm --registry=https://registry.npm.taobao.org
# 安装appium最新版本
cnpm install -g appium --registry=https://registry.npm.taobao.org
# 选择版本号安装
cnpm install appium@版本号
详细资料可参考:Java的Appium自动化测试教程 和 appium+java环境搭建实战