robotium注入和查找事件源码浅析
2016-02-26 19:28
537 查看
robotium注入和查找源码浅析那么上一篇文章我们分析了UiAutomator的注入事件和查找控件的源码走向,那么这一篇将要走入robotium的源码分析,同样分析注入和查找控件。
那么robotium呢是一款非常受欢迎的框架,参考文档和使用人数是非常多的,相比UiAutomator,robotium速度更快,因为运行在同一个进程当中,可以进行黑盒或者白盒测试,但是需要相同签名,其他就和UiAutomator差不多了,只不过不能进行跨进程测试(网上看到过大神研究可以跨应用,不过一大串东西,没看)。
其原理就是通过java的反射机制获取窗口的视图信息,然后根据条件查找控件,最后转为x y,最后通过instrument框架注入事件。说到这,类比UiAutomator的运行原理,发现都是差不多,区别只是在于怎么样什么时机获取视图和通过什么框架注入事件而已了。
使用步骤其实就是Android的单元测试了,先导入包然后继承ActivityInstrumentationTestCase2这个类,和单元测试一样一样的,不同的是封装了一个更好用的solo类,个人理解robotium就是增强版牛逼的Android单元测试。
备注:源码地址–>github跳转地址
开始进入正文吧,首先是注入事件。
![](https://img-blog.csdn.net/20160226192432062)
依然从最简单的click方法入手,最后一句调用的是Clicker类中的方法
![](https://img-blog.csdn.net/20160226192445219)
那么这里,通过text条件查找到返回一个TextView对象,然后通过clickOnScreen方法转为坐标x y,然后再实现点击,完成点击操作,所以继续跟踪点击clickOnScreen事件(注:所有的点击事件都要汇集到clickOnScreen这个重载方法)
![](https://img-blog.csdn.net/20160226192457391)
上面截取的事clickOnScreen方法的部分代码,可以看到方法拿到x y坐标后,封装成一个down和一个up的MotionEvent对象,然后给到instrumention的sendPointerSync参数中,终于跑到instrumention框架去了,大家都知道最后肯定是instrumention负责注入的嘛。
![](https://img-blog.csdn.net/20160226192518547)
所以来到了Instrumentation框架的sendPointerSync方法,看到的是通过了InputManager实例来注入事件的(UIAutomator老版本不也是通过InputManager注入的吗),那么这样一个点击事件就分析完了。
![](https://img-blog.csdn.net/20160226192543422)
这些getxxx方法其实就是选择条件,通过这些方法定位你要找的控件,并作为clickOnView的参数传入,最后转为坐标并给Instrumentation框架的InputManager注入,这就是基本流程。
我们以getVIew(int)为例字吧,这里面传入的是控件id。
![](https://img-blog.csdn.net/20160226192550703)
追踪solo类的getVIew方法,最终停在了Getter这个类里面,之后又指向Waiter类
![](https://img-blog.csdn.net/20160226192557710)
上图是Waiter类中的waitForView方法,终于到核心的ViewFetcher的getAllViews方法里面了,打开来看看
![](https://img-blog.csdn.net/20160226192606444)
好了,到了这一层级,ViewFetcher这个类看名字是视图获取者,并提供一个getAllViews的方法取得界面视图,在这个方法里面调用了另一个方法getWindowDecorViews(),里面封装的原理是通过java的反射机制获取视图并返回一个所有试图的容器,这一步就是获取到了所有视图的views了。那么是怎么通过id定位到我们需要的空间呢?
所以最后,我们回到Waiter的waitForView()方法
![](https://img-blog.csdn.net/20160226192614907)
可以看到这里做了一件事,把拿到的AllVIews视图遍历,通过getId拿到每一个id,然后和我们传入的id比较,吻合equals的话就返回我们需要点击的view了。最终这个view给到clickOnView方法,做进一步解析,完成按键操作。
Solo的构造方法有4个,但是最后都是调用这个的
其中第一个参数是robotium的一些配置项,比如超时时间,截图目录格式等等,一般都是不写就是默认的,网上例子好像也没见谁传入过自己的参数配置。另外,getInsrtumentation是在父类InstrumentationTestCase中由test runner负责注入的。
那么robotium呢是一款非常受欢迎的框架,参考文档和使用人数是非常多的,相比UiAutomator,robotium速度更快,因为运行在同一个进程当中,可以进行黑盒或者白盒测试,但是需要相同签名,其他就和UiAutomator差不多了,只不过不能进行跨进程测试(网上看到过大神研究可以跨应用,不过一大串东西,没看)。
其原理就是通过java的反射机制获取窗口的视图信息,然后根据条件查找控件,最后转为x y,最后通过instrument框架注入事件。说到这,类比UiAutomator的运行原理,发现都是差不多,区别只是在于怎么样什么时机获取视图和通过什么框架注入事件而已了。
使用步骤其实就是Android的单元测试了,先导入包然后继承ActivityInstrumentationTestCase2这个类,和单元测试一样一样的,不同的是封装了一个更好用的solo类,个人理解robotium就是增强版牛逼的Android单元测试。
备注:源码地址–>github跳转地址
开始进入正文吧,首先是注入事件。
事件注入:
Robotium重点是Solo类,所以直奔Solo类来看看事件依然从最简单的click方法入手,最后一句调用的是Clicker类中的方法
那么这里,通过text条件查找到返回一个TextView对象,然后通过clickOnScreen方法转为坐标x y,然后再实现点击,完成点击操作,所以继续跟踪点击clickOnScreen事件(注:所有的点击事件都要汇集到clickOnScreen这个重载方法)
上面截取的事clickOnScreen方法的部分代码,可以看到方法拿到x y坐标后,封装成一个down和一个up的MotionEvent对象,然后给到instrumention的sendPointerSync参数中,终于跑到instrumention框架去了,大家都知道最后肯定是instrumention负责注入的嘛。
所以来到了Instrumentation框架的sendPointerSync方法,看到的是通过了InputManager实例来注入事件的(UIAutomator老版本不也是通过InputManager注入的吗),那么这样一个点击事件就分析完了。
总结:Robotium的事件注入,最后走到的是Instrumentation框架,并创建一个InputManager实例实现注入的。
控件查找:
那么接下来,开始分析robotium是怎么查找到想要的控件的。那么以solo.clickOnView为例子吧,传入的参数是一个view,如何得到这个view呢?Robotium的solo提供了一堆getxxx方法给我们:这些getxxx方法其实就是选择条件,通过这些方法定位你要找的控件,并作为clickOnView的参数传入,最后转为坐标并给Instrumentation框架的InputManager注入,这就是基本流程。
我们以getVIew(int)为例字吧,这里面传入的是控件id。
追踪solo类的getVIew方法,最终停在了Getter这个类里面,之后又指向Waiter类
上图是Waiter类中的waitForView方法,终于到核心的ViewFetcher的getAllViews方法里面了,打开来看看
好了,到了这一层级,ViewFetcher这个类看名字是视图获取者,并提供一个getAllViews的方法取得界面视图,在这个方法里面调用了另一个方法getWindowDecorViews(),里面封装的原理是通过java的反射机制获取视图并返回一个所有试图的容器,这一步就是获取到了所有视图的views了。那么是怎么通过id定位到我们需要的空间呢?
所以最后,我们回到Waiter的waitForView()方法
可以看到这里做了一件事,把拿到的AllVIews视图遍历,通过getId拿到每一个id,然后和我们传入的id比较,吻合equals的话就返回我们需要点击的view了。最终这个view给到clickOnView方法,做进一步解析,完成按键操作。
总结:查找所有视图,是在ViewFetcher的getAllVIews获取的,拿到之后在Waiter的waitForView()方法进行条件筛选,最后返回我们查找到的所需控件,最后注入事件。
其他:
总感觉少了什么,好像还没对solo这个工具分析。Solo的构造方法有4个,但是最后都是调用这个的
其中第一个参数是robotium的一些配置项,比如超时时间,截图目录格式等等,一般都是不写就是默认的,网上例子好像也没见谁传入过自己的参数配置。另外,getInsrtumentation是在父类InstrumentationTestCase中由test runner负责注入的。
好了,末尾总结一下这篇内容吧,robotium的注入是基于instrumentation框架,通过InputManager注入的。查找控件是在waitter的waitForView()方法里面通过java反射获得视图,并匹配所需要的控件,查找并返回控件对象,之后解析包装成MotionEvent交给框架注入事件。
相关文章推荐
- 插件管理框架 for Delphi(一)
- 使用CSS框架布局的缺点和优点小结
- 列举PHP的Yii 2框架的开发优势
- Windows窗体的.Net框架绘图技术实现方法
- 浅谈JavaScript 框架分类
- 轻量级javascript 框架Backbone使用指南
- javascript实现框架高度随内容改变的方法
- JS刷新框架外页面七种实现代码
- 超赞的动手创建JavaScript框架的详细教程
- 深入探讨前端框架react
- 简单介绍不用库(框架)自己写ajax
- asp.net4.0框架下验证机制失效的原因及处理办法
- 插件管理框架 for Delphi(二)
- 零基础学习AJAX之AJAX框架
- Ajax 框架学习笔记
- Flex中最好的MVC框架Mate框架
- JavaScript 异步调用框架 (Part 4 - 链式调用)
- JavaScript 异步调用框架 (Part 2 - 用例设计)
- 为什么使用框架 使用框架的优缺点
- JavaScript 异步调用框架 (Part 3 - 代码实现)