JUnit5详解 爱被打了一巴掌 2022-10-29 12:23 290阅读 0赞 ## JUnit5 架构 ## ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpYW5naGVjYWk1MjE3MTMxNA_size_16_color_FFFFFF_t_70] 整个Junit5可以划分成三层:顶层框架(Framework)、中间的引擎(Engine),底层的平台(Platform): * Platform:位于架构的最底层,是JVM上执行单元测试的基础平台,还对接了各种IDE(例如IDEA、eclipse),并且还与引擎层对接,定义了引擎层对接的API;整个Junit Platform是开放的,通过引擎API各种测试框架都可以接入; * Jupiter:位于引擎层,支持5版本的编程模型、扩展模型;是Junit5的核心,它包含了很多丰富的新特性来使JUnit自动化测试更加方便、功能更加丰富和强大。 * Vintage:位于引擎层,用于执行低版本的测试用例;是一个对JUnit3,JUnit4兼容的测试引擎,使旧版本junit的自动化测试脚本可以顺畅运行在junit5下,其实也可以看作是基于junit platform实现的接入范例。 **注意**:JUnit5需要JDK8或以上版本才能支持。JUnit5全面支持JDK8 lambda语法表达。 ## Junit5常用注解 ## 和JUnit4相比,Junit对注解的使用进行了进一步的优化,以下是一个对照表 <table> <thead> <tr> <th align="left">FEATURE</th> <th align="left">JUNIT 4</th> <th align="left">JUNIT 5</th> </tr> </thead> <tbody> <tr> <td align="left">Declare a test method</td> <td align="left">@Test</td> <td align="left">@Test</td> </tr> <tr> <td align="left">Execute before all test methods in the current class</td> <td align="left">@BeforeClass</td> <td align="left">@BeforeAll</td> </tr> <tr> <td align="left">Execute after all test methods in the current class</td> <td align="left">@AfterClass</td> <td align="left">@AfterAll</td> </tr> <tr> <td align="left">Execute before each test method</td> <td align="left">@Before</td> <td align="left">@BeforeEach</td> </tr> <tr> <td align="left">Execute after each test method</td> <td align="left">@After</td> <td align="left">@AfterEach</td> </tr> <tr> <td align="left">Disable a test method / class</td> <td align="left">@Ignore</td> <td align="left">@Disabled</td> </tr> <tr> <td align="left">Test factory for dynamic tests</td> <td align="left">NA</td> <td align="left">@TestFactory</td> </tr> <tr> <td align="left">Nested tests</td> <td align="left">NA</td> <td align="left">@Nested</td> </tr> <tr> <td align="left">Tagging and filtering</td> <td align="left">@Category</td> <td align="left">@Tag</td> </tr> </tbody> </table> 说明: * BeforeEach:被该注解修饰的方法会在每个测试方法执行前被执行一次,会被子类继承,取代低版本的Before; * AfterEach:被该注解修饰的方法会在每个测试方法执行后被执行一次,会被子类继承,取代低版本的Before; * BeforeAll:被该注解修饰的必须是静态方法,会在所有测试方法之前执行,会被子类继承,取代低版本的BeforeClass; * AfterAll:被该注解修饰的必须是静态方法,会在所有测试方法执行之后才被执行,会被子类继承,取代低版本的AfterClass; * ExtendWith:这是用来取代旧版本中的RunWith注解,不过在SpringBoot环境如果没有特别要求无需额外配置,因为SpringBootTest中已经有了; * Test:被该注解修饰的就是测试方法; * DisplayName:测试方法的展现名称,在测试框架中展示,支持emoji; * Timeout:超时时长,被修饰的方法如果超时则会导致测试不通过; * Disabled:不执行的测试方法; Junit5中对不同测试执行阶段提供了对应的回调接口,使扩展JUnit更加方便: <table> <thead> <tr> <th align="left">回调方法</th> <th align="left">描述</th> </tr> </thead> <tbody> <tr> <td align="left">BeforeAllCallback</td> <td align="left">在@BeforeAll 注解的方法之前执行</td> </tr> <tr> <td align="left">AfterAllCallback</td> <td align="left">在@AfterAll 注解的方法之后执行</td> </tr> <tr> <td align="left">BeforeEachCallback</td> <td align="left">在@BeforeEach 注解的方法之前执行</td> </tr> <tr> <td align="left">AfterEachCallback</td> <td align="left">在@AfterEach 注解的方法之后执行</td> </tr> <tr> <td align="left">BeforeTestExecutionCallback</td> <td align="left">在测试方法运行之前执行</td> </tr> <tr> <td align="left">AfterTestExecutionCallback</td> <td align="left">在测试方法运行之后执行</td> </tr> </tbody> </table> ## JUnit5中的Assert方法 ## * assertTrue/False(\[String message,\]boolean condition); 判断一个条件是true还是false。其中 * assertTrue(boolean condition); condition:如果condition结果为true,则通过测试. * assertFalse(boolean condition); condition:如果condition结果为false,则通过测试. * fail(\[String message,\]); 失败,可以有消息,也可以没有消息。 * assertEquals(\[String message,\]Object expected,Object actual); 判断是否相等,可以指定输出错误信息。 第一个参数是期望值,第二个参数是实际的值。 * assertNotEquals(\[String message,\]Object expected,Object actual); 判断是否不相等。 第一个参数是期望值,第二个参数是实际的值。 * assertArrayEquals(\[java.lang.String message,\] java.lang.Object\[\] expecteds, java.lang.Object\[\] actuals) ; * assertNotNull/Null(\[String message,\]Object obj); 判读一个对象是否非空(非空)。 * assertSame/NotSame(\[String message,\]Object expected,Object actual); 判断两个对象是否指向同一个对象。看内存地址。 * failNotSame/failNotEquals(String message, Object expected, Object actual) 当不指向同一个内存地址或者不相等的时候,输出错误信息。 注意信息是必须的,而且这个输出是格式化过的。 * assertThat(java.lang.String reason, java.lang.Object actual, org.hamcrest.Matcher matcher); 其中,reason为断言失败时的输出信息,actual为断言的值或对象,matcher为断言的匹配器,里面的逻辑决定了给定的actual对象满不满足断言。 (如果需要是用assertThat需要在项目中引入junit4的jar包,以及hamcrest-core.jar和hamcrest-library.jar) ## SpringBoot中使用Junit5 ## ### Junit4单元测试类写法: ### @SpringBootTest public class SpringDataES { } ### Junit5单元测试类写法: ### @SpringBootTest public class SpringDataES { } Junit5中RunWith注解已经被ExtendWith取代,而SpringBootTest注解,已经包含了ExtendWith: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpYW5naGVjYWk1MjE3MTMxNA_size_16_color_FFFFFF_t_70 1] [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpYW5naGVjYWk1MjE3MTMxNA_size_16_color_FFFFFF_t_70]: /images/20221024/e776b0d0ec774505a0959091d8f66b6f.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpYW5naGVjYWk1MjE3MTMxNA_size_16_color_FFFFFF_t_70 1]: /images/20221024/0a9a3d6d449b4ac58032dc11d68997e5.png
还没有评论,来说两句吧...