在介绍robolectric之前,我简单总结一下写单元测试的优缺点吧。
首先,如果要写单元测试的话,代码量是很大的,各种组件的设置,模拟点击,模拟网络线程等等,在写完一个复杂的场景后,测试代码是挺多的。
其次,在GUI下,测试代码我个人认为没什么用的,测试代码只能告诉你界面是否出现这个view,但是这个view长什么样的,符不符合产品经理要求的,那是无法知道的。
然后还有一点就是,android四大组件的生命周期,测试代码是很难模拟生命周期的所有过程的,比如模拟按下home键,模拟返回键,也不见得能执行生命周期的所有方法。
在这种情况下,我们做测试代码有什么用呢?的确,在GUI的话,搞单元测试我认为是没有必要的,这完全可以交给测试组去做。自动测试代码应该是用来帮助我们编程人员判断运行过程中,功能模块是否有运行过我们的某部分的业务逻辑代码,并且能让我们迅速地了解到自己重构过什么,到底有无被执行,执行的情况是怎么样的。这和一些人认为直接机子测试看效果是不一样的,到了大型项目的话,单纯看效果基本上不能反映这个项目是否有问题了,如果公司有个庞大的测试组的话就可以免去写单元测试,出问题再修,不过如果对自己要求高一点的话,写单元测试在很多情况下可以反映某些隐藏问题,可以提高整个系统的代码质量。
现在来简单介绍一下robolectric:
robolectric是一款android单元测试的框架,现在应该是3.0版本了,官网可以直接下载。
android studio在app的test文件(可以自己新建,建在java下)下新建一个test文件,示例代码:
/**
* 检测网络数据处理
* @throws Exception
*/
public void initData() throws Exception{
/**
* onSuccess处理
*/
Http.doGet("url", new Deal() {
@Override
public void onError(CBase cBase, String s, Throwable throwable) throws Exception {
System.out.println("Throwable H.doGet onError :");
throwable.printStackTrace();
cdlTrue.countDown();
}
@Override
public void onSuccess(CBase cBase, HResp hResp, String s) throws Exception {
dealData(s);
cdlTrue.countDown();
}
});
while(cdlTrue.getCurrent()<1) {
ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
Thread.sleep(500);
}
cdlTrue.await();
}
上面是一段模拟网络线程的代码,
while(cdlTrue.getCurrent()<1) {
ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
Thread.sleep(500);
}
cdlTrue.await();
是指测试代码中需要运行线程,用5毫秒时间获取内容,获取内容结束,cdl进入等待状态。下次需要启动线程时,可以继续使用。
public void initModule(){
/**
* 测试打开某页面
*/
image.performClick();
expectedIntent = new Intent(MyActivity, AnotherActivity.class);
ShadowActivity openActivity = Shadows.shadowOf(myActivity);
actualIntent = openActivity .getNextStartedActivity();
Assert.assertEquals(expectedIntent, actualIntent);
/**
* 测试返回按钮
*/
backButton.performClick();
}