1.JUnit5简介
1.1 组成模块
区别于junit4,Junit5由三个子模块组成:
JUnit Platform:作为测试框架的基础平台,启动测试框架;
JUnit Jupiter: JUnit5扩展的新的编程模型和扩展模型,功能模块核心,编写测试用例;
JUnit Vintage:允许兼容JUnit3,4,在新的JUnit平台上运行旧的JUnit 3 和 4 的测试。
相比于junit4,junit新增了动态工厂测试,嵌套测试,参数化测试,重复测试,构造函数和方法的实例化,注册扩展等功能,同时也支持junit4的运行
1.2 使用
1.2.1 添加依赖
IDEA 高版本集成了JUnit5的功能,springboot项目会自动的引入了junit5的核心功能模块依赖,因此在springboot项目中使用只需要添加依赖
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-runner</artifactId>
<version>1.5.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.5.2</version>
<scope>test</scope>
</dependency>
1.2.2 启动配置
测试类添加启动测试类注解@RunWith(JUnitPlatform.class)
,表示用junit5平台上启动测试类
2.部分新特性介绍
2.1 测试集
新建测试类,启动类用Suite.class,并添加需要测试的类,多个类用","隔开
@RunWith(Suite.class)
@Suite.SuiteClasses({AreaDaoTest.class,DaoTest.class})
2.2 常用注解
@DisplayName
:声明测试类或测试方法
@Disabled
:禁用测试,相当于junit的@Ignore
@Order
:结合@TestMethodOrde
一起使用设置测试方法的执行顺序
@ParameterizedTest
:参数化测试
@RepeatedTest
:重复测试
@Tag
:标签,相当于Junit4中的分组测试
@Nested
:嵌套测试
@TestFactory
:动态测试工厂
2.3 断言升级
支持lambda表达式,使用assertAll方法进行断言组测试
2.4举个栗子
2.4.1 参数化测试
@DisplayName("参数化测试")
@ParameterizedTest
@ValueSource(ints = {1,2,3})
void parameter(int candidate) {
assertTrue(candidate > 0 && candidate < 4);
};
会依次执行当参数为1,2,3时是否满足断言条件。
2.4.2 设置测试方法执行顺序
@Test
@DisplayName("根据id查询案例,第三执行")
@Order(3)
void getAreaById() {
Area area = areaDao.getAreaById(12);
}
在测试类前面添加:
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
2.4.5 用lambda表达式添加断言组
Area area = new Area("中国北京",3);
assertAll("area initialized error ",
() -> assertNotNull(area.getAreaName()),
() -> assertNotNull(area.getPriority())
);
// () -> 表达式,返回的是这个表达式的值
// (x,y) -> (x+y) ,(2,3) -> (2+3) 返回的是5
断言组嵌套:
// 两个参数一起判断,每个参数的判断都用了一个assertAll,作为第一assertAll的第二个和第三个参数表达式
assertAll("params checkout",
() -> {
String areaName = area.getAreaName();
assertAll("areaName is not valid",
() -> assertTrue(areaName.contains("成都")),
() -> assertTrue(areaName.startsWith("四川")));
},
() -> {
int priority = area.getPriority();
assertAll("priority is not valid",
() -> assertTrue(priority> 1),
() -> assertTrue(priority<10));
}
);