Robotium 自动化测试
一、Setup
Android Studio环境下,在所要测试的Module的build.gradle文件下添加,
compile ‘com.jayway.android.robotium:robotium-solo:5.4.1’
然后Sync下。
二、Start
Robotium即是对Instrumentation框架方法的封装,所以使用之前需要继承测试类,重写构造器,setUp()和tearDown()方法。
public class SplashActivityTest extends ActivityInstrumentationTestCase2 {
private Solo solo;
public SplashActivityTest() throws ClassNotFoundException {
super(SplashActivity.class);
}
@Override
public void setUp() throws Exception {
super.setUp();
solo = new Solo(getInstrumentation());
getActivity();
}
@Override
public void tearDown() throws Exception {
solo.finishOpenedActivities();
super.tearDown();
}
}
其中继承的是ActivityInstrumentationTestCase2测试类。ActivityInstrumentationTestCase2测试类主要用于跨Activity的测试。(测试类的关系和架构见附页1)
其中
solo = new Solo(getInstrumentation());
solo.finishOpenedActivities();
是Robotium框架独有的。
测试方法必须是public的,且以test开头。这是因为用的是Junit3框架。
public void testRun() {}
三、Use
我们所会用到的API主要来自于四个部分:
- Robotium框架核心类Solo
- Instrumentation框架下的ActivityInstrumentationTestCase2类
- unit3下的断言方法
- UI组件的getXX或findXX方法
这里我们只单独简单说明Solo类的API。
Solo类是Robotium中核心类,几乎所有的测试方法都是调用它的方法实现。
1.getXX() 匹配方法
一般使用getView(int id),getText(String text)匹配想要操作的组件,如果匹配不到,还可以尝试getButton(),getImage()等
// getCurrentActivity()方法返回的是界面显示的Activity。
2.action() 操作方法
- clickOnView(),clickOnText()
- clearEditText(),enterText()
- clickInList(),clickInRecyclerView()
- scrollDown(),scrollViewToSide()(如果是ListView等,这里不推荐使用,不如直接使用moveTo等方法)
- goBack()
3.ssert()/search() 断言方法
- assert:只有solo. assertCurrentActivity() 方法
- search()返回布尔值,用于逻辑判断,断言。
- searchXXX(),waitXXX() 与assertEqual() 方法配合。
4.waitXX(,time) 等待方法
waitForActivity()等,返回布尔值。
在time时间内条件成立,立即执行下一步,不一定非要等待time时间。
同时我们可以使用返回false的waitXX方法作为稳定的定时器使用,我常常用waitForEmptyActivityStack()。
三个作用:等待程序响应,逻辑判断,放缓测试速度
备注:waitXX方法的扩展:waitForCondition()用来支持所有判断条件,实例见下:
solo.waitForCondition(new myCondition(viewGroup), 3000)
class myCondition implements Condition {
Object viewGroup;
myCondition(Object viewGroup) {
this.viewGroup = viewGroup;
}
@Override
public boolean isSatisfied() {
return viewGroup != null;
}
}
四、practice
SplashActivity.java(这里难点主要是对listView或RecyclerView组件的遍历和判断条件的选择)
需求:
1、从启动页进入
2、切换城市,遍历所有城市
3、搜索1-9
4、如果搜索结果返回多个匹配值,遍历所有匹配值。
5、如果进入站点详情,遍历所有路线,点击收藏按钮并取消收藏
6、如果进入线路详情,遍历所有站点,刷新,然后换向后,重复一遍换向前操作。
1、从启动页进入
测试进入第一个的界面即我们绑定的界面
public SplashActivityTest() throws ClassNotFoundException {
super(SplashActivity.class);
}
这里类名是不是这个类无所谓,但构造方法中调用你想要进入的类。
2、切换城市,遍历所有城市
由于城市列表是ListView或者RecyclerView,数据对我们是未知的,布局是可变的,我们不能采用直接clickOnText,或者clickOnView进入某个城市。
对于ListView或者RecyclerView解决办法有三种ÿ