Junit的使用和执行流程
昨天晚上躺床上,在慕课网上看了一个关于讲解《Junit4》的视频教程。发现讲解的还不错,以前在写JAVA的过程中,自己也没有用到过Junit,而是通过类似的System.out.println….这样的语句来进行测试和排除bug。
确实这样挺不方便的,在华为的2016年精英挑战赛中,体会的就比较深刻。因为提交的版本代码是不允许有其它任何多余的输出的,因此,在我们提交代码版本时,总是要将每个JAVA源文件中的System.out.println这样的语句注释掉,相当麻烦。
刚好在此时此刻有缘看到了这个讲解《Junit4》的视频,于是就决定学习一下,为以后进行好的测试作准备。
创建Junit test
当我们创建一个被测试类时,
如果我们想为这个被测试类创建一个测试类时,应该如何做呢?
有如下的三步(上图已标出):
1、载入JUnit爆包,具体步骤:右键项目—–>Build Path —–>Add Libraries…——>JUnit.
2、创建一个名为test的source folder,并在此目录下创建一个包。注意此包名应与被测试类所在的包的包名相同。
3、为被测试类创建测试类,具体步骤如下:右键被测试类—->new —>Junit Test Case —–>出现一个界面(在界面中更改source folder ,填写Name)—->Next —–>选中要测试的函数 —–>Finish.
在第3步中,你也可以不这么创建,可以直接在test目录下面新建Junit Test Case ,但是这样有一个缺点就是:当被测试类的函数很多时,你必须一个一个函数的敲出来,而上面的方法我们只需要选中我们要测试的类中的函数即可。
例如,我们有如下的被测试类。
public class Calcalate {
public int add(int a,int b){
return a + b;
}
public int subtract(int a,int b){
return a - b;
}
public int multiply(int a,int b){
return a * b;
}
public int divide(int a,int b){
return a / b;
}
}
测试类如下:
public class CalcalateTest2 {
@Test
public void testAdd() {
assertEquals(7, new Calcalate().add(3, 4));
}
@Test
public void testSubtract() {
assertEquals(2, new Calcalate().subtract(5, 3));
}
@Test
public void testMultiply() {
assertEquals(12, new Calcalate().multiply(3, 4));
}
@Test
public void testDivide() {
assertEquals(2,new Calcalate().divide(6, 3));
}
}
在测试中,我们可能会遇到两种错误,如下:
1、failure,这种错误一般是由单元测试所使用的断言方法判断失败所引起的,这仅仅表示测试点发现了问题,也就是说输出与我们的预期是不符合的。
2、error,这种错误是由代码的异常所引起的,它可以产生与测试代码本身,也可以是被测试代码中的一个隐藏的bug。
总的来说:测试代码不是证明你是对的,而是证明你没有错。
Junit的执行流程
在我们新建Junit Test Case的时候,在出现如下的界面中,选中红色圈中的4个函数。
之后我们添加一些打印输出语句。来观察Junit的执行流程。
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class CalculateTest3 {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
System.out.println("this is beforeClass...");
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
System.out.println("this is afterClass...");
}
@Before
public void setUp() throws Exception {
System.out.println("this is before...");
}
@After
public void tearDown() throws Exception {
System.out.println("this is after...");
}
@Test
public void test1() {
System.out.println("this is a test 1...");
}
@Test
public void test2() {
System.out.println("this is a test 2...");
}
}
/*
* 运行结果如下:
* this is beforeClass...
this is before...
this is a test 1...
this is after...
this is before...
this is a test 2...
this is after...
this is afterClass...
* */
从结果可以得到Junit运行流程如下
- 1、@BeforeClass修饰的方法会在所有方法被调用前被执行,而且由于此方法是静态的,因此当测试类被加载后接着就会运行它,且只会运行一次,内存中只会存在一份实例,比较适合于对配置文件的加载等。
- 2、@AfterClass修饰的方法会在所有方法被调用后被执行,也只会执行一次,比较适合用于资源的清理操作。如:关闭数据库的连接。
- 3、@Before和@After在每个@Test方法前后各执行一次。