如果你对idea如何创建Junit5测试项目不了解可以看这篇博客
测试过程
基本测试
- 给测试方法添加注解
@Test
缺点
每个方法只能测,一个用例要测试多个用例需要添加很多方法,导致代码非常臃肿,不推荐使用
package com.xjtu;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
class CalculatorTest {
Calculator cal;
@BeforeEach
void setUp() {
cal = new Calculator();
}
@AfterEach
void tearDown() {
cal = null;
}
@Test
void add1() {
assertEquals(30, cal.add(10, 20));
}
@Test
void add2() {
assertEquals(0, cal.add(0, 0));
}
@Test
void add3() {
assertEquals(-10, cal.add(10, -20));
}
@Test
void sub1() {
assertEquals(-10, cal.sub(10, 20));
}
@Test
void sub2() {
assertEquals(10, cal.sub(20, 10));
}
@Test
void sub3() {
assertEquals(-20, cal.sub(0, 20));
}
@Test
void multiply1() {
assertEquals(20, cal.multiply(1, 20));
}
@Test
void multiply2() {
assertEquals(-20, cal.multiply(1, -20));
}
@Test
void multiply3() {
assertEquals(40, cal.multiply(-2, -20));
}
@Test
void division1() {
assertEquals(10, cal.division(20, 2));
}
@Test
void division2() {
assertEquals(-10, cal.division(20, -2));
}
@Test
void division3() {
assertEquals(0, cal.division(0, 2));
}
}
参数化测试
- 给测试方法添加注解
@ParameterizedTest
- 使用注解
@xSource
来制定测试数据,其中:x可能为Value
、Enum
、Method
、Csv
、CsvFile
、Arguments
等
为每个测试方法添加自己特有的测试数据
package com.xjtu;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.aggregator.ArgumentsAccessor;
import org.junit.jupiter.params.provider.CsvSource;
import static org.junit.jupiter.api.Assertions.assertEquals;
class CalculatorParameterizedTest {
Calculator cal = new Calculator();
@BeforeEach
void setUp() {
}
@AfterEach
void tearDown() {
}
@ParameterizedTest
@CsvSource({"10,20,30", "0,0,0", "10,-20,-10"})
void add(ArgumentsAccessor args) {
assertEquals(args.getInteger(2), cal.add(args.getInteger(0), args.getInteger(1)));
}
@ParameterizedTest
@CsvSource({"10,20,-10", "20,10,10", "0,20,-20"})
void sub(ArgumentsAccessor args) {
assertEquals(args.getInteger(2), cal.sub(args.getInteger(0), args.getInteger(1)));
}
@ParameterizedTest
@CsvSource({"1,20,20", "1,-20,-20", "-2,-20,40"})
void multiply(ArgumentsAccessor args) {
assertEquals(args.getInteger(2), cal.multiply(args.getInteger(0), args.getInteger(1)));
}
@ParameterizedTest
@CsvSource({"20,2,10", "20,-2,-10", "0,2,0"})
void division(ArgumentsAccessor args) {
assertEquals(args.getInteger(2), cal.division(args.getInteger(0), args.getInteger(1)));
}
}
使用套件
在实际项目中,随着项目进度的开展,单元测试类会越来越多,可是直到现在我们还只会一个一个的单独运行测试类,这在实际项目实践中肯定是不可行的。为了解决这个问题,JUnit 提供了一种批量运行测试类的方法,叫做测试套件。
这样,每次需要验证系统功能正确性时,只执行一个或几个测试套件便可以了。
由于使用的是Junit5,再网上找了很久没有找到套件的使用方法,经过一篇博客的提示发现可以直接右键点击包名,然后选择run Tests in
thisPackage,即可执行该包中的全部测试类
最终执行结果如下
JUnit使用总结
- 不要用Testcase的构造函数初始化,而要使用
@BeforeXxx
和@AfterXxx
- 不要依赖或假定测试运行的顺序,因为JUnit会利用Vector保存测试方法,所以不同平台会按不同的顺序从Vector中取出测试数据,在idea下是根据首字母顺序取出执行
- 当集成一个测试类是,记得调用分类的
@BeforeXxx
和@AfterXxx
- 将测试代码和工作代码放在一起,同步编译和更新
- 测试类和测试方法应该有一致的命名方案,如在类明后加
Test
形成测试类 - 近可能使用JUnit提供的assert和fail方法以及异常处理的方法,其可以使代码更为简介