原文地址:Android自动化测试工具调研 - Stars-One的杂货小窝

Android测试按测试方式分类,可分为两种:一种是传统逻辑单元测试(Junit),另外一种则是UI交互页面测试。

这里详细讲解第二种测试。

UI交互页面测试如果是人工进行,会消耗人力,且不一定按质量进行测试,测试不全面,不到位,于是发展了通过写测试代码来进行测试。

Monkey

首先,介绍一下Monkey这个测试框架

命名为猴子,意思的是像猴子一样没有规则的顺便乱点操作

Android SDK自带的测试工具,在测试过程中会向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行压力测试,也有日志输出。

实际上该工具只能做程序做一些压力测试,由于测试事件和数据都是随机的,不能自定义,所以有很大的局限性。

使用的话则是通过adb shell命令来执行的,如下面例子:

//(此时指定软件会被打开并开始乱点乱按)
adb shell monkey -p com.tencent.news -v -v -v 100

MonkeyRunner

MonkeyRunner也是Android SDK内置的一个工具,但与Monkey没有太大的联系,Monkey是通过adb命令下发相关事件指令来进行测试,而MonkeyRunner采取客户端/服务端的方式来下发相关指令

其文件位于AndroidSDK目录/tools/bin/monkeyrunner.bat.bat

本质上,MonkeyRunner是个工具集API(JPythod),通过让Pythod代码可以实现模拟操作手机APP的操作,具体可参考此文monkeyrunner自动化工具详解 - 习久性成 - 博客园

编写测试脚本(Pythod)来自定义数据、事件。Monkeyrunner 足够强大了,但是录制的脚本是以坐标轴来作为定位方式,而安卓设备类型众多,各种分辨率,所以移植性不好

Espresso

此方案,目前主要用户让Android开发人员进行自测使用,测试脚本代码为Java/Kotlin

Android官方代码中,默认引用这个测试框架库,在我们新建项目的时候就可以看到,app代码目录下有以下三个文件夹

  • androidTest UI的单元测试代码
  • main 主代码
  • test 逻辑测试代码

其中,androidTest就是所说到的UI的单元测试代码,对应的测试框架为Espresso,基于Instrumentation进行改造而成,测试的主要流程就是找到对应控件Id,然后进行对应的断言判断

这种方法的缺点是需要懂Android开发的相关知识才能进行测试代码的编写

如果单纯编写确实有些难度,之后与Android SDK里的UiAutomator工具联用,UiAutomator工具文件是在AndroidSDK目录/tools/bin/uiautomatorviewer.bat

UiAutomator工具,主要功能就是会将当前的APP页面进行截图,然后分析View的层次结构,并展示View的相关属性信息,如控件ID,margin,text等

实际上,UiAutomator底层使用的无障碍服务(AccessibilityService)那套API,唯一有所区别的是,UiAutomator是shell环境才能使用,而AccessibilityService可以在APP使用(需要用户手动开启权限)

可以通过Android Studio中的run->Record Espresso Test,打开一个对话框,通过此对话框,可以进行相关流程的测试,之后完成后自动生成对应的测试代码

详情过程可参考这篇文章Android Espresso使用 - 爱码网

Instrumentation框架是Android测试环境的核心,很多测试框架都是基于其实现。Instrumentation其实是Android Framework中的一个类,它的作用简单来说就是能够监控Android系统和Application之间的交互。因此实现了测试应用程序对应用程序的控制。

Instrumentation`会在App启动阶段被初始化,然后作为一个实例变量保存到ActivityThread对象中。Application的创建,Activity生命周期方法的回调等其他操作,都会经过Instrumentation来完成,会先调用Instrumentation的相应方法。

Instrumentation框架通过将主程序和测试程序运行在同一个进程来实现这些功能。可以把Instrumentation理解为没有界面的activity,它具有启动能力和监控能力。

Appium

在说这个之前,先说下Selenium,Selenium是用来进行Web测试的框架,

selenium 本身是一套web自动化测试工具,但其经常被用于爬虫,解决一些复杂爬虫的问题。

selenium 用于爬虫时,相当于模拟人操作浏览器,之后由此框架发展出了其他的框架

  • Robotium

也是基于Instrumentation的测试框架,目前国内外用的比较多,资料比较多,社区也比较活跃。缺点是对测试人员来说要有一定的Java基础,了解Android基本组件,不能跨App。

  • Selendroid

    基于Instrumentation的测试框架,可以测试Native App、Hybird App、Web App,但是网上资料较少,社区活跃度也不大,可以看做是一个Web版的Robotium,使用入门课参考selendroid 入门 · TesterHome

示例脚本:

AndroidDriver driver = new AndroidDriver(new URL("http://localhost:8080/wd/hub"), getDefaultCapabilities());
driver.findElement(By.id("startUserRegistration")).click(); WebDriverWait wait = new WebDriverWait(driver, 5);
WebElement inputUsername = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("inputUsername")));
inputUsername.sendKeys(user.getUsername());
Assert.assertEquals(nameInput.getText(), "Mr. Burns");
nameInput.clear();
nameInput.sendKeys(user.getName());
takeScreenShot("User data entered.");
driver.findElement(By.id("btnRegisterUser")).click();

而Appium也是从Selenium延伸出来的,是目前最主流的移动测试自动化框架,不仅支持 Android 应用,而且适用于 iOS、混合和 Web 应用程序。

上面说到的3个框架,测试流程原理为:

电脑在指定端口开启一个Web服务,并在手机安装一个对应的客户端APP程序,两者通过Socket协议链接

之后编写脚本里,可以使用Web服务的地址,之后脚本代码传输给Web服务,由Web服务再下发手机,有客户端APP程序执行对应的指令操作(这个APP程序实际上就是没有界面的,可以理解为一个后台进程)

Appium的桌面APP也是提供了一种测试录制功能,可以将测试的流程记录,并转为对应的脚本代码,如点击了什么控件,输入了什么内容等步骤,可以参考Appium的使用方法

它底层完全使用了 Selenium 和 WebDriver 的 API,所以如果你之前有用过 selenium, 几乎不需要额外的学习成本就可以使用 appium。

Appium 通过 uiautomator(API 级别 16 或更高)和 Seledroid(API 级别低于 16)支持 Android,但是你不需要具体懂这两个框架的具体用法,appium 都已经帮你封装成了统一的使用规则。

Appium 的优势之一是几乎可以使用任何编程语言(例如 Java、Objective-C、JavaScript、PHP、Ruby、Python 或 C# 等)编写 Appium 脚本。不需要重新编译或改变应用程序来匹配Appium,Appium有一个非常大而活跃的社区。

Airtest

是网易出品的一款基于图像识别和poco控件识别的一款UI自动化测试套件,由Airtest框架、poco框架、airtestIDE 组成。是一个跨平台的UI自动化测试框架,适用于游戏和App。

Airtest的框架是网易团队自己开发的一个图像识别框架,这个框架的祖宗就是一种新颖的图形脚本语言Sikuli。

Sikuli这个框架的原理是这样的:

计算机用户不需要一行行的去写代码,而是用屏幕截屏的方式,用截出来的图形摆列组合成神器的程序,这是Airtest的一部分。

另外,Airtest也基于poco这个UI控件搜索框架,这个框架也是网易自家的跨平台U测试框架,原理类似于appium:

通过控件的名称,id之类的来定位目标控件,然后调用函数方法,例如click(),swip()之类的方法来对目标控件进行点击或者是操作。

虽然Airtest刚开始是为了游戏测试,现在在app测试中也有很大的应用范围。只是进行录制、执行脚本的AirtestIDE没有开源,不方便进行深度定制。

AirtestIDE工具,内置了Airtest和Poco的相关插件功能,能够使用它快速简单地编写 Airtest 和 Poco 代码。

AirtestIDE依赖ADB与安卓设备进行通信,编写的对应的脚本文件代码为Pythod

使用可参考Airtest-app自动化测试必备神器 - 知乎

Solopi

主要就是测试人员自行安装对应的测试工具apk和目标测试apk,进行测试,之后可以测试工具可以将手机上的操作进行录制保存为脚本,并可以分享到其他设备上执行,从而实现一套自动化测试。

Solopi开源地址

是蚂蚁金服开源的一款移动端APP测试工具,提供脚本录制、编辑、回放,结果展示以及一机多控(即通过设备间的socket通讯实现1台手机可以控制多台手机执行脚本)等功能,其测试用例的录制和执行等操作均在手机端的一个APP中完成

不需要借助电脑软件与测试设备交互,所以通信结构比Appium简单高效,对元素的识别也是使用类似于appium的控件的方式,并且引入了类似于airtest的图像识别的方式。

Solopi支持原生APP即混合式APP,虽然Appium和Airtest都有很大的应用范围,但是Solopi相比于appium和airtest有以下优势:

  • 改进的控件匹配算法,更高的匹配成功率;
  • 不需要依赖pc端的桌面应用,全部操作都在手机端的app中完成,实现了无线化,随时可测;
  • 不需要代码基础,使用人群覆盖范围广;
  • 提供性能测试的功能等。

这套方案中,底层依赖主要是 “无线 ADB、系统辅助功能、Chrome 调试以及图像识别技术”。同时,在底层依赖的基础上,封装了一套核心能力,由 “控件定位、事件驱动、性能采集以及依赖注入” 组成,并在服务层实现了录制、回放、数据处理等公共服务能力。在架构的最顶端,结合界面交互逻辑包装出了各个功能的入口

SoloPi 录制的用例会以 JSON 的形式存储起来,用例不仅可以在设备本地直接回放,还可以通过 SoloPi 的解析器将用例转换为 Appium等目前主流自动化测试框架的脚本,轻松打通云测平台

参考

Android自动化测试工具调研的更多相关文章

  1. 支付宝开源非侵入式 Android 自动化测试工具 Soloπ

    Soloπ(SoloPi)是支付宝开源的一个无线化.非侵入式的Android自动化测试工具,公测版拥有录制回放.性能测试.一机多控三项主要功能,能为测试开发人员节省宝贵时间. 本文是SoloPi团队关 ...

  2. Web自动化测试工具调研

    背景 Web自动化测试越来越被重视, 因为现在Web已经是工程化的状态. 如何通过工具测试, 保证Web开发的质量,提升开发效率,是Web工具的诞生的来由. Web测试分为以下几个方面: 1. 界面测 ...

  3. Android自动化测试工具——monkey简介及入门

    记得第二家单位的安卓开发在上线前都用monkey压几个小时,确实也能发现些问题,崩溃率低了些,没测过的确实可以压一压 搜了下资料,monkey确实很简单,发现问题自己搜下是什么问题,别一发现什么就跑去 ...

  4. Android自动化测试工具之—UiAutomator环境配置

    1.相关软件下载: 1)JDK: 1.6及其以上版本 2)Eclipse 3)Android SDK 其中Eclipse和Android SDK已经被Google打包成ADT(Android Deve ...

  5. Android 手机自动化测试工具有哪几种?

    1.Monkey是Android SDK自带的测试工具,在测试过程中会向系统发送伪随机的用户事件流,如按键输入.触摸屏输入.手势输入等),实现对正在开发的应用程序进行压力测试,也有日志输出.实际上该工 ...

  6. Android自动化测试基础知识——MONKEY测试工具(转的)

    本周开始启动手机输入法simeiji的自动化测试,同时开始接触手机浏览器自动化测试.接下来会对android自动化测试工具和方法做一个专题研究. 第一篇介绍monkey测试工具. 1 自动化测试背景 ...

  7. 解放双手——Android自动化测试

    解放程序猿宝贵的右手(或者是左手) http://blog.csdn.net/eclipsexys/article/details/45622813 --Android自动化测试技巧 Google大神 ...

  8. Android 自动化测试框架

    Android常用的自动化测试工具框架: Monkey,MonkeyRunner,UIAutomator,Robotium,Appium,Monkey Talk...... 但这些工具框架都是什么呢有 ...

  9. 老李分享:android app自动化测试工具合集

    老李分享:android app自动化测试工具合集   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨 ...

随机推荐

  1. odoo 14 python 单元测试步骤

    # odoo 14 python 单元测试步骤 # 一.在模块根目录创建tests目录 # 二.在tests目录下创建__init__.py文件 # 三.继承TransactionCase(Singl ...

  2. 协程 && 异步例子

    # 异步redis # 在使用python代码操作redis的时候,连接.操作.断开都是网络IO. # 安装aioredis模块: pip install aioredis==1.3.1 # 例: 该 ...

  3. DolphinScheduler 线上 Meetup 视频回放(07.25)

    上周六下午 DolphinScheduler 社区联合 Doris 社区进行了 2020 年首次线上 Meetup,各位讲师都做了非常精彩的分享,也吸引了 1900 多位技术伙伴观看. 其中 Dolp ...

  4. 【Java面试】什么是IO的多路复用机制?

    "什么是IO的多路复用机制?" 这是一道年薪50W的面试题,很遗憾,99%的人都回答不出来. 大家好,我是Mic,一个工作了14年的Java程序员. 今天,给大家分享一道网络IO的 ...

  5. MyBatis 03 缓存

    简介 什么是缓存 存在内存中的临时数据. 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,转从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题 ...

  6. Taurus.MVC 微服务框架 入门开发教程:项目集成:2、客户端:ASP.NET Core(C#)项目集成:应用中心。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...

  7. Excel 运算符(四):引用运算符

    引用运算符用于将单元格区域合并运算,包括:冒号.,逗号. 空格. : 运算 :运算符用于定义一个连续的数据区域,例如"A1:B3",表示从 A1 到 B3 的 6 个单元格. 并集 ...

  8. k8s-Pod调度

    Deployment全自动调度 NodeSelector定向调度 NodeAffinity亲和性 PodAffinity-Pod亲和性与互斥性 污点和容忍度 DaemonSet Job CronJob ...

  9. k8s中ingress,service,depoyment,pod如何关联

    k8s中pod通过label标签名称来识别关联,它们的label  name一定是一样的.ingress,service,depoyment通过selector 中app:name来关联 1.查询发布 ...

  10. iOS 集成WebRTC相关知识点总结

    前言 本文主要是整理了使用WebRTC做音视频通讯时的各知识点及问题点.有理解不足和不到位的地方也欢迎指正. 对于你感兴趣的部分可以选择性观看. WebRTC的初始化 在使用WebRTC的库之前,需要 ...