注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭州 QA Team

务实 专注 分享 做有态度的QA

 
 
 
 
 

日志

 
 

Orange之初学笔记  

来自happylifecth   2014-11-29 15:28:17|  分类: 自动化测试 |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 最近,项目需要编写Android UI用例。用例的编写是基于Orang测试框架,在学习的过程中遇到了一些问题,总结如下:
1.Orange是在Robotium开源框架之上封装的,其基本工作原理是:
  •    将被测应用和测试应用(二者具有相同的签名)同时安装在模拟器(或真机)上,通过Android Instrumentation框架,测试应用可以控制被测应用。
  • 在测试工程的AndroidManifest.xml文件中可以配置测试工程包名和被测工程包名。
  • Instrumentation框架通过将测试应用和被测应用运行在同一个进程来实现交互功能。
  • 执行测试时,通过Instrumentation首先启动被测应用的Activity,测试用例继承自基类InstrumentationTestCase,可以给被测应用的主线程发送按键等UI事件,并且可以检测被测应用的Activity的状态等。
2.UI用例一般是跑在测试环境下,模拟器需要绑定host,安装如下步骤修改host文件
       命令输入
       adb root                        //使用管理员权限
       adb remount                //重新挂载系统分区,将系统分区重新挂载为可写
       adb pull /system/etc/hosts e:\host\   //把模拟的host文件拉出来,在本地修改好
       adb push e:\host\hosts /system/etc  //把修改好的host文件传到模拟器上
       但是这样做了之后,发现模拟器还是取得线上数据,调研了一下,原来是因为linux和windows中的换行符不一致,那么可以通过adb shell来写入。先把模拟器上的host文件恢复成原来的状态,然后
        adb shell
        echo -e \\n >> /system/etc/hosts             //写一个换行符
        echo 127.0.0.1 www.163.com >> /system/etc/hosts //写入需要的host
        echo -e \\n >> /system/etc/hosts           //写入换行符,接下去继续写host
         然后模拟器就可以取到测试环境的数据啦!
3.书写用例一般需要控件的id号,而id号通常通过Hieriarcgy Viewer来查找。但是Hieriarcgy Viewer使用很不方便,尤其对于一些控件比较多的页面,经常为了找一个控件的id花费较多的时间。然后发现Orange的一系列click方法中,有的是可以不通过id来点击控件的。比如,如果要点击一个带文本的控件,可以通过clickOnText("xxx")来点击。
4.如何通过Orange点击控件呢,可以如下调用
       View v = orange.getView(Id);
       orange.clickOnView(v);
       但是,模拟器时常很慢,新打开一个页面要很久才出来,有可能click的时候页面还没有加载出来。因此需要在上面的代码之前加上orange.waitForView(Id);
5.一个页面有多个相同的控件时,比如有n个关注按钮,点了其中一个之后页面上就少了一个。于是,想采用如下的方式
    1)通过getViews(Id)来取得所有相同Id控件的view类型列表,从而得到该Id的控件数目n1;
    2)点击该Id的某个控件;
    3)再次通过1)的方式来取得Id的控件数目n2
    4)断言n2等于n1-1
但是结果断言失败了。原因是以id来取得控件的数目是实际布局的个数,点了之后消失只是页面上消失,不会改变布局。可以采用其他的方式来验证操作成功,比如取消关注按钮的出现等。
6.在一个java文件中写两个用例,采用如下的形式
  public class Test extends BaseTest {
private static String blogName1 = "androidui1";
private static String blogName2 = "androidui2";
        public void TestCase1() {
         //使用变量blogName1
        }
        public void TestCase2() {
        //使用变量blogName2
        }
}
运行到第二个用例失败,提示:Test run failed: Instrumentation run failed due to 'java.lang.NullPointerException'
后来发现原来第一个用例执行之后会做一些清除的工作,把成员变量都清除了。因此,改为把变量只在写在测试方法中,运行成功了。也可以规范点,把一些常用到的变量统一定义在一个类文件中。
7.waitForView和waitForViewShow方法的区别,我理解是waitForView等待一个view出现,然而该view虽然在页面布局里但不一定是可见的,即不一定显示在页面上;而waitForViewShow是等待页面上显示出该控件。使用的时候要根据具体情况决定采用哪个方法。
8.有时直接通过id点击某个view,提示找不到该控件。可以尝试先找到其父view,然后在父view中找到该view点击,可以采用如下方法
                View parentView = orange.getView(parentId);
View childView = orange.getView(parentView,childId);

9.遇到这样的情况:顶栏有两个按钮左边是button1,右边是button2,想要点击button2,但是运行用例,发现点击button2没有出现预期的结果,却和点击button1的结果一样。翻阅了下资料,clickOnView方法的实现是:先通过View的getLocationOnScreen()方法得到该View的坐标,然后调用clickOnScreen()方法,点击屏幕的相应位置。于是就采用如下方式,在点击前打印出button1和button2的位置,发现二者位置竟然是一样的,都是button1应该的位置!
                int[] location= new int[2];
view.getLocationOnScreen(location);
Log.d(LOG_TAG, "X="+location[0]);
Log.d(LOG_TAG, "y="+location[1]);
后跟开发沟通,原因应该是顶栏button2的布局属性 android:layout_alignParentRight="true"需要等页面渲染完才能生效,所以如果模拟器上页面加载较慢的话就有可能出现上述情况。解决办法是:可以让测试线程休眠等待几秒钟,再点击,如下
          try {
Thread.sleep(10000);
} catch (InterruptedException ignored) {
}
orange.clickOnView(view);
  评论这张
 
阅读(351)| 评论(2)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016