Robotium入门级使用指南

来自技术开发小组内部wiki
跳转至: 导航搜索

Robotium 提供两种工作方式(一种有源代码的测试,一种没有源代码的测试)

测试前需准备的工作:

  1. robotium-solo-5.3.1.jar
  2. junit-4.7.jar
  3. 环境配置

 

安装并配置JAVA_HOME

下载JDK1.7 并安装,安装过程中全用默认安装即可

JDK 环境配置

点击我的电脑---属性---高级---环境变量:

1.png


新建环境变量

2.png
3.png

说明:变量值填入jdk的安装路径

JDK  配置验证

开始----运行---输入CMD

在命令提示符下输入java –version

4.png

下载ADT 工具包并配置Android 环境

点击我的电脑---属性---高级---环境变量--- 系统变量(新建)

ANDROID_HOME= D:\adt-bundle-windows-x86_64-20140321\sdk

Path:在末尾加入;%Android_Home%\tools;%Android_Home%\platform-tools;

方式1:无源码测试

   第一步:APK重新签名

  1. 使用re-sign.jar工具,将该jar放到SDk下tools目录,双击该文件,打开如下界面
     
5.png
  1. 把apk拖入该文件中,如下图
     
6.png
  1. 点击保存,去除签名成功,如下图:
     
7.png

      说明:

   package name: APK 的包名

   Main activity: 主Activity 名,也就是你启动第一个画面相应的类名

  1. 重复步骤2、3,给apk进行重新签名。

  第二步:创建测试项目

  说明:创建Android测试项目之前,需先创建一个普通的Android项目(原因:直接创建Android测试项目会报空指针错误)。

 
8.png
 
9.png
 
10.png
 
11.png

  点击“Finish”,测试工程创建成功

  第三步:修改测试工程中的AndroidManifest.xml

 
12.png

  第四步:新建测试类

 
13.png

   说明:测试类编写规则

  • 首先必须继承ActivityInstrumentationTestCase2
  • 必须有setUp  tearDown方法
  • 测试方法必须以test开头
  • Activity必须与被测apk的Activity一致

     例如:

package com.fmb.test.cases;

import com.robotium.solo.Solo;

import android.test.ActivityInstrumentationTestCase2;

@SuppressWarnings("unchecked")
public class Start extends ActivityInstrumentationTestCase2 {

    private static final String LAUNCHER_ACTIVITY_FULL_CLASSNAME = "com.linktone.fumubang.activity.SplashActivity";
    private static Class launcherActivityClass;
    public static Solo solo;

    static {
        try {
            launcherActivityClass = Class
                    .forName(LAUNCHER_ACTIVITY_FULL_CLASSNAME);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }

    public Start() throws ClassNotFoundException {
        super(launcherActivityClass);
    }

    @Override
    protected void setUp() throws Exception {
        solo = new Solo(getInstrumentation(), getActivity());
    }
    

    public void testlogout() throws Exception {
        Log.i(TAG,"-----------退出测试开始----------");
        LoginTest.testlogin();
        solo.clickOnText("妞妞呀");
        solo.clickOnButton("退出登录");
        solo.clickOnButton("确认");
        assertTrue("退出失败", solo.searchText("登录使用更多功能"));
        Log.i(TAG,"-----------退出测试通过----------");
    }  


    @Override
    protected void tearDown(){
        solo.finishOpenedActivities();
    }
    
}

第五步:测试工程导入相应jar包

14.png
15.png
16.png


第六步:运行测试类

17.png

测试未通过:

18.png

测试通过:

19.png

2.控件定位方式

由于Robotium 定位是基于控件的,如果要对控件进行操作必须先找到元素的定位方式

方式1:元素获取可以使用sdk\tools目录下的hierarchyviewer.bat 

  1. 在模拟器中/连接真机启动被测APP,双击hierarchyviewer.bat
  2. 图中高亮部分就是模拟器或者真机中正在打开的Activity界面
20.png
  1. 在hierarchyviewer视图中,双击高亮部分,加载后的界面如下
21.png
  1. 将画面缩小,点击控件,在右下方会显示定位到app的控件位置,图中位置即“周末安排”控件,
22.png
  1. 将左侧画面放大,可查看控件的详细信息,由此可得知,控件“周末安排”是一个ImagView,imageview_type1 即是该控件对应的值,这样在编写测试类时,就可以根据相应的方法定位该控件。

举例:

23.png

public void testbuybutton() throws Exception {
        View view = null;
        view = solo.getView("imageview_type1");
        solo.clickOnView(view);
        Log.i(TAG, "周末安排控件定位成功!");
        solo.clickInList(1);
        assertFalse("详情页面,无购买按钮", solo.searchEditText("立即购买"));

    }

[[File:]]

  1. 测试case编写

方式1:使用Solo.clickOnText(String text)定位控件

public static void testlogin() throws Exception {
    Log.i(TAG, "------登录测试开始-------");
        // 让程序有足够的时间启动
                solo.sleep(2000);
                // 进入我的页面
                solo.clickOnText("我的");
                // 点击登录按钮,进入登录页面
                solo.clickOnText("点击登录");
                // 清空【用户名】editText值
                solo.clearEditText(0);
                // 输入用户名
                solo.enterText(0, "18800030327");

                // 清空【密码】editText值
                solo.clearEditText(1);
                // 输入密码
                solo.enterText(1, "111111");

                // 点击“登录”按钮
                solo.clickOnButton("登录");
                solo.sleep(2000);
                // 登录成功,验证用户昵称
                assertTrue("登录失败", solo.searchText("妞妞呀"));
                Log.i(TAG, "------登录测试通过-------");
    }

方式2:使用solo.clickOnView(view)定位控件

public void testbuybutton() throws Exception {
        View view = null;
        view = solo.getView("imageview_type1");
        solo.clickOnView(view);
        Log.i(TAG, "周末安排控件定位成功!");
        solo.clickInList(1);
        assertFalse("详情页面,无购买按钮", solo.searchEditText("立即购买"));

    }

  1. 常用控件使用举例

//点击按键

//按控件属性右下角的index定位,在遍历整个子对象时通常采用方式,先定位到父对象,再用这种方式取子对象

//如果是单用这一种方式去定位某一种控件很难定位

solo.clickOnButton(0);

//如果按键上有文字属性可以用这种方式

solo.clickOnButton("查询");

//如果按键上的文字是图片展现出来的,系统中只有ID属性时需要自行封装方法

//操作按键,可以用以下方式操作有ID的按键

solo.clickOnView(solo.getView("控件的ID"));

//对编辑框进行输入

//方式1:通过ID定位

//首先通过ID定位到输入框元素

EditText edittext = solo.getView(id);

//对已定位到的控件输入text

solo.enterText(edittext ,text);

//获取控件文本属性

//toString().trim() 是将获取的名字先转成字符,如果有空格,自动去除空格

solo.getView("id").getClass.getName().toString.trim();

//长按控件

//依据控件的text定位,并执行长按操作

solo.clickLongOnText(text);

//依据控件的text定位,且同一界面有多个相同的Text时采用以下方式

//其中match为int型,代表寻找第几个text

solo.clickLongOnText(text,match);

//有时某个控件在当前屏幕找不到,需要滚动屏幕时采用以下方式

//其中scroll为boolean型,为true时在找不到控件时会自动滚动

solo.clickLongOnText(text,match,scroll);


//菜单操作

//点击某个菜单

solo.clickOnMenuItem(text);

//下拉列表操作(Android称为Spinner控件)

//依据text值选择所要的项

solo.isSpinnerTextSelected(text);

//复选控件操作

//确认控件中某个值被选中

solo.isCheckBoxChecked(text);

//确认当前界面是否存在某个控件可以采取以下方式

//搜索是否存在指定按钮

solo.searchButton(text);

//搜索是否存在指定文本

solo.searchText(text);

//控件拖动

//fromX,toX  x轴从某个点拖动到某个点

//fromY,toY  Y轴从某个点拖动到某个点

//stepCount  拖动分几步执行,步数越多,越稳定

solo.drag(fromX,toX,fromY,toY,stepCount);

solo.clickOnScreen(x,y);


//验证方法

//用于验证当前Activity名称是否正确

solo.assertCurrentActivity(message,activityClass);

//验证内存值的信息

solo.assertMemoryNotLow();

//由于测试中引用了Junit包,所有通过还可以用junit的断言方法

//验证预期结果与实际结果是否相符

Assert.assertEquals(exp,act);

//condition得到的是一个Boolean,如果condition得到的是true,用例通过

Assert.assertTrue(condition);

//对象非空判断

Assert.assertNotNull(object);

Assert.assertNull(object);

//对象与对象之间的比对

Assert.assertSame(exp,act);