Robotium入门级使用指南
Robotium 提供两种工作方式(一种有源代码的测试,一种没有源代码的测试)
测试前需准备的工作:
- robotium-solo-5.3.1.jar
- junit-4.7.jar
- 环境配置
安装并配置JAVA_HOME
下载JDK1.7 并安装,安装过程中全用默认安装即可
JDK 环境配置
点击我的电脑---属性---高级---环境变量:
新建环境变量
说明:变量值填入jdk的安装路径
JDK 配置验证
开始----运行---输入CMD
在命令提示符下输入java –version
下载ADT 工具包并配置Android 环境
点击我的电脑---属性---高级---环境变量--- 系统变量(新建)
ANDROID_HOME= D:\adt-bundle-windows-x86_64-20140321\sdk
Path:在末尾加入;%Android_Home%\tools;%Android_Home%\platform-tools;
方式1:无源码测试
第一步:APK重新签名
- 使用re-sign.jar工具,将该jar放到SDk下tools目录,双击该文件,打开如下界面
- 把apk拖入该文件中,如下图
- 点击保存,去除签名成功,如下图:
说明:
package name: APK 的包名
Main activity: 主Activity 名,也就是你启动第一个画面相应的类名
- 重复步骤2、3,给apk进行重新签名。
第二步:创建测试项目
说明:创建Android测试项目之前,需先创建一个普通的Android项目(原因:直接创建Android测试项目会报空指针错误)。
点击“Finish”,测试工程创建成功
第三步:修改测试工程中的AndroidManifest.xml
第四步:新建测试类
说明:测试类编写规则
- 首先必须继承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包
第六步:运行测试类
测试未通过:
测试通过:
2.控件定位方式
由于Robotium 定位是基于控件的,如果要对控件进行操作必须先找到元素的定位方式
方式1:元素获取可以使用sdk\tools目录下的hierarchyviewer.bat
- 在模拟器中/连接真机启动被测APP,双击hierarchyviewer.bat
- 图中高亮部分就是模拟器或者真机中正在打开的Activity界面
- 在hierarchyviewer视图中,双击高亮部分,加载后的界面如下
- 将画面缩小,点击控件,在右下方会显示定位到app的控件位置,图中位置即“周末安排”控件,
- 将左侧画面放大,可查看控件的详细信息,由此可得知,控件“周末安排”是一个ImagView,imageview_type1 即是该控件对应的值,这样在编写测试类时,就可以根据相应的方法定位该控件。
举例:
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:]]
- 测试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("立即购买"));
}
- 常用控件使用举例
//点击按键
//按控件属性右下角的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);