SpringBoot2.2.0之后默认的junit的版本仲裁是5版本,junit5和junit4有诸多区别
一,Junit5的变化
Spring Boot 2.2.0版本之后开始引入Junit5作为单元测试的默认库
Junit5和之前版本有很大的不同,它由三个不同的子模块组成:Junit Platfrom , Junit Jupiter , Junit Vintage
Junit的三大模块:
- Junit Platfrom : Platfrom 是JVM上启动测试框架的基础,不仅支持Junit自制的测试引擎,其他测试也可以接入
- Junit Jupter : 提供Junit新的编程模型,是Junit5新特性的核心,内部包含一个测试引擎,用于在platfrom上运行
- Junit vintage:Junit5之前的老版本都是以及它为编程模型,默认Junit5已经自带Junit vintage(已经被Jupter取代),它兼容Junit3x和junit4x
注意:在Spring Boot2.4.0之后,默认不引入Junit vintage模块,使用使用junit4的部分关键字和注解会失效,假如还想使用junit4的语法要导入以下依赖
<dependency> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-core</artifactId> </exclusion> </exclusions> </dependency>
二,Spring boot使用Junit注解
一,Sring boot 导入Junit的场景启动器
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
二,Junit5的常用注解
JUnit Jupiter支持下列注解,用于配置测试和扩展框架:
-
- @Test:标记方法是一个测试方法,与Junit4不同它没有声明任何属性,因为Jupiter测试引擎是基于它们自己的,而不是基于以前junit4的vintage测试引擎
- @DisolatName:设置测试方法或者测试类的名称
- @BeforeEach:在每个测试方法之前执行 ,在Junit4中是@Before
- @AfterEach:在每个测试方法之后执行,在Junit4中是@After
- @BeforeAll:在所有测试方法之前执行,标注方法必须是静态的
- @AfterAll:在所有测试方法之后执行,标注方法必须是静态的
- @Disabled:禁用测试类和测试方法
- @RepeatedTest:用于重复测试
- @ParameterizedTest:参数化参数
- @TestTemplate:测试用例模板
- @TestInstance:标注实类的生命周期
- @Timeout:设置参数方法的超时时间
例:
@DisplayName("Demo测试类")//标记测试类的名称 @SpringBootTest //在Junit5中不需要加@RunWith(SpringRunner.class),如果不写SpringBootTest注解就是没有整合Springboot测试驱动 class DemoFqApplicationTests { int number; //Junit也整合了Spring,可以使用Spring中的注解 @Autowired Bean_fq fq; @DisplayName("测试类1,设置超时") @Test @Timeout(value = 5,unit = TimeUnit.MILLISECONDS)//unit指明时间单位,value声明超时间 void test1() throws InterruptedException { Thread.sleep(5); System.out.println(fq.name()); } @DisplayName("重复执行测试类") @RepeatedTest(value = 4)//重复方法执行四次 void repeated(){ number++; System.out.println("重复方法执行的第"+number+"次"); } @DisplayName("被禁用的方法!") @Test void disable(){ } //在每个方法之前执行 @BeforeEach void before(){ System.out.println("Before之前执行!!"); } //在每个方法之后执行 @AfterEach void after(){ System.out.println("After之后执行!!"); } //在使用方法之前执行 @BeforeAll static void beforeall(){ System.out.println("所有方法之前执行!!"); } //在使用方法之前执行 @AfterAll static void afterall(){ System.out.println("所有方法之后执行!!"); } }
结果:
三,Junit断言机制
断言是编写单元测试用例的核心方式,即期望值是多少,测试的结果是多少,以此来判断测试是否通过。在JUnit Jupiter中,所有的断言org.junit.jupiter.api.Assertions
类中static方法
常见的断言语句:
- assertEquals:判断两个对象或者两个原始值是否相等
- assertNotEquals:判断两个对象或者两个原始值是否不相等
- assertSame:判断两个对象引用是否指向同一个对象
- assertNotSame:判断两个对象引用是否不指向同一个对象
- assertTrue:判断给定的布尔值是否为true
- assertFlase:判断给定布尔值是否为flase
- assertNull:判断对象是否为空
- assertNotNull:判断对象是否不为空
- assertTimeout:判断是否超时
- assertThrows:判断是否会引起异常
- assertArrayEquals:判断数组是否相等
- assertAll:组合断言
- fail:快速失败
- ....................
注:Executable executable是一个函数式接口
例:
@DisplayName("测试类!!") @SpringBootTest public class DemofqApplicationTest1 { int a; int b; @Test @DisplayName("断言普通值!!") void test1(){ a=1; b=100; Assertions.assertEquals(a,b,"值不相等!");//message错误的话提示的信息 } @Test @DisplayName("断言对象!") void test2(){ String a = new String(); String b = new String(); Assertions.assertSame(a,b,"对象引用不相同!"); } @Test @DisplayName("组合断言!") void test3(){ Assertions.assertAll("组合断言!!", () -> Assertions.assertTrue(true), () -> Assertions.assertEquals(1,2) ); } @Test @DisplayName("超时断言!") void test4(){ Assertions.assertTimeout(Duration.ofMillis(5), () -> Thread.sleep(5)); } @Test @DisplayName("异常断言!") void test5(){ Assertions.assertThrows(Throwable.class,//异常类 () -> { a=1/0;} ); } @Test @DisplayName("快速失败!") void test6(){ System.out.println("快速失败!"); Assertions.fail("失败!!"); } }
三,其他
一,前置条件
二,嵌套测试
Comments | NOTHING
Warning: Undefined variable $return_smiles in /www/wwwroot/wql_luoqin_ltd/wp-content/themes/Sakura/functions.php on line 1109