1. Junit介绍
Junit是一个成熟的单元测试框架,单元测试是一个对单一实体(类或方法)的测试。
2. 使用Junit
2.1 使用@Test
我们新建一个Calculator类,其中有加、减、乘、除四个成员方法:
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public int sub(int a, int b) {
return a -b;
}
public int mul(int a, int b) {
return a * b;
}
public int div(int a, int b) {
return a/b;
}
}
我们不知道Calculator类中的四个方法是否都是正确的,我们可以写一个Junit测试类来测试一下。一般Junit测试类的类名就是所要测试的类的类名加上"Test"
,因为我们要测试的是Calculator类,所以,我们的测试类的名字就叫做CalculatorTest,同时,还需要注意的是,在项目中,测试类通常都在XXX.XXX.test这个目录下。
除此之外,一个测试类通常和一个类相对应,且测试类中一般会有多个测试方法,每一个方法都对应了类中的方法,测试方法名一般为test+要测试的方法名的首字母大写
。
package junitDemo;
import org.junit.Test;
public class CalculatorTest {
//使用Test标注来表示这是一个测试方法,
//写完@Test后,通常编辑器会询问我们是否
//导入Junit或将Junit加入到类路径中
@Test
public void testAdd() {
Calculator calculator = new Calculator();
int result = calculator.add(1, 1);
System.out.println(result);
}
}
好了,我们已近写好了一个测试类,其中有一个测试方法,如果你用的编辑器是IDEA,这个测试方法的左边会有一个绿色的运行箭头,点击这个绿色的箭头就可以运行这个测试方法了。如果你用的是Eclipse,双击鼠标左键选中这个测试方法名,右击鼠标,在弹出的窗口中选择Run As,再选择Junit Test,就可以运行这个测试方法了。如果这个方法执行没有问题的话,Junit会显示绿色。
2.2 使用assert类
在使用@Test
后,你会发现即使运行结果出现错误,Junit也会显示为绿色,这是因为Junit只会判断测试方法是否能执行成功,而不会去帮你检查运行结果的正确性,要想达到检查运行结果的作用,就需要使用assert
类了。
我们将Calculator类中的sub()方法改为如下:
public int sub(int a, int b) {
return a - b + 1;
}
很明显,这是错误的,我们将结果多加了一个1。
在CalculatorTest测试类中创建一个测试方法testSub():
@Test
public void testSub() {
Calculator calculator = new Calculator();
int result = calculator.sub(1, 1);
//可以直接使用assertEquals()方法而不需要创建Assert对象
assertEquals(0, result);
}
注意:
assertEquals()方法有许多重载,我们可以根据自己的需求选择合适的重载方法
运行这个测试方法,你会发现Junit显示为红色,也就是出现了错误,错误信息:
java.lang.AssertionError: expected:<0> but was:<1>
这是一个断言错误,它告诉我们,我们期望的结果是0,但是这个测试方法运行的结果却是1,也就是检测到我们的运行结果不正确了。你可以将Calculator类中的add()方法改正后再来测试一下,你会发现Junit会显示为绿色,也就是测试结果正确。
2.3 使用@Before和@After
@Before注解可以指定在我们测试方法执行之前需要执行的方法,通常用于获取数据库连接或打印日志;同理,@Before注解可以指定在测试方法执行之后需要执行的方法,通常用于释放资源。
下面是一个例子:
@Before
public void getConnect() {
System.out.println("获取了一个连接");
}
@Test
public void testMul() {
Calculator calculator = new Calculator();
int result = calculator.mul(1, 2);
assertEquals(2, result);
}
@After
public void releaseConnect() {
System.out.println("释放了连接");
}
Junit测试结果正确,且在控制台输出了:
获取了一个连接
释放了连接
Junit会在testMul()方法执行之前执行本方法之前被@Before标注的方法,在testMul()方法执行之后,会执行本方法之后被@After标注的方法,这就是Junit中的@Before和@After的作用了。