Java常用的单元测试框架介绍(上)

发表于:2023-12-27 09:52

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:移动Labs    来源:移动Labs

  Part 01、  JUnit5框架 
  1.1 Junit5介绍
  Junit5需要Java 8或更高版本,和Junit4只是一个单独的Jar包不同,目前的Junit5组成如下:JUnit5=JUnit Platform+JUnit Jupiter+JUnit Vintage
  - JUnit Platform:
  是Junit向测试平台演进,提供平台功能的模块,通过JUnit Platform,其他的自动化测试引擎或开发人员自己定制的引擎都可以接入Junit实现对接和执行
  - JUnit Jupiter:
  这是Junit5的核心,可以看作是承载Junit4原有功能的演进,它包含了很多丰富的新特性来使JUnit自动化测试更加方便、功能更加丰富和强大。
  本系列就会重点围绕Jupiter中的一些特性进行介绍。Jupiter本身也是一个基于Junit Platform的引擎实现。
  - JUnit Vintage:
  Junit发展了10数年,Junit3和Junit4都积累了大量的用户,作为新一代框架,这个模块是对JUnit3,JUnit4版本兼容的测试引擎,使旧版本Junit的自动化测试脚本也可以顺畅运行在Junit5下,它也可以看作是基于Junit Platform实现的引擎范例。
  1.2 测试实例生命周期介绍
  @TestInstance(TestInstance.Lifecycle.PER_CLASS)
  * PER_METHOD(默认):JUnit在执行每个测试方法之前创建每个测试类的新实例 
  * PER_CLASS:JUnit Jupiter在同一个测试实例上执行所有测试方法,当使用这种模式时,每个测试类将创建一个新的测试实例。因此,如果您的测试方法依赖于存储在实例变量中的状态,则可能需要在@BeforeEach或@AfterEach方法中重置该状态。
  1.3 Junit5常用注解介绍
  @BeforeAll
  JUnit5@BeforeAll注释是JUnit4中@BeforeClass注释的替代。它用于表示应在当前测试类中的所有测试方法之前执行的带的方法。 
  备注:@BeforeAll注释的方法必须是静态方法,否则会报运行时错误。
  @BeforeEach
  JUnit5@BeforeEach注释替代了JUnit4中的@Before注释。被注释的方法会在当前类中的每个Test方法之前执行。也就是说有多少个test这个方法就会执行多少次。
  备注:@BeforeEach注释的方法一定不能是静态方法,否则会报发运行时错误。
  @AfterEach
  JUnit5@AfterEach注释是JUnit4中@After注释的替换。它用于表示应在当前类中的每个@Test方法之后执行带注释的方法。
  @AfterAll 
  JUnit5@AfterAll注释是JUnit4中@AfterClass注释的替换。它用于表示应在当前测试类中的所有测试之后执行带注释的方法。
  备注:@AfterAll注释的方法必须是静态方法,否则会报运行时错误。
  Junit5当中使用@BeforeEach替换了@Before使用 @AfterEach替换了@After
  @Disabled可以用于不运行某些test的场景。
  @Tag可以用于将测试分类。
  JUnit Jupiter支持下列注解,用于配置测试和扩展框架。
  所有核心注解位于junit-jupiter-api模块中的org.junit.jupiter.api包中。
  Part 02、  spring-boot-test框架 
  2.1 版本迭代
  在JUnit4中,自定义框架通常意味着使用@RunWith注释来指定一个自定义的运行器。使用多个运行器是有问题的。
  Junit5在Spring boot 2.1.x之前,@SpringBootTest需要配合@ExtendWith(SpringExtension.class)才能正常工作的。
  而在Spring boot 2.1.x之后,我们查看@SpringBootTest 的代码会发现,其中已经组合了@ExtendWith(SpringExtension.class),因此,无需在进行该注解的使用了。
  Spring Boot 2.2.0版本开始引入JUnit5作为单元测试默认库
  Junit5中包含JUnit Vintage:这个模块是兼容JUnit3、JUnit4版本的测试引擎,使得旧版本的自动化测试也可以在JUnit5下正常运行。防止使用旧的junit4相关接口,可以进行依赖排除,如下图:
  SpringBoot 2.4以上版本移除了默认对Vintage的依赖。如果需要兼容JUnit4.x版本,需要自行引入。
  SpringBootTest默认集成了以下功能:
  备注:JUnit4前移注意事项。
  2.2 Spring Boot Test中的主要注解
  从功能上讲,Spring Boot Test中的注解主要分如下几类:
  2.2.1 配置类型的注解
  使用@SpringBootApplication启动测试或者生产代码,被@TestComponent描述的Bean会自动被排除掉。如果不是则需要向@SpringBootApplication添加TypeExcludeFilter。
  2.2.2 mock类型的注解
  @MockBean和@SpyBean这两个注解,在mockito框架中本来已经存在,且功能基本相同。Spring Boot Test又定义一份重复的注解,目的在于使MockBean和SpyBean被ApplicationContext管理,从而方便使用。MockBean和SpyBean功能非常相似,都能模拟方法的各种行为。不同之处在于MockBean是全新的对象,跟正式对象没有关系;而SpyBean与正式对象紧密联系,可以模拟正式对象的部分方法,没有被模拟的方法仍然可以运行正式代码。
  @MockBean 只能 mock 本地的代码——或者说是自己写的代码,对于储存在库中而且又是以 Bean 的形式装配到代码中的类无能为力。
  @SpyBean 解决了 SpringBoot 的单元测试中
  @MockBean 不能 mock 库中自动装配的 Bean 的局限
 本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号