前言:要做单元测试,首先要明白,什么是单元测试。关于单元测试的相关内容,这里就不多做介绍了,若要了解单元测试的相关内容,可以参见Android单元测试框架选择,其中对什么是单元测试,该用哪些框架进行测试,做了详细的说明。这里将直接采用JUnit4+Mockito+PowerMock+Robolectric的方式,对Android进行单元测试。
JUnit4
JUnit是java最基础的测试框架,主要作用就是进行断言。在不需要模拟方法或者类的行为的时候,可以直接使用JUnit进行基本的单元测试。也是为了代码覆盖率数据不可缺少的部分。
-
使用
在Studio中添加依赖,这里Studio已经为我们自动添加了依赖:
testCompile 'junit:junit:4.12'
并且已经为我们创建了测试文件目录:
测试Package
-
断言Assert类中主要方法如下
方法名 | 方法描述 |
---|---|
assertEquals | 断言传入的预期值与实际值是相等的 |
assertNotEquals | 断言传入的预期值与实际值是不相等的 |
assertArrayEquals | 断言传入的预期数组与实际数组是相等的 |
assertNull | 断言传入的对象为空 |
assertNotNull | 断言传入的对象不为空 |
assertTrue | 断言条件为真 |
assertFalse | 断言条件为假 |
assertSame | 断言两个对象引用同一个对象,相当于“==” |
assertNotSame | 断言两个对象引用不同的对象,相当于“!=” |
assertThat | 断言实际值是否满足指定的条件 |
-
JUnit中重要的注解:
注解名 | 含义 |
---|---|
@Test | 表示此方法为测试方法 |
@Before | 在每个测试方法前执行,可做初始化操作 |
@After | 在每个测试方法后执行,可做释放资源操作 |
@Ignore | 忽略的测试方法 |
@BeforeClass | 在类中所有方法前运行。此注解修饰的方法必须是static void |
@AfterClass | 在类中最后运行,同上。 |
@RunWith | 指定该测试类使用某个运行器 |
@Parameters | 指定测试类的测试数据集合 |
@Rule | 重新制定测试类中方法的行为 |
@FixMethodOrder | 指定测试类中方法的执行顺序 |
执行的顺序:@BeforeClass->@Before->@Test->@After->@AfterClass
JUnit用法
先来看一段源码:
/**
* 将带万的转换成数字字符串<br>
*
* @param data
* @return String<br>
*/
public static String getNumFromFormat(String data) {
String endData = "0";
if (data != null) {
if (data.contains("万")) {
endData = data.substring(0, data.length() - 1);
endData = String.valueOf(Float.parseFloat(endData) * 10000);
} else {
endData = data;
}
if (endData.contains(".")) {
endData = endData.substring(0, endData.indexOf("."));
}
}
return endData;
}
他的作用是把带单位的数量字符串转换成全部是数字的字符创。一般情况下,如果要测试该方法的输出是否正确,我们要在代码将输入参数写死,再在Android环境下运行,再去到对应界面,才能看到结果。但是用单元测试,就能很方便的验证方法的正确性了:
public class StringUtilTest {
@Before
public void setUp() {
System.out.println("测试开始");
}
@After
public void tearDown() {
System.out.println("测试结束");
}
@Test
public void getNumFromFormatTest() {
assertEquals("30000", StringUtil.getNumFromFormat("3万"));
}
}
测试结果
可以看到测试结果是pass,并且只用了4毫秒,可以说很快了。
-
参数化测试
这样其实还是挺麻烦的,因为每次测试一个方法都要去设置对应的很多值,需要不断修改入参,不断点击测试。为了解决这个问题,可以进行参数化测试。首先在测试类上添加注解@RunWith(Parameterized.class)
,在创建一个由@Parameters
注解的public static
方法,让返回一个对应的测试数据集合。最后创建构造方法,方法的参数顺序和类型与测试数据集合一一对应。
@RunWith(Parameterized.class)
public class StringUtilTest {
private String mExpected;
private String mActual;
/**
* 这里模拟了创建对象的过程,Juit会自动把@Parameters里面的数据集合,
* 按照顺序依次放入构造方法中
*/
public StringUtilTest(String expected, String actual) {
this.mExpected = expected;
this.mActual = actual;
}
@Parameterized.Parameters
public static Collection<Object[]> moneys() {
return Arrays.asList(new Object[][]{
{"660000", "66万"},
{"60000", "6万"},
{"6666", "6666"},
});
}
@Before
public void setUp() {
System.out.println("测试开始");
}
@After
public void tearDown() {
System.out.println("测试结束");
}
@Test
public void getNumFromFormatTest() {
assertEquals(mExpected, StringUtil.getNumFromFormat(mActual));
}
}
测试结果
以上就是一个简单的例子,可以看到这个Test方法,连续执行了3次,且全部和设定的预期值相同,全部pass。
参考文档:
JUnit单元测试框架的使用
网友评论