Junit单元测试
在我们编写完一个类后,往往需要对这个类进行测试,在编程中测试有两种:黑盒测试和白盒测试
黑盒测试:
我们将要被测试的代码看做是一个黑盒子,我们不知道这个黑盒子中的具体实现,我们只需要给这个黑盒传递指定的参数,然后看运行结果是否和我们预期的结果是否一致,根据运行结果判断这个类的编写是否达到了预期的效果
白盒测试:
我们将要被测试的代码看做是一个白盒子,我们知道这个白盒子中的具体实现,给这个白盒子传递一个参数,我们可以了解到这个参数在白盒子中是被如何处理、这个白盒子中的代码逻辑、实现算法以及代码效率高不高等等东西,之后看运行结果是否和我们预期的结果一致,根据运行结果判断这个类的编写是否达到了我们预期的效果
而今天要讲解的Junit单元测试实际上是白盒测试的一种
主方法测试
在我们以前的代码编写中,如果编写了一个类,需要对这个类中的方法进行测试的话,我们会在一个主方法中对这个类进行实例化,然后调用这个实例中的成员方法处理一些参数,我们根据运行结果判断类是否编写成功
我们现在IDEA中创建一个新项目
在src
目录下创建com.westos.maintest
目录
在maintest
目录下创建一个工具类Calculator
,在这个类中定义两个方法
package com.westos.maintest;
public class Calculator {
//运算加法
public int add(int a, int b){
return a + b;
}
//减法运算
public int sub(int a, int b){
return a - b;
}
}
现在对这个工具类中的两个方法进行测试,在maintest
目录下新建一个CalculatorTest
类
package com.westos.maintest;
public class CalculatorTest {
public static void main(String[] args) {
//对工具类进行实例化
Calculator c = new Calculator();
//调用工具类中的方法
int sum = c.add(1, 2);
//打印运行结果
System.out.println(sum);
}
}
将这个测试类编写完成后,运行程序
运行结果为3,说明工具类中的add
方法正确,接下来我们对sub
方法进行测试
为了防止add
方法对sub
方法产生干扰,我们对add
方法进行注释,在测试类的主方法中保证每次只测试一个方法,运行程序
运行结果为0,说明sub
方法正确
上面的操作就是我们以前对类进行测试时的步骤,这种测试方法也非常便于我们理解,但是每次测试一个新的方法时,为了防止其他方法对要测试的方法产生干扰,都需要将之前的测试代码进行删除或者注释比较麻烦,我们需要一个单独的测试模块,来和我们的项目代码进行区分,这里引入了Junit单元测试
Junit单元测试
Junit单元测试就是单独创建一个测试类,在这个测试类中可以定义多个方法,每个方法可以用于测试我们需要测试的类中的一个方法,并且测试类中的每个方法都可以独立运行、互不干扰,下面说明Junit单元测试的规则:
-
定义一个测试类(测试用例)
- 测试类名:
被测试的类名 + Test
- 测试列所在的包名:
xxx.xxx.test
- 测试类名:
-
定义测试方法:可以独立运行
- 方法名:
test + 测试的方法名
- 返回值
void
- 空参
- 方法名:
-
给测试方法添加
@Test
-
导入Junit依赖环境
接下来对Junit单元测试的规则进行讲解:
- 测试类有时也可以称为测试用例
- 测试类名、测试类所在的包名以及方法名之所以这样命名是为了尽可能遵守命名规则,方便程序员区分
- 返回值为
void
是因为测试类中的每个方法都是独立的、互不干扰的,我们可以在控制台看到每个方法的运行结果,不需要将输出结果返回,返回了也无法接受这个返回值 - 空参是因为测试类中的每个方法的任务是将被测试类的实例的一个方法进行调用,被测试的方法需要的参数可以在编写测试方法时一并给出,而测试方法自己本身不需要参数
- 添加
@Test
是因为Java中main
方法是程序执行的入口,测试类中包含了许多的测试方法,而方法不能自己执行,要想让这些方法能够独立执行,就必须添加注解@Test
- 在添加
@Test
注解时会报错,是因为我们没有导入Junit单元测试的依赖环境,导入即可
在之前项目的基础上,我们创建一个和maintest
同级的目录test
,在test
目录下创建CalculatorTest
类
现在按照上面的规则开始编写测试方法
package com.westos.test;
import org.junit.Test;
public class CalculatorTest {
@Test
public void testadd(){
}
}
测试方法基本格式编写完成,接下来编写方法的内容
package com.westos.test;
import com.westos.maintest.Calculator;
import org.junit.Test;
public class CalculatorTest {
@Test
public void testadd(){
Calculator c = new Calculator();
c.add(1, 2);
}
}
点击每个测试方法前的绿色播放键,运行这个测试方法
可以看到结果为3,表示add方法正确
向测试类中添加
@Test
public void testsub(){
Calculator c = new Calculator();
int s = c.sub(0, 0);
System.out.println(s);
}
下面是运行结果:
运行结果为0说明sub方法正确
当然在测试add和sub方法时我们除了可以看到处理在控制台能够看到运行结果外,我们还可以看到下图所指的一些绿对勾
绿箭头说明测试顺利完成,但仅仅是测试的整个过程没有出现错误,并不能说明这个工具类中被测试方法能够得到我们期望的结果,不能说明我们的被测试方法逻辑没有问题
我们对sub方法进行一些小修改:
//减法运算
public int sub(int a, int b){
a = a / 0;
return a - b;
}
运行测试方法testsub
报红,说明测试过程出现错误,如果想将报红、报绿和被测试方法的正确性联系起来,(当然正确性是指方法逻辑没有问题,根据给定的参数可以得到期望的结果),就需要使用Assert
类,这就是“断言”,我们可以将程序运行的结果和期望的结果对比,如果一致,就报绿;如果不一致,就报红
我们对testsub方法做些修改(工具类的sub方法中删除了那条错误语句)
@Test
public void testsub(){
Calculator c = new Calculator();
int s = c.sub(0, 0);
System.out.println(s);
Assert.assertEquals(0, 0);
}
运行这个方法
结果为0,报绿,说明被测试方法的运行结果和期望值一样,被测试方法正确
@Before
和@After
在使用Junit单元测试时,除了@Test注解,还有@Before和@After注解
@Before修饰的方法在测试方法执行前自动执行
@After修饰的方法在测试方法执行后自动执行
这里不做过多讲解,只进行一个演示,我们对测试类中的sub方法进行修改
//减法运算
public int sub(int a, int b){
a = a / 0;
return a - b;
}
在测试类的testsub方法中添加
System.out.println("我被执行了");
在测试类中添加
@Before
public void hello(){
System.out.println("测试你好");
}
@After
public void bye(){
System.out.println("再见");
}
运行testsub方法
可以看到虽然被测试方法有错误,但不音响@Before和@After所修饰的方法的执行
关于Junit单元测试的知识就讲解这么多