【JavaSE】JUnit单元测试
记录Java的JUnit单元测试学习。
测试分类
1.黑盒测试:不需要写代码,只关注程序结果。给输入值,看程序是否能够输出期望的值。
2.白盒测试:需要写代码。关注程序具体的执行流程。
为什么需要单元测试
在平时的开发当中,一个项目往往包含了大量的方法,可能有成千上万个。如何去保证这些方法产生的结果是我们想要的呢?当然了,最容易想到的一个方式,就是我们通过System.out来输出我们的结果,看看是不是满足我们的需求,但是项目中这些成千上万个方法,我们总不能在每一个方法中都去输出一遍嘛。这也太枯燥了。这时候用我们的单元测试框架junit就可以很好地解决这个问题。
junit如何解决这个问题的呢?答案在于内部提供了一个断言机制,他能够将我们预期的结果和实际的结果进行比对,判断出是否满足我们的期望。
什么是单元测试
java单元测试是最小的功能单元测试代码, 单元测试就是针对单个java方法的测试。java程序的最小功能单元是方法
JUnit单元测试
JUnit使用
属于白盒测试,JUnit是一个开源的java语言的单元测试框架专门针对java语言设计, 使用最广泛, JUnit是标准的单元测试架构。
使用步骤:
1.需要导入JUnit依赖环境
maven依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
这里提供一个JUnit4的依赖Jar包:
链接: https://pan.baidu.com/s/1rvlEFlys9N1RPU6s6Cdz2w . 提取码:1nz3
2. 定义一个测试类
规范建议:
* 测试类名:被测试的类名+Test 如:CalculatorTest
* 存放的包名:xxx.xxx.xx.test 如:cn.itcast.test
3.在测试类定义一个测试的方法:可以独立运行
规范建议:
1、每一个测试方法上使用@Test进行修饰
2、必须使用public void 进行修饰
3、不能携带参数,空参
4、测试代码和源代码在两个不同的项目路径下
5、测试类的包应该和被测试类保持一致
6、测试单元中的每个方法必须可以独立测试
被测试类例子程序:Calculator.java
package demo;
/**
* 计算器类
* @author Dong
*/
public class Calculator {
/**
* 加法
* @param a
* @param b
* @return
*/
public int add(int a, int b) {
return a + b;
}
/**
* 减法
* @param a
* @param b
* @return
*/
public int sub(int a, int b) {
return a - b;
}
}
测试类:CalculatorTest.java
package test;
import demo.Calculator;
import org.junit.*;
/**
* Calculator的测试类
*/
public class CalculatorTest {
/**
* 单个@Test方法执行前会创建新的CalculatorTest实例
* 执行测试类的构造函数:一般初始化非常耗时的资源, 例如创建数据库
* @throws Exception
*/
@BeforeClass
public static void setUpBeforeClass() throws Exception {
System.out.println("BeforeClass()");
}
/**
* 清理@BeforeClass创建的资源, 例如创建数据库
* @throws Exception
*/
@AfterClass
public static void tearDownAfterClass() throws Exception {
System.out.println("AfterClass()");
}
/**
* 初始化方法:
* 用于资源申请,所有测试方法执行之前都会先执行该方法
* 使用@Before注解
*/
@Before
public void init(){
System.out.println("init...");
}
/**
* 释放资源方法:一般用于释放一些资源
* 在所有测试方法执行完后,都会自动执行该方法。被测试的方法出现异常仍会执行
* 使用@After注解
*/
@After
public void close(){
System.out.println("close...");
}
/**
* 测试add方法
*/
@Test
public void testAdd(){
//1.创建计算器对象
Calculator c=new Calculator();
//2调用被测试的add方法
int results=c.add(1,2);
System.out.println("testAdd...");
//3.断言,我断言这个结果是3
//绿色:与断言的结果相同
//红色:与断言的结果不同
Assert.assertEquals(3,results);
}
/**
* 测试sub方法
*/
@Test
public void testSub(){
//1.创建计算器对象
Calculator c=new Calculator();
//2调用被测试的add方法
int results=c.sub(1,2);
System.out.println("testSub...");
//3.断言,我断言这个结果是3
//绿色:与断言的结果相同
//红色:与断言的结果不同
Assert.assertEquals(-1,results);
}
}
如果运行整个测试类, 运行结果如下:
如果运行单个@Test测试方法:
会用到的注解
对于@Test,里面有很多参数供我们去选择。我们来认识一下
1、@Test(expected=XX.class)
这个参数表示我们期望会出现什么异常,比如说在除法中,我们1/0会出现ArithmeticException异常,那这里@Test(expected=ArithmeticException.class)。在测试这个除法时候依然能够通过。
2、@Test(timeout=毫秒 )
这个参数表示如果测试方法在指定的timeout内没有完成,就会强制停止。
3、@Ignore
这个注解其实基本上不用,他的意思是所修饰的测试方法会被测试运行器忽略。
4、@RunWith
更改测试运行器。
欢迎点赞评论,指出不足,笔者由衷感谢!