Java单元测试Junit
引入
软件测试分类:黑盒测试与白盒测试
黑盒测试:又称功能测试,在软件的接口进行。之所以称黑盒测试因为在测试中不用知道程序的内部逻辑结构内部特性,就是黑盒看不到里面,配对结果,查看功能呢有没都实现且符合功能说明。
白盒测试:软件的白盒测试是对软件的过程性细节做细致的检查。这种方法是把测试对象看做一个打开的盒子,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序的所有逻辑路径进行测试,通过在不同点检查程序状态,确定实际状态是否与预期的状态一致。因此白盒测试又称为结构测试。
单元测试就属于白盒测试。
首先来看一下没有Junit单元测试的话怎样:
1、测试一定得走main方法,程序的入口,所以main方法格式不能写错。
2、要是再同一个main方法下测试的话得注释掉不需要的部分。
3、测试逻辑分开的话,需要定义多个测试类,麻烦。
4、业务代码和测试代码容易混淆。
package com.msb.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 class Test {
//这是一个main方法,是程序的入口:
public static void main(String[] args) {
//测试加法:
Calculator cal = new Calculator();
int result = cal.add(10, 20);
System.out.println(result);
//测试减法:
/* int result = cal.sub(30, 10);
System.out.println(result);*/
}
}
public class Test02 {
//这是一个main方法,是程序的入口:
public static void main(String[] args) {
Calculator cal = new Calculator();
//测试减法:
int result = cal.sub(30, 10);
System.out.println(result);
}
}
Junit的使用
【1】测试类的名字:****Test —>见名知意
【2】测试方法的定义–》这个方法可以独立运行,不依托于main方法
建议:
名字:testAdd() testSub() 见名知意
参数:无参
返回值:void
【3】测试方法定义完以后,不能直接就独立运行了,必须要在方法前加入一个注解: @Test
【4】导入Junit的依赖的环境:
@Test与Assert断言
@Test 测试
package P1.test;
import com.msb.calculator.Calculator;
import org.junit.Test;
public class CalculatorTest {
//测试add方法
@Test
public void testAdd(){
System.out.println("测试add方法");
Calculator cal = new Calculator();
int result = cal.add(10, 30);
System.out.println(result);
}
//测试sub方法
@Test
public void testSub(){
System.out.println("测试sub方法");
Calculator cal = new Calculator();
int result = cal.sub(10, 30);
System.out.println(result);
}
}
判断结果是:
绿色是正常
红色是异常
即使出现绿色效果,也不意味着你的测试就通过了,因为代码中逻辑也可能出现问题,这种情况怎么解决呢?
这里须接受一下Assert断言。
断言方法 | 描述 |
---|---|
assertNull(java.lang.Object object) | 检查对象是否为空 |
assertNotNull(java.lang.Object object) | 检查对象是否不为空 |
assertEquals(long expected, long actual) | 验证expected和actual相同。注:对于数组则检查的是引用而不是数组的内容。 |
assertEquals(double expected, double actual, double delta) | 验证float或者double匹配。 大家知道计算机表示浮点型数据都有一定的偏差,所以哪怕理论上他们是相等的,但是用计算机表示出来则可能不是,所以这里运行传入一个偏差值。如果两个数的差异在这个偏差值之内,则测试通过,否者测试失败。 |
assertFalse(boolean condition) | 验证条件是否为假 |
assertTrue(boolean condition) | 验证条件是否为真 |
assertSame(java.lang.Object expected, java.lang.Object actual) | 验证expected和actual是同一个对象 |
assertNotSame(java.lang.Object unexpected, java.lang.Object actual) | 验证expected和actual不是是同一个对象 |
加上断言后的测试代码
package com.msb.test;
import com.msb.calculator.Calculator;
import org.junit.Assert;
import org.junit.Test;
public class CalculatorTest {
//测试add方法
@Test
public void testAdd(){
System.out.println("测试add方法");
Calculator cal = new Calculator();
int result = cal.add(10, 30);
//System.out.println(result);--》程序的运行结果可以不关注
//加入断言:预测一下结果,判断一下我预测的结果和 实际的结果是否一致:
Assert.assertEquals(40,result);//第一个参数:预测结果 第二个参数:实际结果
}
//测试sub方法
@Test
public void testSub(){
System.out.println("测试sub方法");
Calculator cal = new Calculator();
int result = cal.sub(10, 30);
System.out.println(result);
}
}
断言不是预期值是显示如下: