Appium是由node.js开发的开源自动化测试工具,可用来测试移动端的Native、Hybrid和移动Web应用,被测平台包括Android和iOS(最近宣称已支持Windows)。
Native apps – 使用Android、iOS和Windows SDK开发的应用。
Mobile web apps – 是用移动设备上的浏览器访问的Web应用。
Hybrid apps – 也就是Web和native混合的应用,通常是既有native view,也有web view。外观看起来是一个native应用,但实则用 web view来访问展示Web内容。
Appium的简单架构如下:
- Testcase – 用来测试特定功能和场景的测试代码,可以使用Java, C#, Python, Ruby, JavaScript等编程语言编写。
- Appium server – Node.js开发的HTTP服务器,运行在本地或云端。启动后可用来接受Appium client通过JSON Wire Protocol发送的请求,并调用相应驱动连接相应的自动化测试框架、实现在移动设备上的操作。
- Appium client – 与测试代码同开发语言的Appium库,用来和Appium Sever建立连接,可通过JSON Wire Protocol向Appium Sever发送http request,并接受JSON格式的response数据。
- Bootstrap.jar – Appium初始化时推送到Android设备上的一个UIAutomator测试脚本(中间件)。主要用来监听和执行Appium Server发送的Appium Command。
- Bootstrap.js – Appium初始化时推送到iOS设备上的一个UIAutomation测试脚本。主要用来监听和执行Appium Server发送的Appium Command。
需要指出的是,由于Appium技术栈的复杂性,以及版本的不断更新迭代,我无法保证该架构的绝对正确。
一些零散的补充:
1. Appium server如何判定目标设备?
测试代码需要通过Desired capabilities来初始化Appium client,然后才和server建立session,建立session后会返回一个sessionID。每次client向server发送HTTP API请求时,会在API URL里带上这个sessionID,所以,server可以通过sessionID获取到目标设备。
2. 这里使用的JSON Wire Protocol和Web driver有关系吗?
Appium在client和server端的交互上同样依靠Webdriver API。也就是说Appium集成了Selenium。
3. UIAutomator和UIAutomator2的区别?
UIAutomator是Android自动化测试框架,是谷歌在Android4.1版本发布时推出的一款用Java编写的UI测试框架。
UIAutomator2(UiAutomator V2)是对UIAutomator的更新,比如新增了AccessibilityService服务,可以实现Toast的获取。
UIAutomator2的原理也和UIAutomator不同,UIAutomator2会在移动设备上安装两个应用(摆脱了bootstrap.jar)来实现监听和执行Appium Command的目的,如图:
总结一下Appium的工作流程:
1. 在本地或云端的特定端口启动Appium Server。
2. 测试代码定义Desired capabilities,Desired capabilities包括但不仅限于以下信息:
· 是启用Android还是iOS,
· 是启动相应浏览器还是特定Activity的App,
· App安装文件的地址,
· 测试设备的唯一标识符,
· 测试设备的平台版本号,
· 自动化测试框架的名称。
更多信息:
https://appium.io/docs/en/writing-running-appium/caps/
3. 测试代码通过Desired capabilities创建一个Appium Client实例,并和Appium Server建立Session(POST请求)。Appium Server通过对Desired capabilities的分析,确定调用相应的自动化测试框架(
UIAutomator/UIAutomator2/XCUITEST/UIAutomation等)和测试目标设备,根据当前所采用的自动化测试框架,向目标设备推送中间件文件(Bootstrap.jar/Bootstrap.js)或者其它安装文件。
4. 测试设备通过推送过来的中间件或者App启动对Appium Command的监听。
5. Appium Server向Appium Client返回SessionID,表明Session已经建立成功。
6. 测试代码通过Appium Client向Appium Server发送测试步骤所需要的Appium Command。
7. Appium Server接受request,通过当前的自动化测试框架,向测试设备发送Appium Command。
8. 测试设备上的中间件或者Appium安装的辅助App接受Appium Command,并在测试设备执行Appium Command规定的操作。并返回操作结果
9. Appium Sever接受 Appium Command的执行结果,并返回给Appium Client。
10.测试代码根据返回的结果,继续执行其它测试步骤,直到测试结束。