目录
1.什么是JUnit?
JUnit是一个Java语言的单元测试框架。
它由Kent Beck和Erich Gamma建立,逐渐成为源于Kent Beck的sUnit的xUnit家族中最为成功的一个。
JUnit有它自己的JUnit扩展生态圈。多数Java的开发环境都已经集成了JUnit作为单元测试的工具。
2.如何使用JUnit?
可以通过添加Jar包,如果是Maven项目可以直接添加依赖,此外很多开源架构中已经集成了JUnit。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
3.实际使用
下面就是一个例子,开发工具 Intell IDEA:
3.1 创建一个用于测试的类
package main.java;
/**
* @ClassName Calculate
* @Author Bysen
* @Date 2020/8/3 22:04
* @Description TODO
* @Version 1.0
**/
public class Calculate {
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;
}
}
然后在类上 右键==》Go To==》Ttest,选择Creat new test 创建测试类。
3.2 生成的测试类
添加了部分测试代码
package main.java;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
public class CalculateTest {
@Test
public void addTest() {
Assert.assertEquals(6,new Calculate().add(3,3));
}
@Test
public void subtractTest() {
Assert.assertEquals(0,new Calculate().subtract(3,3));
}
@Test
public void multiplyTest() {
Assert.assertEquals(9,new Calculate().multiply(3,3));
}
@Test
public void divideTest() {
Assert.assertEquals(1,new Calculate().divide(3,3));
}
}
注意:
- 测试方法上必须使用@Test进行修饰
- 测试方法必须使用public void 进行修饰,不能带任何参数
- 测试类的包应该和被测试类的包保持一致
- 测试单元中的每一个方法必须是可以独立测试,测试方法不能有任何依赖
- 测试类使用Test作为类名的后缀(非必须)
- 测试方法使用test作为方法名前缀(非必须)
3.3 测试结果
此时可以运行该类,可以看到右下角显示的结果,测试全部通过:
当然实际的项目中不会有这么简单的方法,以及如此简单的测试用例,所以测试失败在所难免,下面就是两种测试失败的情况
4.失败的两种情况
4.1 Failure
一般来说是由单元测试使用断言的方法判断失败所引起的,这表示测试点发现了问题,实际结果与预期不一致。
例如:将addTest方法的预期值改为5,参数仍是3,3
4.1 Error
error是由代码异常引起的,他可以产生于测试代码本身的错误,也可能是由于被测试代码中隐藏的Bug引起。
例如:将divide方法参数改为3,0。由于0不能做除数,所以
注意:测试不是证明你是对的,而是证明你没有错。
5.执行流程
直接看测试结果:
5.1 BeforeClass
被该注解修饰的方法会在所有方法被调用前被执行,而且该方法是静态的,所以当测试类被加载后接着就运行它,而且在内存中只会存在一份实例,它比较适合加载配置文件。
5.2 Before
在每个测试方法开始前执行。
5.3 After
在每个测试方法结束后执行。
5.4 AfterClass
AfterClass 所修饰的方法通常用来对资源的清理,例如关闭数据库连接。
6.常用注解
-
@Test(expected = java.lang.ArithmeticException.class,timeout = 3000) expected用于异常处理,timeout用于超时处理
-
@Ignore 被该注解修饰的方法会被忽略
-
@RunWith() 用于更改测试运行器
7.测试套件
测试套件就是组织测试类一起运行的,写一个类作为测试套件的入口类,这个类不包含其他方法。
- 更改测试运行器Suite.class
- 将要测试的类作为数组传入到@Suite.suiteclass({})
例如:
@RunWith(Suite.class)
@Suite.SuiteClasses({CalculateTest.class})
8.参数化设置
- 更改默认的测试运行器为Parameterized.class
- 声明变量存放预期值和结果值
- 声明一个返回值为collection的公共静态方法,并使用@parameter进行修饰
- 为测试类声明一个带参数的公共构造方法,并在其中为之声明变量赋值
9.参考
https://baike.baidu.com/item/junit