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(那么)

    • 这是验证阶段。

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

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

相关推荐
梦想画家2 小时前
Golang Gin系列-8:单元测试与调试技术
golang·单元测试·gin
秋野酱5 小时前
如何在 Spring Boot 中实现自定义属性
java·数据库·spring boot
架构文摘JGWZ6 小时前
FastJson很快,有什么用?
后端·学习
BinaryBardC6 小时前
Swift语言的网络编程
开发语言·后端·golang
邓熙榆6 小时前
Haskell语言的正则表达式
开发语言·后端·golang
多则惑少则明8 小时前
SSM开发(一)JAVA,javaEE,spring,springmvc,springboot,SSM,SSH等几个概念区别
spring boot·spring·ssh
Swift社区8 小时前
【分布式日志篇】从工具选型到实战部署:全面解析日志采集与管理路径
人工智能·spring boot·分布式
专职9 小时前
spring boot中实现手动分页
java·spring boot·后端
Ciderw9 小时前
Go中的三种锁
开发语言·c++·后端·golang·互斥锁·