最近重视单元测试,本系列文章为完整的流程记录,如有错误,欢迎指正
一、准备一个被测试类
package com.mango.junittestsample;
/**
* Created by mango on 2018/4/3.
* 基础使用
*/
public class Sample1 {
public String getContent() {
return "Hello world";
}
public int add() {
return 1 + 1;
}
}
二、生成一个对应的测试类
操作步骤如下图
结果生成的测试类代码如下
public class Sample1Test {
private FileWriter _writer;
private Sample1 _sample1;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
System.out.println("测试类加载完毕会调用@BeforeClass 标注的方法一次,用以初始化代价较为昂贵的资源");
}
@AfterClass
public static void tearDownAfterClass() {
System.out.println("测试类测试完毕会调用@AfterClass 标注的方法一次,释放由@BeforeClass创建的资源");
}
@Before
public void setUp() throws Exception {
System.out.println("@Before 标注的方法每个测试方法执行前会调用一次,用以控制每个测试方法间彼此隔离,不会相互影响");
String path = "/Users/mango/Desktop/a.txt";
File file = new File(path);
if (!file.exists()) {
file.createNewFile();
}
_writer = new FileWriter(file);
_sample1 = new Sample1();
}
@After
public void tearDown() throws Exception {
System.out.println("@After 标注的方法每个测试方法执行后会调用一次,用以清理@Before 标注的方法中创建的资源");
_writer.close();
}
@Test
public void getContent() throws Exception {
_writer.write(_sample1.getContent());
}
@Test
public void add() throws Exception {
assertEquals(2, _sample1.add());
}
}
三、标注说明以及执行顺序
- @BeforeClass 测试类加载完毕会调用@BeforeClass 标注的方法一次,用以初始化代价较为昂贵的资源
- @Before 每个测试方法执行前会调用一次,用以控制每个测试方法间彼此隔离,不会相互影响
- @After 每个测试方法执行后会调用一次,用以清理@Before 标注的方法中创建的资源
- @AfterClass 测试类测试完毕会调用@AfterClass 标注的方法一次,释放由@BeforeClass创建的资源
一次测试的执行完整的顺序是 @BeforeClass -> @Before -> @After -> @Before -> @After -> @AfterClass。是的@BeforeClass和@AfterClass只会执行一次,@before 和@After 会在每个测试方法调用前和后依次执行一次。
这点可以通过查看控制台输出来验证,如下图
四、执行测试方法
-
执行单个测试方法的操作如下图,点击方法左侧的绿色三角箭头,选择 run 即可
-
执行整个测试类的所有测试方法如下图,点击类名左侧绿色三角箭头,选择 run 即可
五、查看测试结果
-
查看通过的结果,如下图
-
查看出错的结果,如下图
-
下载测试报告,如下图
六、常用诊断辅助 API
我们如何判断一个方法的实现是否正确?大多数情况下是通过输入参数和输出结果来判断的,这个时候我们可以通过断言这个API,常用的几个断言如下
//第一类:判断两个值是否相等
static public void assertEquals(long expected, long actual);
static public void assertEquals(Object expected, Object actual);
static public void assertEquals(double expected, double actual, double delta);//delta 表示允许的误差
//第一类:判断两个值是否不相等
static public void assertNotEquals(long expected, long actual);
static public void assertNotEquals(Object expected, Object actual);
static public void assertNotEquals(double expected, double actual, double delta);//delta 表示允许的误差
//第三类:判断结果是否为真或者为假
static public void assertFalse(boolean condition);
static public void assertTrue(boolean condition);
//第四类:判断对象是否为空
static public void assertNull(Object object);
static public void assertNotNull(Object object);
//第五类:判断对象是否是同一个对象
static public void assertSame(Object expected, Object actual);
当然了,上面举例的断言 API 只是几个简单的判断规则,还有一个更加强大的匹配器断言,可以看Android 单元测试第六篇(Hamcrest 匹配器)