Android自动化测试框架UIAutomator原理浅析
UIAutomator是一个Android自动化测试框架,是谷歌在Android4.1版本发布时推出的一款用Java编写的UI测试框架,它只能用于UI即黑盒方面的测试。所以UIAutomator只能运行在Android4.1之后的版本,其最大的特点是可以跨进程操作。我们可以使用UIAutomator框架提供的一些方便的API来对Android应用进行一系列的自动化测试操作,如点击、滑动、键盘输入、长按以及常用的断言方法。可以代替繁复的手工测试。
优点:
- Google自家推出,其稳定性和后续的维护更新可以得到保障,运行也有更多的权限。
- 可以跨进程操作,这点比起其他基于instrumention框架的自动化工具如Robotium是无法直接做到的。
- 运行速度快。
缺点:
- 不支持Android4.1以下的版本。
- 不支持Webview,所以一般无法对浏览器应用进行测试。
原理
首先,Google的UIAutomator参考微软的UIAutomation提供的一套用在Android上的自动化测试框架。 基于Android AccessilibilityService。 在这里简单介绍一下:AccessilibilityService是一个可访问服务,它是一个为增强用户界面并帮助残疾用户的应用程序,或者用户可能无法完全与设备交互。举个简单的例子,假如一个用户在开车。那么用户就有可能需要添加额外的或者替代的用户反馈方式。其应用方式一般有两种:
第一种方法是:UIAutomatorView + monkey。它与hierachyview + monkey差不多。其区别是:UIAutomatorView通过ADB向设备侧发送一个dump命令,而不是建立一个socket,下载一个包含当前界面控件布局信息的xml文件。相比较hierachyview下载的内容而言,该文件小很多。因此,从效率上讲,这种方法比第一种应用模式快很多。
第二种方法是: 直接调用UIAutomator框架对外提供的API,主要有UIDevice、UISelector、UIObject和 UIScrollable等。其原理与第一种方式即HierachyView + Monkey差不多。其过程大致是:首先,UIAutomator测试框架通过Accessibilityservice,获取当前窗口的控件层次关系及属性信息,并查找到目标控件。若是点击事件,则计算出该控件的中心点坐标。其次,UIAutomator通过 InputManager.getInstance().injectInputEvent隐藏接口来注入用户事件(点击、输入类操作),从而实现跨进程 自动化的目的。
UIAutomator对外还提供了UIAutomatorTestCase、UIDevice、UISelector、UIObject、UICollection、UIScrollable等重要的类,其各自的作用如下:
- UIAutomatorTestCase :这个类是继承自 Junit TestCase (Junit),对外提供setup、teardown等,以便初始化用例、清除环境等。所以我们在编写的 UIAutomator 的脚本时一般都要继承这个类,这样就可以直接使用它的一些方法和Junit单元测试框架中的Assert断言机制。
- UIObject :UIObject可以代表页面的任意元素,但它的各种属性定位通常是通过UISelector这个类来辅助完成的。
- UIDevice :在测试时可以通过getUIDevice() 来实例化UIDevice对象去对设备进行各种控制,如唤醒屏幕,锁屏,点击Home, Back,Menu键等等。
- UISelector : 主要是通过一定查询方式,可以通过UISelector对象去定位UI元素。如果发现多个满足条件的控件则会返回第一个控件,在使用UISelector 的时候可以组合使用多个属性来定位具体的控件,还可以使用childSelector()函数来嵌套UISelector对象。
- UICollection: UICollection一般与UISelector连用,如它的构造函数也要求提供UISelector: UICollection(UISelector selector)。它的API较少,主要用以从UIselector筛选出的元素集中挑出所要的元 素:getChildByDescription(), getChildByInstance(), getChildByText() ,以及统计元素集的个数getChildCount()。
- UIScrollable:UIScrollable 用来表 示可以滑动的界面元素,其继承关系为UIObject -> UICollection ->UIScrollable。但UIAutomator的实现方式与HierachyView+Monkey有很大不一样。以控件点击操作为例, 其实现流程大致如下:
定义一个点击对象Object,该对象则通过UISelector对象定位到具体的控件。而UISelector则通过 UIAutomatorBridge(它可看做是UISelector与AccesibilityService之间的连接器),将查询内容 (AccessibilityNodeInfo)和输入事件(AccessibilityEvent)传给AccessibilityService。实 际业务过程比这复杂的多。这样,就实现了对某个控件的查找或点击操作。备注:AccessibilityEvent,所有可操纵的UI元素都定义为一个 AccessibilityEeventt;AccessibilityNodeInfo指视窗中的组件树节点。
Android自动化测试框架UIAutomator原理浅析的更多相关文章
- 几种常见的Android自动化测试框架及其应用
随着Android应用得越来越广,越来越多的公司推出了自己移动应用测试平台.例如,百度的MTC.东软易测云.Testin云测试平台…….由于自己所在项目组就是做终端测试工具的,故抽空了解了下几种常见的 ...
- Android自动化测试框架对比
1.Monkeyrunner:优点:操作最为简单,可以录制测试脚本,可视化操作:缺点:主要生成坐标的自动化操作,移植性不强,功能最为局限:2.Rubotium:主要针对某一个APK进行自动化测试,AP ...
- Android 自动化测试框架
Android常用的自动化测试工具框架: Monkey,MonkeyRunner,UIAutomator,Robotium,Appium,Monkey Talk...... 但这些工具框架都是什么呢有 ...
- MAC中在eclipse luna上搭建移动平台自动化测试框架(UIAutomator/Appium/Robotium/MonkeyRunner)关键点记录
这几天因为原来在用的hp laptop的电池坏掉了,机器一不小心就断电,所以只能花时间在自己的macbook pro上重新搭建整套环境,大家都知道搭建环境是个很琐碎需要耐心的事情,特别是当你搭建的安卓 ...
- 【转】Android自动化测试(UiAutomator)简要介绍
一.一个BUG引发的问题 如果研发过程中有一个BUG:“不断的切换手机语言出现花屏现象”.这个问题我们如何验证呢?我想,最好的方式应该是自动化测试. 那么,自动化测试可以完成哪些任务呢? ...
- Android自动化测试(UiAutomator)
一.一个BUG引发的问题 如果研发过程中有一个BUG:“不断的切换手机语言出现花屏现象”.这个问题我们如何验证呢?我想,最好的方式应该是自动化测试. 那么,自动化测试可以完成哪些任务呢? ...
- Android自动化测试框架
1.Monkeyrunner:优点:操作最为简单,可以录制测试脚本,可视化操作:缺点:主要生成坐标的自动化操作,移植性不强,功能最为局限: 2.Rubotium:主要针对某一个APK进行自动化测 ...
- Asp.net WebPages框架运行原理浅析(转)
在Asp.net4和4.5中,新增了WebPages Framework,编写页面代码使用了新的Razor语法,代码更加的简洁和符合Web标准,编写方式更接近于PHP和以前的Asp,和使用 WebFo ...
- Asp.net WebPages框架运行原理浅析
[来源] 达内 [编辑] 达内 [时间]2012-09-14 在Asp.net4和4.5中,新增了WebPages Framework,编写页面代码使用了新的Razor语法,代码更加的简洁和 ...
随机推荐
- gitlab+jenkins自动化打包IOS-jenkins配置
实现的效果如图: 构建界面: 完成效果: 功能说明: 根据选择的代码分支,执行构建打包 构建成功后根据ipa/apk生成二维码,并可在历史构建列表中展示各个版本的二维码,通过手机扫描二维码可直接安装 ...
- jmeter之JDBC请求
jmeter不仅可以测试http请求,也可以执行JDBC请求的测试.本次以mysql为例,介绍JDBC请求如何完成发送 目录 1.环境配置 2.数据库连接配置 3.添加一个JDBC请求 1.环境配置 ...
- Python程序打包为可执行文件exe
Python程序打包为可执行文件exe,pyinstaller应用 山重水复疑无路,柳暗花明又一村. 本来是向老师提交一个python程序,因为第一次所以就很尴尬只把源码给老师了,应该是打包成一个可执 ...
- Unity3D架构之PureMVC
之前了解过UI实现框架大多是用MVC架构的,才听说有这么一个基于MVC的跨平台开源框架叫PureMVC,前几天用到了做了一下,写一写分析总结官网位置:http://puremvc.org/ PureM ...
- Kakuro Extension【最大流】
HDU-3338 这道题真的处理起来好复杂啊,题意就是个简单的方格填数问题,但是每个白点至少放1,那么最后的可能解是怎样的呢?我们是不是要把x轴上的和y轴上的统一起来,然后就是每个点都被对应的x和y匹 ...
- K-th Number 【POJ - 2104】【可持久化线段树】
题目链接 因为这道题没有删除修改之类的,所以很多人会用离散化之后的线段树来做,但是实际上(可能是我懒得去做离散化这个操作了),然后就是直接写可持久化线段树,区间的长度就是int的从最小到最大的长度,然 ...
- Convolutional Neural Networks(2):Sparse Interactions, Receptive Field and Parameter Sharing
Sparse Interactions, Receptive Field and Parameter Sharing是整个CNN深度网络的核心部分,我们用本文来具体分析其原理. 首先我们考虑Feedf ...
- mooc-IDEA 编写高质量代码--009
十五.IntelliJ IDEA -编写高质量代码 1.重构 [1]重构变量 选中某个变量,按住 shift+F6,修改变量名,则所有该变量名均会被重构为新变量名 [2]重构方法[ctrl+F6 | ...
- Django first()和last() F查询以及Q查询
一.first()和last() 分别返回queryset的第一项与最后一项,具体用法如下: p = Blog.objects.order_by('title').first() 等同于: try: ...
- python字典、字符串(json串)、字节串之间的转化
字典和json字符串(本质也是字符串)之间的转化用json.dumps和json.loads() json.dumps(): 字典→json字符串 json.loads(): json字符 ...