Appium 介绍

APP 自动化测试介绍

目前 APP 自动化测试的方案:

自动化测试工具的选择考量:

  • 单平台测试 or 多平台测试?
  • 是否有多设备同时测试的场景?
  • 不局限于测试环境,任何版本任何环境都可以测试?
  • 最擅长哪种开发语言?
  • 当前市面是否有满足项目需求的测试工具?是否需要二次开发?

什么是 Appium ?

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

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

官方中文文档

Testerhome 中文社区

Appium 官网

Appium 优势

  1. 开源免费
  2. 跨平台:可以使用同一套 API 针对多个平台(iOS、Android、Windows、Mac)编写测试脚本。
  3. 支持多种类型的应用:可以测试原生的、混合的、移动端 Web 项目。
  4. 跨语言:可以用任何编程语言编写的 Appium 客户端向 Appium 服务端发送 HTTP 请求。
  5. 底层多引擎可切换
  6. 生态丰富,社区强大

Appium 跨平台与跨语言:

Appium 支持 Selenium WebDriver 支持的所有语言,更可以使用 Selenium WebDriver 的 API。Appium 支持任何一种测试框架。如果只使用 Apple 的 UIAutomation,我们只能用 javascript 来编写测试用例,而且只能用 Instruction 来运行测试用例。同样,如果只使用 Google 的 UIAutomation,我们就只能用 Java 来编写测试用例。Appium 实现了真正的跨平台自动化测试。

Appium 选择了 Client/Server 的设计模式,只要 Client 能够发送 HTTP 请求给 Server,那么 Client 用什么语言来实现都是可以的,这就是 Appium 及 WebDriver 能做到支持多语言的原因。

Appium 引擎列表:

  • IOS:

    • The XCUITest Driver(推荐)
    • (DEPRECATED) The UIAutomation Driver
  • Android:

    • (BETA) The Espresso Driver
    • The UiAutomator2 Driver(推荐)
    • (DEPRECATED) The UiAutomator Driver
    • (DEPRECATED) The Selendroid Driver
  • Windows:

    • The Windows Driver (for Windows Desktop apps)
  • Mac:

    • The Mac Driver (for Mac Desktop apps)

Appium 架构

Appium 使用的是 C/S 架构

工作流程:

  1. 启动 Appium 服务端(默认开启 4723 端口),接收来自 Appium 客户端的连接,监听指令。
  2. Appium 客户端通过执行脚本,将指令转换成 JSON Wire 协议规定的 JSON 格式数据,通过 HTTP 请求 post 给 Appium 服务端,在第一次连接时便会建立一个 session 会话。
  3. Appium 服务端接收到指令后(实现对 JSON Wire 协议的处理),基于 Socket 将指令发送给代理程序(Bootstrap.jar/ Bootstrap.js),安装在手机上的 Bootstrap 监听 4724 端口并接收 Appium 的命令。
  4. Bootstrap 代理程序接收到指令后,通过调用移动设备(Android/iOS)自带的测试框架(UIAutomator/UIAutomation)执行这些指令,进行 UI 操作。
  5. 执行完毕后,将执行结果以 HTTP 响应的方式返回给 Appium 服务端,再由 Appium 服务端返回给 Appium 客户端。

Appium 生态

  • adb:Android 的控制工具,用于获取 Android 的各种数据和控制。
  • Appium Client:即编写的自动化脚本(支持多种语言,如 Python、Java 等),使用 JSONWire 协议与 Appium 服务端进行通信,即给服务端发送请求会话来执行自动化任务。
  • Appium Server:Appium 的服务端,即一个 Web 接口服务,使用 Node.js 编写的 HTTP 服务器,用于处理 Appium 客户端传送过来的指令。
  • Appium Desktop:一款适用于 Mac、Windows 和 Linux 的开源应用程序(封装了 Appium Server 和 inspector 的综合工具),它以美观而灵活的用户界面提供 Appium 自动化服务器的强大功能。
  • AppCrawler:自动遍历工具。

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 自动化测试调用执行。

API 说明
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 类的实现

package io.appium.android.bootstrap;
import io.appium.android.bootstrap.exceptions.SocketServerException;
import com.android.uiautomator.testrunner.UiAutomatorTestCase;
/**
* The Bootstrap class runs the socket server. uiautomator开发的脚本,可以直接在pc端启动
*/
public class Bootstrap extends UiAutomatorTestCase {
public void testRunServer() {
SocketServer server;
try {
// 启动socket服务器,监听4724端口。
server = new SocketServer(4724);
server.listenForever();
} catch (final SocketServerException e) {
Logger.error(e.getError());
System.exit(1);
}
}
}

从源代码中能够看到:

  1. 这个类是继承 UiAutomatorTestCase 的,这样它就能被 UIAutomator 作为测试用例类来运行了。而 UiAutomatorTestCase 类是继承自 Junit TestCase,可以直接使用它的一些方法和 Junit 单元测试框架中的 Assert 断言机制。
  2. Bootstrap 创建一个 SocketServer 并监听 4724 端口,通过该端口可以与 Appium 服务端进行通信。
  3. 通过循环监听获取 Appium 服务端发送过来的指令,就可以进行相应的处理了。

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 一样的特性,很多语法也是保持一致的,从而减少了学习成本

Appium 自动化测试环境搭建

安装 Node.js

下载 node.js,根据操作系统下载对应的安装包。

安装完成后,会自动将路径加入到环境变量中,在命令行窗口中运行 node -v,如果出现版本号,表示安装正常。

安装 JDK

下载地址

安装并配置好环境变量后,新打开一个命令行窗口,在其中输入 java -version,若出现 jdk 的版本号,表示配置正确。

安装 Android SDK

Android SDK 是 Google 提供的 Android 开发工具包,可以通过引入工具包来调用 Android 的 API。

Android SDK 下载

下载地址

考虑到有可能会打不开这个链接,提供一个中文社区的 SDK 下载链接

安装 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」。

配置 SDK 的环境变量

在 Path 中配置:

  • %ANDROID_HOME%\platform-tools
  • %ANDROID_HOME%\tools

配置好环境变量后,在命令行窗口中运行 adb -version,出现以下信息则表示配置正确:

安装 Python(客户端测试脚本所用语言)

Python 下载地址

安装好后将 Python 安装目录配置到环境变量 Path 中,然后在 cmd 中运行 Python 命令:

安装 Appium Server

下载地址

  • 可选择 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 安装成功。

下载 Appium Client

这里选择 Python,下载链接

  • 下载后解压到 Python 的安装目录,进入目录下,运行 python setup.py install 命令。
  • 或者在命令行中运行 pip install Appium-Python-Client。

安装完成后,进入 Python 命令行环境,输入 from appium import webdriver,出现如下图则说明 Appium-Python-Client 安装成功。

Appium 介绍与环境搭建的更多相关文章

  1. App自动化测试-1.App自动化介绍和环境搭建

    App自动化测试-1.App自动化介绍和环境搭建 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-b ...

  2. Python介绍及环境搭建

    摘自http://www.cnblogs.com/sanzangTst/p/7278337.html Python零基础学习系列之二--Python介绍及环境搭建   1-1.Python简介: Py ...

  3. Django 01 django基本介绍及环境搭建

    Django 01 django基本介绍及环境搭建 #http服务器 #用来接收用户请求,并将请求转发给web应用框架进行处理 #Web应用框架 #处理完请求后在发送给http服务器,http服务器在 ...

  4. [springboot 开发单体web shop] 1. 前言介绍和环境搭建

    前言介绍和环境搭建 简述 springboot 本身是为了做服务化用的,我们为什么要反其道使用它来开发一份单体web应用呢? 在我们现实的开发工作中,还有大量的业务系统使用的是单体应用,特别是对于中小 ...

  5. Maven介绍及环境搭建

    Maven介绍及环境搭建 Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建.报告和文档的软件项目管理工具. 下载Maven boot:类加载器框架,Maven使用它加在自 ...

  6. Maven快速入门(一)Maven介绍及环境搭建

    做开发的程序员都知道,在系统开发需要各自各样的框架.工具.其中有一种工具不管你是初级程序员还是高级程序员都必须熟练掌握的,那就是项目管理工具(maven.ant.gradle).接下来就总结Maven ...

  7. Appium 介绍及环境安装

    Appium是一个可用于测试iOS. Android操作系统和Windows桌面平台原生应用,移动网页应用和混合应用的自动化测试框架. 原生应用(Native App):用 android.iOS或者 ...

  8. Appium+python自动化-环境搭建

    一.前言 本文是在windows10  X64系统下搭建appium,流程如下: 1.安装jdk1.8+python3.6 (64位) 2.安装node.js 3.安装Appium-desktop 4 ...

  9. Appium入门指南 - 环境搭建和Case编写

    本文档将详细介绍如何搭建 Appium 的运行环境,以及如何编写一个简单的 UI 自动化测试用例.其中,也会穿插讲解一些 Appium 的基本知识.关于 Appium 的更多信息,大家可以查看官方文档 ...

随机推荐

  1. 5cms使用sql语句给网站添加内容

    <!--list:{$Sql=UPDATE [{pre}Content] SET Indexpic="/uploadfile/201405/25/lsgjyst.jpg",t ...

  2. ecshop首页调用团购说明

    要在首页调用购买. 发现在首页还不能直接调用团购说明.查看了一下代码发现要修改下才能调 打开根目录的 index.php 文件找到 $sql = 'SELECT gb.act_id AS group_ ...

  3. Docker系列(27)- 容器互联--link

    思考 思考一个场景,我们编写了一个微服务,database url=IP:,项目不重启,数据库ip换掉了,我们希望可以处理这个问题,可以使用名字来进行访问容器吗 实践 [root@localhost ...

  4. Laravel [1045] Access denied for user 'homestead'@'localhost' .env没有配置

    laravel 连接数据库出现错误 PDOException in Connector.php line 55:SQLSTATE[HY000] [1045] Access denied for use ...

  5. [转载]SELinux安全系统基础

    链接:http://www.cnblogs.com/xiaoluo501395377/archive/2013/05/26/3100444.html 本篇随笔将记录一下学习SELinux的一些心得与体 ...

  6. 定要过python二级选择题二套

    1. 2. 3. 4. 5. 6. 7. 8. 非主属性???? 9. 10.. 11.` 调用只是调用,但是没有返回值,,应为里面没有输出 12. 13. 14. 15. 16. 18. 19.

  7. c++ 的学习 第二集函数的重载之3 -利用IDA分析bebug里面

    1. 对项目右击,在文件资源管理器中打开文件夹 2.看debug里面的.exe     这个文件 函数的真实的名字 打开.exe文件就是还是显示,,, 3.debug模式有太多的断点信息还有许多不精简 ...

  8. 鸿蒙内核源码分析(特殊进程篇) | 龙生龙,凤生凤,老鼠生儿会打洞 | 百篇博客分析OpenHarmony源码 | v46.02

    百篇博客系列篇.本篇为: v46.xx 鸿蒙内核源码分析(特殊进程篇) | 龙生龙凤生凤老鼠生儿会打洞 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁 ...

  9. 理解ASP.NET Core - 配置(Configuration)

    注:本文隶属于<理解ASP.NET Core>系列文章,请查看置顶博客或点击此处查看全文目录 配置提供程序 在.NET中,配置是通过多种配置提供程序来提供的,包括以下几种: 文件配置提供程 ...

  10. python中冒泡排序代码实现

    1.冒泡排序代码如下图: #冒泡算法l=[12,4,56,10,6,2]for i in range(0,6): for j in range(i+1,6): if l[i]>l[j]: a=l ...