SpringBoot篇 单元测试 理论篇

1.单元测试概念介绍

简单来说,单元测试是对软件中的最小可测试单元进行检查和验证。在 Java 中,单元测试的最小单元是类。Spring Boot 提供了 spring-boot-starter-test 依赖,包含了JUnit、Mockito、Hamcrest 等常用的测试框架1。,主要作用有以下几点:

1.1 重要性

  • 及时发现问题:能在开发过程中尽早发现代码中的错误,避免问题积累到后期更难解决。

  • 保障功能正常:确保每个小部分的功能都按预期工作,让整个应用更可靠。

  • 方便后续修改:有单元测试的情况下,修改代码时能快速知道是否破坏了原有功能,更放心地进行优化和重构。

1.2 常用注解

  • @SpringBootTest:用于加载Spring Boot应用的上下文环境,让测试类可以使用Spring容器中的各种组件,适合进行集成测试或需要完整应用上下文的测试场景。

  • @WebMvcTest:用于测试Spring MVC相关的控制器等组件,会自动配置MockMvc,方便对HTTP请求和响应进行模拟和验证,但不会加载完整的应用上下文,测试速度相对较快。

  • @DataJpaTest:专门用于测试JPA相关的数据访问层代码,会自动配置内存数据库和相关的JPA组件,方便对数据库操作进行测试,也不需要加载完整应用上下文。

1.3 测试方法

  • 使用Mock对象:对于一些依赖外部系统或复杂组件的部分,可以用Mockito等工具创建Mock对象来模拟其行为,使测试更独立、更稳定,不受外部因素影响。

  • 断言验证:通过断言来验证测试结果是否符合预期,比如使用AssertJ等断言库,可以更方便地检查变量值、对象状态等是否正确。

1.4 单元测试依赖

XML 复制代码
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-test</artifactId>
  <scope>test</scope>
</dependency>

2. 单元测试应该测试什么?

2.1 测试内容

业务实现的路径 决定了单元测试的内容,如图所示:

上图展示了一个简单的三层架构流程:

  1. 用户发出请求。

  2. 请求被发送到Controller(控制器)。

  3. Controller调用Service(服务层)处理核心业务逻辑。

  4. Service层调用Dao(数据访问层)进行数据库的CRUD操作。

  5. Dao层与数据库(DB)交互,完成数据的存取。

  6. 数据库操作完成后,结果逐层返回给用户。


2.2 测试要素

单元测试的关键三要素是:

  1. 单元:指的是要测试的最小代码部分,比如一个函数。

  2. 用例:是具体的测试场景,包括输入和预期结果。

  3. 边界情况:测试输入数据的极限情况,确保代码能正确处理。


2.3 测试阶段

这里我们使用一种常用的测试方法,称为"Given-When-Then"模式,它将测试过程分为三个主要阶段:

  1. Given(给定)

    • 这是测试的准备阶段。

    • 在这个阶段,你需要设定测试的初始条件或环境,比如创建必要的数据或配置。

  2. When(当)

    • 这是执行阶段。

    • 在这个阶段,你执行特定的操作或触发某个事件,比如点击按钮或调用函数。

  3. Then(那么)

    • 这是验证阶段。

    • 在这个阶段,你检查操作的结果是否符合预期,比如验证数据是否正确更新或界面是否显示正确。

这种模式帮助测试人员清晰地定义测试场景,确保测试的每个步骤都有明确的目的和预期结果。

相关推荐
小码哥_常1 小时前
别再被误导!try...catch性能大揭秘
后端
苍何3 小时前
30分钟用 Agent 搓出一家跨境网店,疯了
后端
ssshooter3 小时前
Tauri 2 iOS 开发避坑指南:文件保存、Dialog 和 Documents 目录的那些坑
前端·后端·ios
追逐时光者3 小时前
一个基于 .NET Core + Vue3 构建的开源全栈平台 Admin 系统
后端·.net
程序员飞哥3 小时前
90后大龄程序员失业4个月终于上岸了
后端·面试·程序员
彭于晏Yan5 小时前
Redisson分布式锁
spring boot·redis·分布式
GetcharZp5 小时前
Git 命令行太痛苦?这款 75k Star 的神级工具,让你告别“合并冲突”恐惧症!
后端
Victor3566 小时前
MongoDB(69)如何进行增量备份?
后端
Victor3566 小时前
MongoDB(70)如何使用副本集进行备份?
后端
千寻girling7 小时前
面试官 : “ 说一下 Python 中的常用的 字符串和数组 的 方法有哪些 ? ”
人工智能·后端·python