Dream Maker

因上努力,果上随缘

热爱自然,喜欢动物,渴望旅行,积攒幸福的宅男


Android测试之旅(一)

引言


随着移动互联网的发展,越来越多的开发者投入到了Android的开发怀抱中。日益增多的app晃得我们眼花缭乱。各种无法预料的崩溃让开发者投入到一天又一天无奈而又漫长的加班中。最近公司让我研究Android测试相关方面的内容,之前待过的一些公司基本都是快速开发,没有什么时间让你来搞测试这块的内容,自己虽然一直很感兴趣,但是始终没有去做过一些深入的了解和调研,正好趁着这次机会,好好的整理整理。Android应用层和我们接触最多的还是java语言,说到java语言,我们就不得不提到JUnit测试框架。

JUnit


现在最新的JUnit版本是4.12版本。我们的示例也是在此基础上进行讲解的。因为我们在开发中大部分的应用逻辑都会用java来写,而且现在市面上种种的框架都会把逻辑层和展示层给分离出来,JUnit这时候就可以发挥出自己的优势出来。当然,JUnit主要还是我们开发者用来自测代码的。跟上时代的潮流,我就用Android Studio来进行编写。

文件配置

下面来看下JUnit的文件夹位置。
文件位置
千万不要忘了在build.gradle文件中引入JUnit的依赖。

1
testCompile 'junit:junit:4.12'

注解说明

我们继续来看JUnit的注解说明。

@Before
该方法在每次测试方法调用前都会调用

@Test
说明了该方法需要测试

@BeforeClass
该方法在所有测试方法之前调用,只会被调用一次

@After
该方法在每次测试方法调用后都会调用

@AfterClass
该方法在所有测试方法之后调用,只会被调用一次

@Ignore
忽略该方法

为了形象的展示各个方法的调用顺序,我们来写个代码测试一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class JUnitLifeCycle {

@Before
public void init(){
System.out.println("------method init called------");
}

@BeforeClass
public static void prepareDataForTest(){
System.out.println("------method prepareDataForTest called------\n");
}

@Test
public void test1(){
System.out.println("------method test1 called------");
}

@Test
public void test2() {
System.out.println("------method test2 called------");
}

@Test
public void test3() {
System.out.println("------method test3 called------");
}

@After
public void clearDataForTest(){
System.out.println("------method clearDataForTest called------");
}

@AfterClass
public static void finish(){
System.out.println("------method finish called------");
}
}

代码很简单,就是将这几个不同的注解对应的方法进行打印,看下打印结果:
方法调用顺序
这样就看的很清楚了。知道了这个顺序之后,我们就可以很方便的编写我们的测试用例了。当我们写了多个测试用例,可以右击文件夹直接运行文件夹下所有用例。但是,假如我们已经写好了多个测试用例,每次只需要测试其中的三四个,而不需要把所有的测试用例都跑一遍,这该怎么办呢?不用担心,JUnit已经为我们提供了方法。假设有三个写好的测试用例,我们只需要调用其中的两个,就可以这么做:

1
2
3
@Suite.SuiteClasses({FirstTest.class,ThirdTest.class})
public class SpecializedTests {
}

我们只需运行SpecializedTests这个文件就可以将我们指定的测试用例进行测试了。

测试内容

知道了一些基本的注解用途之后,下面到了关键的部分了。我们该如何测试?Assert这个类解决了我们的问题。再来看一个小例子:

1
2
3
4
5
6
7
@Test
public void testFirstTestPrint(){
FirstTest tester= new FirstTest();
String expected = "Hello JUnit";
String result = tester.print();
assertEquals(expected,result);
}

这里写的比较简单,大体上的意思就是我们在方法中先定义一个期望值,然后调用需要测试的方法,这里就是测试FirstTest类中的print方法。当我们遇到异常捕获的方法该如何测试呢?不用担心,我们这里继续来举个小例子。先看需要测试的方法:

1
2
3
4
5
6
7
public String printWithDanger(int i){
if (i == 0){
throw new NullPointerException();
}else{
return "Hello JUnit";
}
}

正常的测试用例就和上面的一样,这里不再阐述,接下来我们来测试这个异常的情况,继续看代码:

1
2
3
4
5
6
7
@Test(expected = NullPointerException.class)
public void testException(){
FirstUtil tester= new FirstUtil();
String expected = "Hello JUnit";
String result = tester.printWithDanger(0);
assertEquals(expected,result);
}

如果这样写,那么测试方法也是绿条完美通过。但是有的时候当你不确定是什么异常时,希望打出该异常的信息,就可以这样来写:

1
2
3
4
5
6
7
8
9
10
11
12
@Test
public void testException(){
FirstUtil tester= new FirstUtil();
String expected = "Hello JUnit";
String result = "";
try {
result = tester.printWithDanger(0);
}catch (Exception e){
fail("exception is:"+e.getMessage());
}
assertEquals(expected,result);
}

这样就可以帮你打印出错误具体信息,如下所示:
错误信息展示

未完待续…

今天就简单的介绍到这里,下次博主会介绍一些JUnit方面一些更好玩的注解和多样的方式。希望各位做个好梦,晚安。