用Junit4怎么在Android中做测试?

前言

本篇文章是记录自己在项目开发中进行单元测试时,学习的junit4相关的一些知识,整理一下,以便以后查阅,如有不对的地方,还忘大家指正。

下文中提到的AS,是指Android studio

目录

  • 对单元测试的理解
  • 在android环境中创建单元测试类
  • 注解
  • 断言的使用
  • 参考

对单元测试的理解

在我看来单元测试,就是去验证每一小块代码的结果是否达到自己的预期。但是在验证前,要把条件准备妥当才能进行验证流程。我们举一个简单例子:

1
2
3
public int getSummation(int a,int b){
return a + b;
}

一个很简单的求和的方法,调用这个方法,假如传入的参数分别是12,我们预期的结果一定是3,如果返回的是非3的数字,那说明这个方法是有问题的。上面这个方法的单元测试按上面思路就这么写:

1
2
3
4
5
6
7
8
9
@Test
public void getSummation() {
//准备调用方法的条件
Summation summation = new Summation();
//调用方法
int result = summation.getSummation(1, 2);
//验证返回的结果等于3
assertEquals(3, result);
}

项目中的其他有返回的方法也是按这种思路来进行验证,有了上面这个思路,接下来看看在android中如何利用junit4来进行单元测试。

在android环境中创建单元测试类

在用AS创建的项目的时候,默认在build.gradle中已经引入了junit4

所以不用再另外添加依赖,那应该怎么写呢?我们还用上面的例子来举例:

1
2
3
4
5
6
7
public class Math {

public int getSummation(int a,int b){
return a + b;
}

}

想要测试getSummation方法,在AS

getSummation方法在Math类里面

  • 注解
1
2
3
4
5
6
7
8
9
10
11
/*
* @Test:将一个普通的方法修饰成为一个测试方法
* @Test(expected=XX.class) XX可以是异常类,在运行此测试方法时,会忽略掉异常类的错误,正常运行
* @Test(timeout=毫秒 ) 测试方法的超时时间,当被测试方法耗时超过timeout时长,会终止该方法的测试
* @BeforeClass:它会在所有的方法运行前被执行,static修饰
* @AfterClass:它会在所有的方法运行结束后被执行,static修饰
* @Before:会在每一个测试方法被运行前执行一次
* @After:会在每一个测试方法运行后被执行一次
* @Ignore:所修饰的测试方法会被测试运行器忽略
* @RunWith:可以更改测试运行器 org.junit.runner.Runner (会单独说)
*/
  • 断言

预测被测试方法的结果,可判断函数的正确性

assertArrayEquals(expecteds, actuals) 查看两个数组是否相等。
assertEquals(expected, actual) 查看两个对象是否相等。类似于字符串比较使用的equals()方法
assertNotEquals(first, second) 查看两个对象是否不相等。
assertNull(object) 查看对象是否为空。
assertNotNull(object) 查看对象是否不为空。
assertSame(expected, actual) 查看两个对象的引用是否相等。类似于使用“==”比较两个对象
assertNotSame(unexpected, actual) 查看两个对象的引用是否不相等。类似于使用“!=”比较两个对象
assertTrue(condition) 查看运行结果是否为true。
assertFalse(condition) 查看运行结果是否为false。
assertThat(actual, matcher) 查看实际值是否满足指定的条件
fail() 让测试失败

  • 测试套件(Runwith的使用)
    使用测试套件可以同时运行多个单元测试类,有以下几个特点:

    1、写一个作为测试套件的入口类,这个类里不包含其他的方法
    2、更改测试运行器Suite.class
    3、将要测试的类作为数组传入到Suite.SuiteClasses({})

代码示例如下:

1
2
3
4
5
6
7
8
9
/**
* @author gdy
* @date 2020-02-04
*/
@RunWith(Suite.class)
@Suite.SuiteClasses({ListTest.class,MathUtilTest.class,Test1.class,Test2.class})
public class SuiteTest {

}
  • 参数化设置(Runwith的使用)

设置参数可以使被测方法,一次运行测试多套参数,减少代码量,具体的步骤如下:

1.更改默认的测试运行器为RunWith(Parameterized.class)
2.声明变量来存放预期值 和结果值
3.声明一个返回值 为Collection的公共静态方法,并使用@Parameters进行修饰
4.为测试类声明一个带有参数的公共构造函数,并在其中为之声明变量赋值

代码示例:

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
@RunWith(Parameterized.class)
public class ParameterTest {

int expect = 0;
int a1 = 0;
int a2 = 0;
@Parameterized.Parameters
public static Collection<Object[]> methed(){
return Arrays.asList(new Object[][]{
{5,3,2},
{6,3,3}
});
}

public ParameterTest(int expect,int a1,int a2){
this.expect = expect;
this.a1 = a1;
this.a2 = a2;
}



@Test
public void testAdd(){
Assert.assertEquals(expect,new MathUtil().add(a1,a2));
}
}
-------------The End-------------