使用单元测试框架Junit的正确姿势~

不知道大家平时开发出来的功能,写不写单元测试?反正我是不咋写,写个单元测试有时候mock比开发实际功能都难搞,谁写谁懂得。

image.png

没办法,由于甲方爸爸的要求,我们必须得写单元测试,并且要配备相应的单元测试报告。惭愧啊,写个单元测试让我掉了不少头发。

image.png

今天我就把写单元测试的一些流程梳理一下,供大家做个参考,让大家少踩点坑。

1. 什么是单元测试?

单元测试是软件开发中的一种测试方法,旨在验证代码中的最小可测试单元(通常是函数、方法或类)是否按照预期进行了设计、实现和行为。在单元测试中,开发者编写测试用例来测试代码的各种情况和边界条件,然后运行这些测试用例以验证代码的正确性。

单元测试的主要特点包括:

  1. 独立性:每个单元测试应该是独立的,不依赖于其他测试用例的执行结果。

  2. 自动化:单元测试应该可以自动运行,开发者不需要手动进行测试。

  3. 快速:单元测试应该能够快速执行,以便在开发过程中频繁地运行。

  4. 精确性:单元测试应该能够准确地验证代码的行为,覆盖各种情况和边界条件。

通过编写和执行单元测试,开发者可以提高代码的质量和稳定性,及早发现并修复潜在的问题,同时也增强了代码的可维护性和可扩展性。

2. 常见的java语言单元测试框架有哪些?

  1. JUnit:Java语言最常用的单元测试框架之一。它提供了一组断言方法来验证代码的行为,并支持测试的组织和运行。

  2. Spring Boot Test:针对Spring Boot应用程序的测试支持。它提供了一组注解和工具,用于编写和运行与Spring Boot应用程序相关的单元测试、集成测试和端到端测试。

  3. TestNG:另一个流行的Java单元测试框架,与JUnit类似,但提供了更多的功能和灵活性,如参数化测试、测试分组、依赖测试等。

  4. Mockito:用于Java的模拟框架,用于模拟和验证对象的行为。Mockito允许你创建模拟对象,并定义它们的行为和交互。

  5. PowerMock:扩展了其他模拟框架(如Mockito和EasyMock)的功能,以提供更多的模拟能力,如静态方法和final类的模拟。

  6. Spock:基于Groovy语言的测试框架,结合了JUnit、Mockito和其他测试框架的功能,并提供了更简洁和易读的语法。

  7. AssertJ:一个流畅的断言库,提供了丰富的断言方法,可以编写清晰、易读的测试代码。

  8. EasyMock:另一个Java模拟框架,用于创建模拟对象和定义它们的行为,相比Mockito,EasyMock在一些特定场景下可能更适用。

  9. WireMock:用于模拟HTTP服务的框架,可以帮助开发者进行对外部HTTP服务的集成测试。

  10. Arquillian:用于Java EE应用程序的集成测试框架,可以在真实的容器环境中运行测试,支持各种Java EE组件的测试。

这些框架在Java开发中广泛应用于单元测试、集成测试和功能测试等不同类型的测试场景,开发者可以根据具体需求选择合适的框架进行测试。

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:691998057【暗号:csdn999】

这些单元测试框架都有其各自的特点和适用场景。 下面是关于几种常见的单元测试框架的简要对比:

框架语言主要特点适用场景依赖
JUnitJava- 提供了一组断言方法来验证代码行为
- 支持测试的组织和运行
- 单元测试junit:junit
Spring Boot TestJava- 针对Spring Boot应用程序的测试支持- Spring Boot应用程序的单元测试、集成测试、端到端测试spring-boot-starter-test
TestNGJava- 支持更多功能和灵活性,如参数化测试、测试分组、依赖测试等- 单元测试、集成测试org.testng:testng
MockitoJava- 用于模拟和验证对象的行为- 单元测试、模拟测试、验证测试org.mockito:mockito-core
PowerMockJava- 扩展了其他模拟框架的功能,支持更多模拟能力- 单元测试、模拟静态方法和final类等场景org.powermock:powermock-api-mockito2:2.0.0
SpockGroovy- 结合了JUnit、Mockito等框架的功能
- 提供了更简洁和易读的语法
- 单元测试、集成测试org.spockframework:spock-core
AssertJJava- 提供丰富的断言方法,编写清晰易读的测试代码- 单元测试org.assertj:assertj-core
EasyMockJava- 用于创建模拟对象和定义行为- 单元测试、模拟测试org.easymock:easymock
WireMockJava- 用于模拟HTTP服务- 集成测试、功能测试com.github.tomakehurst:wiremock
ArquillianJava EE- 用于Java EE应用程序的集成测试,支持真实容器环境- Java EE应用程序的集成测试org.jboss.arquillian:junit-container

以上扯的有点多,很多我们用不上

image.png

重点关注JUint、 Mockito、PowerMock、 Spring Boot Test就行。

3. JUint、 Mockito、PowerMock、 Spring Boot Test 的区别,如何选?如何搭配使用?

Spring Boot Test 和 JUnit 是两种不同的测试框架,它们之间有一些区别,主要体现在以下几个方面:

  1. 功能范围

    • JUnit:是一个通用的Java单元测试框架,用于编写和运行单元测试。它提供了一组断言方法和注解,用于验证代码的行为和组织测试。
    • Spring Boot Test:是Spring Boot框架提供的专门用于测试Spring Boot应用程序的测试框架。它建立在JUnit之上,提供了额外的功能和注解,用于编写和运行与Spring Boot应用程序相关的单元测试、集成测试和端到端测试。
  2. 集成环境

    • JUnit:可以与任何Java项目一起使用,不限于Spring Boot。
    • Spring Boot Test:专门针对Spring Boot应用程序设计,提供了特定于Spring Boot的测试支持,包括自动配置、内存数据库、Mock对象等。
  3. 注解

    • JUnit:提供了一些基本的注解,如 @Test 用于标记测试方法,@Before@After 用于在测试方法执行前后执行一些准备和清理操作等。
    • Spring Boot Test:除了继承了JUnit的注解外,还提供了一些Spring Boot特有的注解,如 @SpringBootTest 用于加载Spring Boot应用程序上下文,@MockBean 用于模拟Bean对象等。
  4. 功能扩展

    • JUnit:提供了基本的单元测试功能,可以通过集成其他库来扩展功能,如Mockito用于模拟对象,AssertJ用于更丰富的断言等。
    • Spring Boot Test:除了提供基本的单元测试功能外,还集成了许多Spring Boot特有的功能,如自动配置、内存数据库(如H2)、Spring Boot测试切片等。

下面是关于Spring Boot Test 和 JUnit 的简要对比:

特点Spring Boot TestJUnit
用途用于测试Spring Boot应用程序的单元测试、集成测试和端到端测试通用的Java单元测试框架
扩展集成了Spring Boot特有的功能,如自动配置、内存数据库、测试切片等提供基本的单元测试功能,可以通过集成其他库来扩展
注解提供了Spring Boot特有的注解,如 @SpringBootTest、@MockBean 等提供了基本的注解,如 @Test、@Before、@After 等
集成环境专门针对Spring Boot应用程序设计可以与任何Java项目一起使用
功能范围提供了额外的功能,如测试Spring Boot应用程序的自动配置、集成等提供基本的单元测试功能
选择建议适用于Spring Boot项目,测试Spring Boot应用程序的功能适用于普通Java项目,进行基本的单元测试

这些是 Spring Boot Test 和 JUnit 的一些主要区别和特点。在选择使用哪个框架时,应该根据项目的需求和特点来决定。

至于Mockito和PowerMock如何选择和搭配请参照如下:

框架主要特点如何选?如何搭配使用?
Mockito- 用于模拟和验证对象的行为- 适用于需要模拟对象行为的场景通常与JUnit或Spring Boot Test一起使用进行单元测试
PowerMock- 扩展了其他模拟框架的功能,支持更多模拟能力- 适用于需要模拟静态方法、final类等的场景通常与JUnit和Mockito一起使用来扩展模拟功能

小结

  • 如果你正在开发一个普通的Java项目,并且只需要进行基本的单元测试,那么使用JUnit是一个不错的选择。
  • 如果你正在开发一个Spring Boot应用程序,并且需要测试Spring Boot的自动配置、集成以及与Spring框架相关的功能,那么Spring Boot Test是更合适的选择。
  • 在Spring Boot项目中,通常可以使用JUnit和Spring Boot Test结合使用,使用JUnit编写常规的单元测试,使用Spring Boot Test进行Spring Boot相关的集成测试。
  • 如果你需要模拟对象的行为以及验证对象的交互,可以选择搭配使用Mockito。
  • 如果你的项目中有需要模拟静态方法、final类等特殊情况,可以选择搭配使用PowerMock。

4. 常用的注解及作用

下面是关于JUnit、Mockito、PowerMock和Spring Boot Test注解的对比表格:

框架注解主要作用
JUnit@Test标记测试方法
@Before在每个测试方法执行之前执行,用于初始化测试环境
@After在每个测试方法执行之后执行,用于清理测试环境
@BeforeClass在测试类加载时执行,只执行一次,用于初始化静态资源
@AfterClass在测试类执行完成后执行,只执行一次,用于清理静态资源
@Ignore标记测试方法为忽略测试,暂时跳过执行
Mockito@Mock创建模拟对象
@Spy创建部分模拟对象,部分方法保留原始行为
@InjectMocks注入模拟对象或部分模拟对象到被测试对象中
PowerMock@PrepareForTest准备被测试类,以支持对静态方法、final类、构造函数等的模拟
Spring Boot Test@SpringBootTest加载Spring应用程序上下文,以便在测试中使用Spring组件
@MockBean创建Spring应用程序上下文中的模拟Bean
@Autowired自动注入Spring组件
@RunWith(SpringRunner.class)指定使用SpringRunner来运行测试类

下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

最后: 可以在公众号:程序员小濠 ! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值