Android自动化测试工具调研
原文地址: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,进行测试,之后可以测试工具可以将手机上的操作进行录制保存为脚本,并可以分享到其他设备上执行,从而实现一套自动化测试。
是蚂蚁金服开源的一款移动端APP测试工具,提供脚本录制、编辑、回放,结果展示以及一机多控(即通过设备间的socket通讯实现1台手机可以控制多台手机执行脚本)等功能,其测试用例的录制和执行等操作均在手机端的一个APP中完成。
不需要借助电脑软件与测试设备交互,所以通信结构比Appium简单高效,对元素的识别也是使用类似于appium的控件的方式,并且引入了类似于airtest的图像识别的方式。
Solopi支持原生APP即混合式APP,虽然Appium和Airtest都有很大的应用范围,但是Solopi相比于appium和airtest有以下优势:
- 改进的控件匹配算法,更高的匹配成功率;
- 不需要依赖pc端的桌面应用,全部操作都在手机端的app中完成,实现了无线化,随时可测;
- 不需要代码基础,使用人群覆盖范围广;
- 提供性能测试的功能等。
这套方案中,底层依赖主要是 “无线 ADB、系统辅助功能、Chrome 调试以及图像识别技术”。同时,在底层依赖的基础上,封装了一套核心能力,由 “控件定位、事件驱动、性能采集以及依赖注入” 组成,并在服务层实现了录制、回放、数据处理等公共服务能力。在架构的最顶端,结合界面交互逻辑包装出了各个功能的入口
SoloPi 录制的用例会以 JSON 的形式存储起来,用例不仅可以在设备本地直接回放,还可以通过 SoloPi 的解析器将用例转换为 Appium等目前主流自动化测试框架的脚本,轻松打通云测平台
参考
- 一个简单的monkey测试工具_一土小亘兄的博客-CSDN博客_monkey
- [Android学习十一]Android开发单元测试_野马红尘的技术博客_51CTO博客
- Android UI自动化测试框架—SoloPi简介 - 掘金
Android自动化测试工具调研的更多相关文章
- 支付宝开源非侵入式 Android 自动化测试工具 Soloπ
Soloπ(SoloPi)是支付宝开源的一个无线化.非侵入式的Android自动化测试工具,公测版拥有录制回放.性能测试.一机多控三项主要功能,能为测试开发人员节省宝贵时间. 本文是SoloPi团队关 ...
- Web自动化测试工具调研
背景 Web自动化测试越来越被重视, 因为现在Web已经是工程化的状态. 如何通过工具测试, 保证Web开发的质量,提升开发效率,是Web工具的诞生的来由. Web测试分为以下几个方面: 1. 界面测 ...
- Android自动化测试工具——monkey简介及入门
记得第二家单位的安卓开发在上线前都用monkey压几个小时,确实也能发现些问题,崩溃率低了些,没测过的确实可以压一压 搜了下资料,monkey确实很简单,发现问题自己搜下是什么问题,别一发现什么就跑去 ...
- Android自动化测试工具之—UiAutomator环境配置
1.相关软件下载: 1)JDK: 1.6及其以上版本 2)Eclipse 3)Android SDK 其中Eclipse和Android SDK已经被Google打包成ADT(Android Deve ...
- Android 手机自动化测试工具有哪几种?
1.Monkey是Android SDK自带的测试工具,在测试过程中会向系统发送伪随机的用户事件流,如按键输入.触摸屏输入.手势输入等),实现对正在开发的应用程序进行压力测试,也有日志输出.实际上该工 ...
- Android自动化测试基础知识——MONKEY测试工具(转的)
本周开始启动手机输入法simeiji的自动化测试,同时开始接触手机浏览器自动化测试.接下来会对android自动化测试工具和方法做一个专题研究. 第一篇介绍monkey测试工具. 1 自动化测试背景 ...
- 解放双手——Android自动化测试
解放程序猿宝贵的右手(或者是左手) http://blog.csdn.net/eclipsexys/article/details/45622813 --Android自动化测试技巧 Google大神 ...
- Android 自动化测试框架
Android常用的自动化测试工具框架: Monkey,MonkeyRunner,UIAutomator,Robotium,Appium,Monkey Talk...... 但这些工具框架都是什么呢有 ...
- 老李分享:android app自动化测试工具合集
老李分享:android app自动化测试工具合集 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨 ...
随机推荐
- 小白之Python基础(四)
条件判断和循环: 1.条件判断类型: 1)if语句:(注意:if中的条件如果是:非零数值.非空字符串.非空list等,就判断为True,否则为False.) 2)if-else语句: 3)if-eli ...
- 6.11 NOI 模拟
\(T1\)魔法师 \(f(x)\)是各个数位之积,当\(f(x)\ne 0\),每一位只能是\(1\sim 9\),考虑数位积的质因数分解只能是\(2,3,5,7\)的形式,考虑对所有的\((a,b ...
- BTDetect用户协议和技术支持
1.巴蜀生物科技检测用户协议 2.基于机器学习的生物检测项目 3.BTDetect用户手册和技术支持
- docker 部署私人 nuget 服务
使用docker搭建私有Nuget服务 首先在linux服务器上创建两个容器挂着目录 mkdir /home/nuget/db mkdir /home/nuget/packages 并且对该目录指定写 ...
- java-集合排序,队列,散列表map以及如何遍历
1.1集合排序 可以通过集合的工具类java.util.Collections的静态方法sort需要注意的时,只能对List排序,因为它有序. Collections.sort(list); 排序字符 ...
- 大数据Hadoop入门教程 | (一)概论
数据是什么 数据是指对客观事件进行记录并可以鉴别的符号,是对客观事物的性质.状态以及相互关系等进行记载的物理符号或这些物理符号的组合,它是可识别的.抽象的符号. 它不仅指狭义上的数字,还可以是具有一定 ...
- Python小游戏——外星人入侵(保姆级教程)第一章 07调整飞船速度 08限制飞船活动范围
系列文章目录 第一章:武装飞船 07调整飞船速度 08限制飞船活动范围 一.代码及演示 1.修改settings 修改文件:settings.py 点击查看代码 #渗透小红帽python的学习之路 # ...
- 有一个线性表,采用带头结点的单链表L来存储,设计一个算法将其逆置,且不能建立新节点,只能通过表中已有的节点的重新组合来完成。
有一个线性表,采用带头结点的单链表L来存储,设计一个算法将其逆置,且不能建立新节点,只能通过表中已有的节点的重新组合来完成. 分析:线性表中关于逆序的问题,就是用建立链表的头插法.而本题要求不能建立新 ...
- 面向对象06---static关键字
public class Preson { { System.out.println("匿名代码块");// 2 } static { System.out.println(&qu ...
- PLSQL 与 PLPGSQL
KingbaseES 为了更好地适应用户的oracle 应用,实现了对 plsql 的支持,用户可以根据需要使用 plsql 或 plpgsql. 以下简要介绍下二者的差异 一.格式差异 1.plpg ...