android robolectric 单元测试的简单使用

在介绍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();
    }

猜你喜欢

转载自blog.csdn.net/ww_bin/article/details/49391211