JUnit 是一个 Java 编程语言的单元测试框架。
环境配置
创建maven项目,导入Junit配置
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.9.2</version>
<scope>test</scope>
</dependency>
JUnit的一些注意事项
测试方法必须使用 @Test 修饰
测试方法必须使用 public void 进行修饰
一般使用单元测试会新建一个 test 目录存放测试代码,在生产部署的时候只需要将 test 目录下代码删除即可
测试代码的包应该和被测试代码包结构保持一致
测试单元中的每个方法必须可以独立测试,方法间不能有任何依赖
测试类一般使用 Test 作为类名的后缀
测试方法使一般用 test 作为方法名的前缀
注解
@Test:将一个普通方法修饰成一个测试方法 这个方法不能是静态方法
2、@BeforeClass: 会在所有的方法执行前执行 (只会执行一次,而且是第一个运行)被这个注解修饰的方法是static方法
3、@AfterClass:会在所有的方法执行之后执行(只会执行一次,而且是最后一个运行)被这个注解修饰的方法是static方法
4、@Before:会在每一个测试方法被运行前执行一次 这个方法不能是静态方法
5、@After:会在每一个测试方法运行后被执行一次 这个方法不能是静态方法
6、@Ignore:所修饰的测试方法会被测试运行器忽略 可修饰静态和非静态方法
其中,在高版本的junit(junit5)中 @BeforeClass和@AfterClass注解替换为了@BeforeAll和@AfterAll注解,@Before和@After注解替换为@BeforeEach和@AfterEach注解
断言
序号 | 方法和描述 |
1 | void assertEquals(boolean expected, boolean actual) 检查两个变量或者等式是否相等 |
2 | void assertTrue(boolean condition) 检查条件为真 |
3 | void assertFalse(boolean condition) 检查条件为假 |
4 | void assertNotNull(Object object) 检查对象不为空 |
5 | void assertNull(Object object) 检查对象为空 |
6 | void assertSame(Object expected, Object actual) assertSame() 方法检查两个相关对象是否指向同一个对象 |
7 | void assertNotSame(Object expected, Object actual) assertNotSame() 方法检查两个相关对象是否不指向同一个对象 |
8 | void assertArrayEquals(expectedArray, resultArray) assertArrayEquals() 方法检查两个数组是否相等 |
Junit各种注解的执行顺序
public class demo1Test {
@BeforeAll//注解的静态方法最先执行 且执行一次
public static void print() {
System.out.println("@BeforeAll注解执行");
}
@AfterAll//注解的静态方法最后执行 且执行一次
public static void print1() {
System.out.println("@AfterAll注解执行");
}
@BeforeEach//注解的方法 在其他方法执行前执行一次
public void print2() {
System.out.println("@BeforeEach注解执行");
}
@AfterEach
public void print3() {
System.out.println("@AfterEach注解执行");
}
@Test
public void print4() {
System.out.println("@Test注解执行");
}
}
@order注解
控制方法的执行顺序
@TestMethodOrder(MethodOrderer.OrderAnnotation.class) //引入方法排序 这个类的方法就可以使用Order注解进行排序,根据排序执行
public class OrderTest {
@Test
@Order(1)//第一个执行
void print(){
System.out.println("aaa");
}
@Test
@Order(2)//第二个执行
void print1(){
System.out.println("bbb");
}
@Test
@Order(3)//第三个执行
void print2(){
System.out.println("ccc");
}
}
测试套件
在实际项目中,随着项目进度的开展,单元测试类会越来越多,可是直到现在我们还只会一个一个的单独运行测试类,这在实际项目实践中肯定是不可行的。为了解决这个问题,JUnit 提供了一种批量运行测试类的方法,叫做测试套件。
创建一个空类作为测试套件的入口
使用@Suite注解修饰类,表示这个类是一个套件
@SelectClasses注解选择加入套件的类
保证这个空类使用 public 修饰,而且存在公开的不带有任何参数的构造函数
@Suite//表示这个类是一个套件
@SelectClasses({demo1Test.class,demoTest.class})
public class suiteTest {
}
运行这个类,可以同时执行选择的类
除了选择类之外,还可以选择包加入到套件中
使用@SelectPackages()注解的前提是:包里面的类要以Test结尾,所有方法都要加入@Test注解
参数化测试
参数化测试允许开发人员使用不同的值反复运行同一个测试。
@ParameterizedTest注解 标识方法类型是参数化
@ValueSource注解 标识参数来源 其中的类型有int,byte,String,short,long,char等
@ValueSource注解是设置单参数的,使用@CsvSource注解设置多参数,默认分割参数是逗号,delimiterString参数可以设置分隔符
@org.junit.jupiter.params.ParameterizedTest
@CsvSource(value = {"张三-10","李四-19"},delimiterString = "-") //设置分隔符是-
public void setNameAndAge(String name, int age) {
System.out.println(name + age);
}
如果参数内容过多,可以使用文件保存传入数据
使用@CsvFileSource()注解
在当前项目的resources文件夹下创建.csv文件
在@CsvFileSource注解中设置文件路径
@org.junit.jupiter.params.ParameterizedTest
@CsvFileSource(resources = "/my.csv",delimiterString = "-")
public void setNameAndAge(String name, int age) {
System.out.println(name + age);
}
如果不是resources文件夹下的文件,就不使用resources参数设置,要使用files参数设置
@org.junit.jupiter.params.ParameterizedTest
@CsvFileSource(files = "C:\\Users\\30283\\Desktop\\demo.csv",delimiterString = "-")
public void setNameAndAge(String name, int age) {
System.out.println(name + age);
}
动态参数
方法的参数是不固定的,如果参数是由另外一个方法返回,就要使用@MethodSource(方法名)注解
提供动态参数的方法必须能够生成一个由参数集组成的流。这里所说的“流”是指所有可以被JUnit转换为Stream类型的任何类型,如Stream, DoubleStream, LongStream, IntStream, Collection, Iterator, Iterable,对象数组,原始类型数组等等。流中的元素也可以作为Arguments类的实例、对象数组、单个值(如果参数化测试方法只接受单个参数)等提供给参数化测试方法。
1、处理单参数
//这个方法提供传入的参数 返回的结果可以是Stream流
private static Stream<String> get() {
return Stream.of("张三","李四","王五");
}
@org.junit.jupiter.params.ParameterizedTest
@MethodSource("get") //get方法返回的结果 将作为print的参数传入
public void print(String num){
System.out.println(num);
}
2、处理多参数
这是 提供参数的方法必须返回以Arguments类型的对象为元素的流
//这个方法提供传入的参数 返回的结果可以是Stream流 arguments对象存储的是实际 传递给函数的参数,
private static Stream<Arguments> get() {
return Stream.of(Arguments.arguments("张三",13), Arguments.arguments("李四",10));
}
@org.junit.jupiter.params.ParameterizedTest
@MethodSource(value = {"get"}) //get方法返回的结果 将作为print的参数传入
public void print(String num,int age){
System.out.println(num+age);
}