史上最简单Robotium跨进程操作实践—基于ADB框架

发表于:2015-8-18 10:06

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:qingchunjun    来源:51Testing软件测试网采编

  2015年2月3日更新:
  有些朋友在用真机尝试本方法时,抛出了InputStream cannot be null的异常。该异常是由于adb运行在robotium框架中时,是完全运行在手机中的,此时它的权限受到android系统的限制。而原框架是用在PC端的,这才导致了该异常的出现。具体的原因分析可以见我的这篇文章:http://blog.csdn.net/qingchunjun/article/details/43343735。
  该问题的修改可以参考这里:http://blog.csdn.net/qingchunjun/article/details/43448371
  注意:大家如果使用真机的话,务必使用已经root过的手机,否则将由于系统目录权限限制的原因导致文件生不成。
  Robotium是Android平台下一款非常优秀的自动化测试框架,它做android平台自动化的优势想必看到这篇文章的人应该都很清楚。但优点归优点,缺点也比较多,最明显的缺点有两个,一是必须要和被测系统签名保持一致,二是不能做任何跨进程的操作。
  很多小伙伴知道怎么用robotium,也知道它有这些限制,但不知道其中的原因。这里简单地说一下,robotium的这些先天不足的主要原因是由于它本身是基于instrumentation机制的,这既有好处也有坏处。好处是通过instrumentation注入到被测进程,从而与被测进程运行在同一进程空间,使得它能够非常方便地识别被测应用中的被测对象,并对这些对象进行操作。坏处是既然robotium已经跟被测应用”合体”了,那么根据android的进程隔离机制,它自然也被系统隔离在其他进程之外,无法跨进程操作任何对象,如图(1)所示。
  
图(1)Android进程沙箱示意图
  其实使用相同的签名对于单应用的测试来说并不是难事,网上有很多应用重签名的方法和工具供大家使用。但不能跨进程操作确实成为了robotium最大的软肋,很多第三方的应用测试或多或少都有一些跨进程操作的测试场景,所以不少人因为这个问题而放弃了robotium,甚是可惜啊。
  作为robotium的铁杆粉之一(我最开始接触android自动化测试就是用的robotium),断断续续用了好几年,一直觉得是android平台最好用的自动化测试工具之一。对于robotium怎样突破进程的限制也做过一些研究,网上比较多的解决方案无外乎有以下几种:
  1. 自己写服务做server,基于AIDL或编写socket与monkeyserver进行通讯,然后在robotium测试脚本里调用接口方法来间接地进行跨进程的操作,这种方式可以参考下这篇文章的例子:http://www.robotium.cn/archives/584。文章的作者只是给出了思路,我自己曾经按照这种方法去实现过,发现该方法的优势是比较稳定,缺点就是实现起来确实比较复杂,而且有些操作无法找到现成的系统aidl接口来进行操作,比如调用拍照操作,所以其实例子并不是很多,技术上的局限性较大。
  2. 基于广播和service服务。这种方法的实现方式可以参考http://www.ltesting.net/ceshi/open/kygncsgj/2013/0507/206229.html这篇文章的描述。这种方法我没有亲自去试过,但不难发现这种方法原理稍微简单些,但该方法貌似需要系统签名,而且自己写广播和服务来调用系统api,难度也不算小,所以一般不建议使用这种方式。
  综合上面的这些跨进程的解决方案,其实都感觉不太理想,对于很多初学者来说不是太难实现就是局限性比较大,一直没有找到一个比较理想的解决方案。直到后来在testerhome上看到一个技术很牛的兄弟把常用的adb命令做了一个很完备的封装(PS:真的是很全了,至少常用的adb命令都在,我甚至之前都没有想过adb命令还能做这么多事情),做成了一个独立的测试辅助工具。我就突然联想到为何不能使用adb命令来辅助robotium进行跨进程操作呢?既然该框架已经封装了基于adb的所有操作,而且adb又是不受系统限制的,那么基于这个框架理论上进行跨进程操作是没有任何问题的。后来经过试验,确实效果不错,轻量级、操作简单、使用方便,并且轻松跨进程,真是居家测试、屌丝逆袭的必备神器啊。好了,闲话不多说了,接下来我们就来详细地看看究竟是怎么用的。
  先来简单地介绍下这个adb命令框架的常用接口。这个框架里有三个主要的包,分别介绍如下:
  xuxu.autotest这个包里面主要有两个类,一个是AdbDevice,封装了功能测试中常用的一些操作,如获取当前activity的名称和包名、获取设备分辨率、关闭应用、点击对象等常用功能,非常实用。另一个类是XuImage,顾名思义,即封装了一些常见的图片操作,如得到指定边界的图片截图、对比图片是否一致、截取图片等。
  xuxu.autotest.element这个包主要用于获取被测对象,主要是封装了一个Position对象,用于通过Class Name、Id、Contentdesc等属性来获取一个被测对象,其底层是通过uiautomator来dump 当前ui的xml文件的,可以获取到所有对象节点的xml文件。
  xuxu.autotest.utils这个包里面主要提供了对Date日期时间的操作,ImageUtil对图片的操作及正则表达式和shell语句的操作的封装,方便大家的使用。总的来说整个框架的接口设计还是非常齐全的,可以实现很多常用功能,具体功能大家可以自己看源码和帮助文档来摸索。
  接下来就进入我们本次的主题——跨进程。为了方便大家理解,我会在本文中选择两个非常常见的跨进程操作场景来说明如何跨进程,也就是大家喜闻乐见的相机拍照和打电话来进行演示。
  例子1、跨进程操作之相机拍照。
  被测程序非常简单,程序界面截图如下图(2)所示:
  
图(2)
  点击第一个界面的“拍照片”按钮后,进入界面2,点击其中的“拍张照片”后启动系统的相机,当用户按下拍照功能键后,系统可以将用户拍下的照片显示在应用中,以备后续浏览或者是上传。由于相机应用和我们所写的被测应用是两个不同的应用,所以这就属于典型的跨进程操作,Robotium框架本身是无法对这个相机界面进行操作的。
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号