原文地址: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. OSSCore 开源解决方案介绍

    基于.NetCore的积木化服务框架,主要将常规解决方案进行进一步的抽象下沉形成相关基础可选框架单元(在Framework 目录),并在此基础上实现常规系统模块(在Modules 目录),如用户管理, ...

  2. Apache Dolphinscheduler3.0.0-beta-1 版本发布,新增FlinkSQL、Zeppelin任务类型

    导读:近日,Apache Dolphin Scheduler 迎来了 3.0.0-beta-1 版本的正式发布.新版本主要针对 3.0.0-alpha 进行了代码和文档的修复,并引入了部分的功能,如支 ...

  3. 总结-LCT

    题单: https://www.zybuluo.com/xzyxzy/note/1027479 LuoguP3203 [HNOI2010]弹飞绵羊 动态加边,删边 #include <cstdi ...

  4. CLIP:多模态领域革命者

    CLIP:多模态领域革命者 当前的内容是梳理<Transformer视觉系列遨游>系列过程中引申出来的.目前最近在AI作画这个领域 Transformer 火的一塌糊涂,AI画画效果从18 ...

  5. screen -中断保留-屏幕同步

    工作中经常用到 screen 用处: 中断保留 和屏幕同步. yum install screen screen -S name 创建 -ls 查看 -r 恢复 -x 同屏

  6. CF1450E 资本主义Capitalism(差分约束)

    题面 点此看题 没有永远的朋友,只有永远的利益 在这个黑漆漆的社会上,有 n n n 个布衣百姓,他们在利益驱使下成为金钱的奴隶,看不到属于生活的阳光.在茫茫奔途中,他们相互扶持,结交了有 m m m ...

  7. 【java】学习路线15-接口interface、匿名内部类、接口继承

    class Learn03{    public static void main(String[] aa){        A b = new B(); //接口也可以用多态        b.me ...

  8. 第五十一篇:webpack中的loader(二) --less-loader

    好家伙 先扩充一下知识点: 什么是.less文件? 作为一名前端开发的同学,很多时候我们都无法避免地要去写大量的 CSS 代码, 而且耗费的时间还不少,所以学习一种能够提升开发效率的 CSS 预处理器 ...

  9. SpringMVC 06: 日期类型的变量的注入和显示

    日期处理和日期显示 日期处理 此时SpringMVC的项目配置和SpringMVC博客集中(指SpringMVC 02)配置相同 日期处理分为单个日期处理和类中全局日期处理 单个日期处理: 使用@Da ...

  10. docker-compose部署elastiflow

    docker-compose导入导出命令 涉及的命令有export.import.save.load save 命令 docker save [options] images [images...] ...