首页 热点资讯 义务教育 高等教育 出国留学 考研考公
您的当前位置:首页正文

Springboot集成JUnit5优雅进行单元测试

2022-07-22 来源:华拓网
Springboot集成JUnit5优雅进⾏单元测试为什么使⽤JUnit5JUnit4被⼴泛使⽤,但是许多场景下使⽤起来语法较为繁琐,JUnit5中⽀持lambda表达式,语法简单且代码不冗余。JUnit5易扩展,包容性强,可以接⼊其他的测试引擎。功能更强⼤提供了新的断⾔机制、参数化测试、重复性测试等新功能。ps:开发⼈员为什么还要测试,单测写这么规范有必要吗?其实单测是开发⼈员必备技能,只不过很多开发⼈员开发任务太重导致调试完就不管了,没有系统化得单元测试,单元测试在系统重构时能发挥巨⼤的作⽤,可以在重构后快速测试新的接⼝是否与重构前有出⼊。简介如图,JUnit5结构如下:JUnit Platform: 这是Junit提供的平台功能模块,通过它,其它的测试引擎都可以接⼊Junit实现接⼝和执⾏。JUnit JUpiter:这是JUnit5的核⼼,是⼀个基于JUnit Platform的引擎实现,它包含许多丰富的新特性来使得⾃动化测试更加⽅便和强⼤。JUnit Vintage:这个模块是兼容JUnit3、JUnit4版本的测试引擎,使得旧版本的⾃动化测试也可以在JUnit5下正常运⾏。依赖引⼊我们以SpringBoot2.3.1为例,引⼊如下依赖,防⽌使⽤旧的junit4相关接⼝我们将其依赖排除。 org.springframework.boot spring-boot-starter-test test org.junit.vintage junit-vintage-engine 常⽤注解@BeforeEach:在每个单元测试⽅法执⾏前都执⾏⼀遍@BeforeAll:在每个单元测试⽅法执⾏前执⾏⼀遍(只执⾏⼀次)@DisplayName(\"商品⼊库测试\"):⽤于指定单元测试的名称@Disabled:当前单元测试置为⽆效,即单元测试时跳过该测试@RepeatedTest(n):重复性测试,即执⾏n次@ParameterizedTest:参数化测试,@ValueSource(ints = {1, 2, 3}):参数化测试提供数据断⾔JUnit Jupiter提供了强⼤的断⾔⽅法⽤以验证结果,在使⽤时需要借助java8的新特性lambda表达式,均是来⾃org.junit.jupiter.api.Assertions包的static⽅法。

assertTrue与assertFalse⽤来判断条件是否为true或false

@Test

@DisplayName(\"测试断⾔equals\") void testEquals() { assertTrue(3 < 4); }

assertNull与assertNotNull⽤来判断条件是否为·null

@Test

@DisplayName(\"测试断⾔NotNull\") void testNotNull() {

assertNotNull(new Object()); }

assertThrows⽤来判断执⾏抛出的异常是否符合预期,并可以使⽤异常类型接收返回值进⾏其他操作

@Test

@DisplayName(\"测试断⾔抛异常\") void testThrows() {

ArithmeticException arithExcep = assertThrows(ArithmeticException.class, () -> { int m = 5/0; });

assertEquals(\"/ by zero\ }

assertTimeout⽤来判断执⾏过程是否超时

@Test

@DisplayName(\"测试断⾔超时\") void testTimeOut() {

String actualResult = assertTimeout(ofSeconds(2), () -> { Thread.sleep(1000); return \"a result\"; });

System.out.println(actualResult); }

assertAll是组合断⾔,当它内部所有断⾔正确执⾏完才算通过

@Test

@DisplayName(\"测试组合断⾔\") void testAll() {

assertAll(\"测试item商品下单\ () -> {

//模拟⽤户余额扣减

assertTrue(1 < 2, \"余额不⾜\"); }, () -> {

//模拟item数据库扣减库存 assertTrue(3 < 4); }, () -> {

//模拟交易流⽔落库

assertNotNull(new Object()); } ); }

重复性测试

在许多场景中我们需要对同⼀个接⼝⽅法进⾏重复测试,例如对幂等性接⼝的测试。JUnit Jupiter通过使⽤@RepeatedTest(n)指定需要重复的次数

@RepeatedTest(3)

@DisplayName(\"重复测试\") void repeatedTest() {

System.out.println(\"调⽤\"); }

参数化测试

参数化测试可以按照多个参数分别运⾏多次单元测试这⾥有点类似于重复性测试,只不过每次运⾏传⼊的参数不⽤。需要使⽤到@ParameterizedTest,同时也需要@ValueSource提供⼀组数据,它⽀持⼋种基本类型以及String和⾃定义对象类型,使⽤极其⽅便。

@ParameterizedTest

@ValueSource(ints = {1, 2, 3}) @DisplayName(\"参数化测试\") void paramTest(int a) {

assertTrue(a > 0 && a < 4); }

内嵌测试

JUnit5提供了嵌套单元测试的功能,可以更好展⽰测试类之间的业务逻辑关系,我们通常是⼀个业务对应⼀个测试类,有业务关系的类其实可以写在⼀起。这样有利于进⾏测试。⽽且内联的写法可以⼤⼤减少不必要的类,精简项⽬,防⽌类爆炸等⼀系列问题。

@SpringBootTest

@AutoConfigureMockMvc

@DisplayName(\"Junit5单元测试\")public class MockTest { //....

@Nested

@DisplayName(\"内嵌订单测试\") class OrderTestClas { @Test

@DisplayName(\"取消订单\") void cancelOrder() { int status = -1;

System.out.println(\"取消订单成功,订单状态为:\"+status); } }}

因篇幅问题不能全部显示,请点此查看更多更全内容