本文章转载于搜狗测试
基于Appium的Android自动化测试(一)
项目技术结构:Java + Appium + TestNG + Maven
Appium
Appium是一个开源、跨平台的自动化测试工具,用于测试原生和轻量移动应用,支持iOS,Android和FirefoxOS平台。Appium驱动Android的UiAutomator框架,使用Selenium的WebDriver JSON协议。
相比其他的移动自动化测试工具,Appium测试由于调用了Selenium的client库使其可以使用任意的语言,包括Python、Ruby、Node.js、Objective-C等。
Appium——C/S构架
Appium的核心是一个web服务器,提供了一套REST接口。它收到客户端的连接,监听到命令,接着在移动设备上执行这些命令,然后将执行结果放在HTTP响应中返还给客户端。特点:多语言编写测试代码;可以将服务器放在不同的机器上;
在这里client其实就是发起command的设备,一般来说就是我们代码执行的机器,执行appium测试代码的机器。只要client能够发送http请求给server,只要它实现了webdriver标准协议就可以,故appium及webdriver可以支持多语言。
server的功能:监听一个端口,然后接收由client发送来的command,解释这些command,把这些command转成移动设备可以理解的形式发送给移动设备,然后移动设备执行完这些command后把执行结果返回给appium server,appium server再把执行结果返回给client。
Session
session是一个会话,自动化总在一个session的上下文中运行。在webdriver/appium,所有工作永远都是在session start后才可以进行的。客户端初始化一个seesion(会话)来与服务端交互。不同语言有不同的实现方式,但最终都是发送为一个“desired capabilities”的JSON对象参数的POST请求”/session”给服务器,然后传入Desired Capabilities,服务器会开始一个自动化的session,然后返回一个全局唯一的sessionID。以后几乎所有的请求都必须带上这个session id,因为这个seesion id代表了你所打开的浏览器或者是移动设备的模拟器。
Desired Capabilities
是一些key-value(键值对)的集合(比如map或者hash)。可理解成是java里的map,python里的字典,ruby里的hash以及js里的json对象。实际上Desired Capabilities在传输时就是json对象。
Desired Capabilities最重要的作用是告诉server本次测试的上下文。客户端将这些键值对发给服务端,告诉服务端我们想要启动怎样的自动化session。根据不同的capabilities 参数,服务端会有不同的行为。
举个栗子
capabilities.setCapability("platformName capability","Android");
capabilities.setCapability("platformVersion","4.3");
capabilities.setCapability("appPackage","com.sogou.map.android.maps");
capabilities.setCapability("appActivity",".MainActivity");
platformName capability 设置为Android,要启动一个Android的session;本次测试是启动andorid移动设备;app的package是com.sogou.map.android.maps;启动android时,app的activity是MainActivity
Appium真正的工作引擎是第三方自动化框架,Android使用的第三方框架:为UiAutomator(Android 4.2+)。借助第三方框架,建立了服务器和设备之间的连接。
API Level对应关系如下:
平台版本
API级别
Android 7.1
25
Android 4.4W
不同版本,通过UiAutomator可以获取设备属性不同(例如:Android4.3以上版本支持source-Id,之前的版本不支持此字段,即API Level大于或者等于18才能够获取)。