Android Studio 单元测试 新

之前写过一篇关于在Android Studio上做单元测试的文章,转载的CSDN上得一篇博文。现在更新一下这个方法。最近在看《第一行代码——Android》这本书,书里提到的用Eclipse为项目做单元测试的方法在AS1.2-AS1.3上不适用,所以在查阅了Android官网之后,找到了新方法。

1.打开要测试的AS项目。

 

2.假如要对下面的这个类中的addActivity方法做单元测试:

public class ActivityCollector {

public static List<Activity> activities = new ArrayList<Activity>();

public static void addActivity(Activity activity) {
    activities.add(activity);
}

public static void removeActivity(Activity activity) {
    activities.remove(activity);
}

public static void finishAll() {
    if(!activities.isEmpty()) {
        for(Activity activity : activities) {
            if(!activity.isFinishing()) {
                activity.finish();
            }
        }
    }
}

}
上面的类很简单,addActivity方法向List中添加元素,removeActivity方法用于删除元素,而finishAll方法则让List中所有的Activity都退出。

 

3.将光标移动到类名处(如ActivityCollector末尾),然后按下同时按下Alt和Enter键(OS X则同时按下option和return键),AS会自动弹出提示框,第一项是Create Test:android_studio_unit_test_dialog

 

 

4.选择第一项,为这个类创建测试。弹出了创建测试的对话框。我这里使用JUnit3,因为其他的我都没有安装相应的库。对话框的截图如下:

create_test_dialog

在Generate这一项中,有两个选项:setUp与tearDown。这是测试的两个可选方法。setUp方法会在测试之前被调用,可以在这个方法中申请资源,创建对象等等。tearDown方法会在测试完成之后被调用,用于释放资源等。可以根据需要选择是否添加这两个方法。

因为测试addActivity方法比较简单,无需这两个方法,这里就勾选了。

在Generate test methods for选项下面,可以看到ActivityCollector类的三个方法都呈现在下面了。因为要测试addActivity方法,所以就勾选addActivity方法。然后点击OK。

 

5.在弹出的对话框中选择这个测试类要存放的目录,我们保持默认即可,点击OK。

 

6.AS会自动创建测试类,命名为ActivityCollectorTest。我们在类中相应的测试方法中加入测试代码,最终的代码如下:

public class ActivityCollectorTest extends TestCase {

public void testAddActivity() throws Exception {
    assertEquals(0, ActivityCollector.activities.size());
    LoginActivity loginActivity = new LoginActivity();
    ActivityCollector.addActivity(loginActivity);
    assertEquals(1, ActivityCollector.activities.size());
}

}
因为我们只测试了ActivityCollector.addActivity方法,因此测试类中只有testAddActivity方法,测试类中的测试方法必须以test开头。

test方法中的4句是我们执行的单元测试代码,检测addActivity方法的基本功能是否正常。

 

7.添加完代码之后,在AS左侧的Project中选择测试类,右键单击,选择Run ‘ActivityCollectorTest’这个选项,截图如下:

test-class

 

8.之后选择要运行测试的设备,AVD或者真机测试。这一步就像运行正常的程序一样。

 

9.可以在AS的底部的Run选项卡中看到测试结果。如果是绿色进度条,就说明测试完成,并且全部通过。如果是红色进度条,就说明测试没通过。截图如下:

test-result

这里显式测试通过了。具体的信息可以自己去查看。

 

10.为了演示测试不通过,在testAddActivity方法最后再加入两条语句:

ActivityCollector.addActivity(loginActivity);
assertEquals(1, ActivityCollector.activities.size());

 

11. 我们向List中又添加了loginActivity这个实例,并且在下面的assert中判断List的元素只有1个。这是为了测试List是否具有排除重复元素的能力。如果List能排除重复元素,那么不管向List中添加多少重复元素,List只会保留一个。如果List没有这种能力,那么就会有多个。

当然,List是不具备排除重复元素的,这部分的逻辑需要我们自己添加。稍后会提到。

 

12.运行这个测试。在上一步的分析中可知,这个测试肯定会出错,错误截图如下:

test-result-error

可以看到红色的进度条,下面有红色的错误提示。第一句就提到 junit.framework.AssertionFailedError: expected:<1> but was:<2>

说明测试时期望assert的结果是1,但实际的结果是2。这就说明了List并没有排除重复元素的功能。此时可以修改addActivity方法,添加排除重复元素的逻辑。修改之后,ActivityCollector.addActivity方法的代码如下:

public static void addActivity(Activity activity) {
if(!activities.contains(activity)) {
activities.add(activity);
}
}

 

13.再次运行测试类,测试就会通过了。

 

参考文献

1.《第一行代码——Android》,13.5节。