Appium 简介与自动化测试环境搭建

1. Appium 简介

2. Appium 自动化测试环境搭建

 

 

1. Appium 简介

Appium 是一个开源的自动化测试框架,适用于原生的、混合的、移动端 Web 的应用程序,其使用 WebDriver 协议来驱动 iOS、Android 和 Windows 应用程序。

  • 原生应用:指用 iOS、Android 或者 Windows SDKs 编写的应用。
  • 移动 Web 应用:指用移动端浏览器访问的应用(Appium 支持 Safari、Chrome 和 Android 上的内置浏览器)。
  • 混合应用:指带有一个 WebView 的包装器,用来和 Web 内容交互的原生空间。

官方中文文档

Testerhome 中文社区

Appium 官网

 

1)Appium 优势

  1. 开源免费。
  2. 跨平台:允许使用相同的 API 针对多个平台(iOS、Android、Windows)编写测试脚本。
  3. 支持多种类型的应用:可以测试原生的、混合的、移动端 Web 项目。
  4. 支持多种编程语言:可以用任何编程语言编写的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 自动化服务器的强大功能。
  1. 启动 Appium 服务端(默认开启 4723 端口),接收来自 Appium 客户端的连接,监听指令。
  2. Appium 客户端通过执行脚本,将指令转换成 JSON Wire 协议规定的 JSON 格式数据,通过 HTTP 请求发送给 Appium 服务端。
  3. Appium 服务端接收到指令后(实现对 JSON Wire 协议的处理),基于 Socket 将指令发送给代理程序(Bootstrap.jar/ Bootstrap.js),安装在手机上的 Bootstrap 监听 4724 端口并接收 Appium 的命令。
  4. Bootstrap 代理程序接收到指令后,通过调用移动设备(Android/iOS)自带的测试框架(UIAutomator/UIAutomation)执行这些指令,进行 UI 操作。
  5. 执行完毕后,将执行结果以 HTTP 响应的方式返回给 Appium 服务端,再由 Appium 服务端返回给 Appium 客户端。

 

3)Appium 组件

  1. UIAutomator:由谷歌推出的一款 UI 测试框架,提供 API 对 Android 系统进行一系列的自动化测试操作,Android 4.2 之后系统自带的 UI 自动化测试工具。
  2. UIAutomation:由苹果公司发布的一个测试框架,主要用于自动化测试 iOS 和 OS X 应用的 UI 交互情况,iOS 系统自带的 UI 自动化测试工具。
  3. Bootstrap.jar:Appium 在 Android 上基于 UIAutomator 实现的测试代理程序,可以调用 UIAutomator 的方法实现一系列 UI 操作。
  4. 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 }

从源代码中能够看到:

  1. 这个类是继承 UiAutomatorTestCase 的,这样它就能被 UIAutomator 作为测试用例类来运行了。而 UiAutomatorTestCase 类是继承自 Junit TestCase,可以直接使用它的一些方法和 Junit 单元测试框架中的 Assert 断言机制。
  2. Bootstrap 创建一个 SocketServer 并监听 4724 端口,通过该端口可以与 Appium 服务端进行通信。
  3. 通过循环监听获取 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 国内无法更新的解决方案

  1. 启动 Android SDK Manager ,打开主界面,依次选择「Tools」、「Options…」,弹出『Android SDK Manager - Settings』窗口。
  2. 在『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』,窗口返回到主界面。
  3. 依次选择「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 客户端脚本,即可在服务端控制台看到对应日志,示例如下: 

 

posted @ 2021-04-12 16:07  Juno3550  阅读(383)  评论(0编辑  收藏  举报