SpringCloud2023实战之接口服务测试工具SpringBootTest

news/2024/11/15 10:40:56/文章来源:https://www.cnblogs.com/r0ad/p/18547498

你好,这里是专栏“SpringCloud2023实战”。

点击查看专栏SpringCloud实战

往期推荐:

  • SpringCloud和SpringBoot的版本依赖该怎么选择
  • SpringCloud2023最新版本该如何进行组件选型?
  • 如何简洁高效的搭建一个SpringCloud2023的maven工程
  • 如何在SpringCloud2023中快速集成注册中心
  • 如何在SpringCloud2023中快速集成配置中心
  • 在SpringCloud2023中快速集成SpringCloudGateway网关
  • 使用Sentinel进行服务调用的熔断和限流管理
  • SpringCloud2023中使用Seata解决分布式事务
  • SpringBoot基于OpenAPI3的接口文档管理快速集成和使用

前言

Spring Boot Test 是 Spring Boot 生态系统中的一部分,它基于 Spring Test 和 JUnit 等其他测试框架,提供了便捷高效的测试手段。Spring Boot Test 进行了再次封装,增加了切片测试,并增强了 mock 能力。

SpringBootTest是Spring Framework提供的用于编写集成测试的工具类,它可以帮助开发人员轻松地编写自动化的集成测试用例,以验证整个Spring应用程序上下文的行为。SpringBootTest可以加载完整的应用程序上下文,并支持对各个组件进行集成测试,包括控制器、服务、存储库、数据库访问等。

  • 加载应用程序上下文:SpringBootTest能够加载整个Spring应用程序上下文,包括所有的bean定义、配置文件、组件扫描等。这使得测试用例能够在一个真实的Spring环境中执行,而不需要手动模拟或配置大量的依赖项。
  • 自动配置:通过使用SpringBootTest注解,开发人员可以自动配置所需的环境,例如内嵌的数据库、自定义的Bean等。这样可以减少测试用例中的重复代码,提高测试的可维护性。
  • 模拟环境:除了加载完整的应用程序上下文外,SpringBootTest还提供了一些模拟环境的功能,比如可以使用@MockBean来替换某些bean的实际实现,以便更好地控制测试环境。
  • 自动化测试:SpringBootTest支持JUnit或者TestNG等测试框架,可以方便地编写各种类型的自动化测试用例,包括单元测试、集成测试、端到端测试等。
  • 与Spring Boot集成:SpringBootTest天然与Spring Boot集成,可以很容易地对Spring Boot应用程序进行集成测试。

SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。

核心组件如下:

  • JUnit 5:Java应用程序单元测试的事实标准。
  • Spring Test和Spring Boot Test:为Spring Boot应用程序提供实用工具和集成测试支持。
  • AssertJ:一个流畅的断言库。
  • Hamcrest:一个匹配器对象库(也称为约束或谓词)。
  • Mockito:一个Java模拟框架。
  • JSONassert:一个针对JSON的断言库。
  • JsonPath:JSON的XPath解析库。

SpringBootTest应用集成

引入pom.xml

  • 引入SpringBootTest主要是引入 spring-boot-starter-test
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><groupId>io.rainforest</groupId><artifactId>banana</artifactId><version>1.0</version></parent><modelVersion>4.0.0</modelVersion><artifactId>banana-client6-test</artifactId><description>spring cloud banana-client6-test</description><packaging>jar</packaging><dependencies><!-- 核心依赖省略 --><!--测试依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--测试依赖-便于测试webflux相关的接口--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency></dependencies></project>

修改配置

  • 无特殊修改。
spring.application.name: banana-client5-tracing
server:port: 10120servlet:context-path: /app

修改启动类

  • 启动类不需要特殊修改。
package io.rainforest.banana.app;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

接口demo

  • 通过访问 http://localhost:10120/ 测试接口。
package io.rainforest.banana.app.web.demo;import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;
import java.util.List;@RestController
@Slf4j
public class HelloWorld {@GetMapping("/")public String hello(String hello){log.info("this is a test");return "Hello World";}
}

SpringBootTest测试用例编写

Spring Boot应用程序是一个Spring ApplicationContext,因此除了使用Spring context进行测试之外,不需要做任何特别的事情。Spring Boot 提供了一个 @SpringBootTest 注解,当需要 Spring Boot 功能时,它可以作为标准 spring-test @ContextConfiguration 注解的替代。该注解通过 SpringApplication 在测试中创建 ApplicationContext 来工作。除了 @SpringBootTest,还提供了许多其他注解来测试应用程序的更具体部分。

默认情况下,@SpringBootTest不会启动服务器。您可以使用@SpringBootTest的webEnvironment属性来进一步定义测试运行的方式:

  • MOCK(默认值):加载一个Web应用程序上下文并提供模拟的Web环境。在使用此注解时,嵌入式服务器不会启动。如果您的类路径上没有Web环境,则此模式会自动回退到创建常规的非Web应用程序上下文。它可以与@AutoConfigureMockMvc或@AutoConfigureWebTestClient一起使用,用于对您的Web应用程序进行基于模拟的测试。
  • RANDOM_PORT:加载一个WebServer应用程序上下文并提供真实的Web环境。嵌入式服务器会启动并侦听一个随机端口。
  • DEFINED_PORT:加载一个WebServer应用程序上下文并提供真实的Web环境。嵌入式服务器会启动并侦听一个已定义的端口(来自您的application.properties文件)或默认端口8080。
  • NONE:通过使用SpringApplication加载一个应用程序上下文,但不提供任何Web环境(模拟或其他方式)。

带启动参数的单元测试

通过args属性可以指定启动参数。

package io.rainforest.banana.app;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.test.context.SpringBootTest;import static org.assertj.core.api.Assertions.assertThat;@SpringBootTest(args = "--app.test=one")
class MyApplicationArgumentTests {@Testvoid applicationArgumentsPopulated(@Autowired ApplicationArguments args) {assertThat(args.getOptionNames()).containsOnly("app.test");assertThat(args.getOptionValues("app.test")).containsOnly("one");}}

带mock环境的单元测试

通过mockmvc可以发起rest请求测试本地接口。

package io.rainforest.banana.app;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.reactive.server.WebTestClient;
import org.springframework.test.web.servlet.MockMvc;import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;@SpringBootTest
@AutoConfigureMockMvc
class MyMockMvcTests {@Testvoid testWithMockMvc(@Autowired MockMvc mvc) throws Exception {mvc.perform(get("/")).andExpect(status().isOk()).andExpect(content().string("Hello World"));}// If Spring WebFlux is on the classpath, you can drive MVC tests with a WebTestClient@Testvoid testWithWebTestClient(@Autowired WebTestClient webClient) {webClient.get().uri("/").exchange().expectStatus().isOk().expectBody(String.class).isEqualTo("Hello World");}}

带运行服务的单元测试

带完整的springboot运行环境的单元测试。

package io.rainforest.banana.app;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.test.web.reactive.server.WebTestClient;@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
class MyRandomPortWebTestClientTests {@Testvoid exampleTest(@Autowired WebTestClient webClient) {webClient.get().uri("/").exchange().expectStatus().isOk().expectBody(String.class).isEqualTo("Hello World");}}

其它的单元测试

SpringBootTest提供了很多集成的starter测试工具类。例如:

  • Spring GraphQL Tests
  • Data Cassandra Tests
  • Data Couchbase Tests

具体内容可以查看SpringBoot的文档了解。

关于作者

来自全栈程序员nine的探索与实践,持续迭代中。(工作卫星codetrend)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/833913.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Exchange 2016部署实施案例篇-04.Ex基础配置篇(下)

上二篇我们对全新部署完成的Exchange Server做了基础的一些配置,今天继续基础配置这个话题。 DAG配置 先决条件首先在配置DGA之前我们需要确保DAG成员服务器上磁盘的盘符都是一样的,大小建议最好也相同。 其次我们需要确保有一块网卡用于数据复制使用(PS:单块网卡也可以,单…

YOLO系列技术细节(更新中)

相对于R-CNN、Fast RCNN的two-stage目标检测方式,即先在图像中提取候选框,再逐一对图像进行分类。候选框的生成可以是滑动窗口或选择性搜索,再对候选框进行非极大值抑制(一般只在推理时做非极大值抑制,训练时需要这些重复的框)。而YOLO则是one-stage的端到端形式:输入图…

Apple Logic Pro 11.1 - 专业音乐制作 (音频编辑)

Apple Logic Pro 11.1 - 专业音乐制作 (音频编辑)Apple Logic Pro 11.1 - 专业音乐制作 (音频编辑) Logic Pro 配备全新 AI 功能,引领音乐创作再上新阶 请访问原文链接:https://sysin.org/blog/apple-logic-pro/ 查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org…

【Civit3D 2025下载与安装教程】

1、安装包 「Civil3d_2025」: 链接:https://pan.quark.cn/s/b05281a72f24 提取码:PUWx 「Civil3D2020」: 链接:https://pan.quark.cn/s/61c01d7bd533 提取码:RbML 2、安装教程(建议关闭杀毒软件) 1) 双击Setup.exe安装,弹窗安装对话框2) 勾选‘我同意。。…

[Flask]SSTI 1

[Flask]SSTI 1 根据题目判断这是一道SSTI参数处理不当的漏洞,打开页面显示Hello guest,猜测参数名为user发现页面无任何变化,于是尝试name,成功回显尝试{{2*2}},页面显示4,存在SSTI注入构造payload,成功执行任意代码 # payload的解释:获取eval函数并执行任意代码?name=…

凯宇星辉:CRM助力实现数字化“领跑”转型

近日,第14届中国轻工业信息化大会及智能居家展洽会在重庆举行。会上同步发布了中国轻工业数字化转型“领跑者”相关案例成果287项,涉及家电、五金、照明、酿酒食品等行业,其中,纷享销客合作客户辽宁凯宇星辉实业集团有限公司(以下简称“凯宇星辉”)提报的《基于CRM系统的…

零售行业的高效法宝:项目管理软件的应用与选择

在零售行业,团队协作的效率直接影响到市场反应速度和客户满意度。商品的上下架、库存管理、促销活动的策划与执行、跨部门的沟通与协作……每一个环节都需要精准的协调。而在这些纷繁复杂的任务中,项目管理软件正成为零售行业的关键工具,帮助团队理清思路、优化流程、提升执…

关于从其他程序切回word文档时卡顿问题的解决办法

1.点击其他命令 2.点击加载项,选择对应的加载项,点击转到 3.如下图操作后,重启word即可 原文地址:https://blog.csdn.net/qq_45603855/article/details/115732189

ABB机器人DSQC639主板维修

ABB机器人的主板,作为这一高科技产物的中枢大脑,其出色的稳定性和可靠性无疑是确保机器人能够高效、持续运作的关键所在。一旦主板遭遇故障,整个机器人的运行将可能陷入瘫痪状态,严重影响生产效率与质量。以下,将深入探讨几种常见的ABB机器人主板故障及其相应的解决之道:…

前端开发中怎么把链接转为二维码并展示?

前端开发中我们应该怎么把一个通过代码生成二维码并展示呢?前言: 把一个链接生成一个二维码图片,这是我们前端非常常见的一个需求。那么我们应该如何做呢? 查看往期文章: 五分钟一百行代码,手写一个vue项目全局通用的toast提示组件 十五分钟两百行代码,手写一个vue项目全…

数字型注入(post)

数字型注入(post) 打开靶场,发现数字列表查询,点击查询发现POST请求和id、submit参数bp抓包,根据题目数字注入提示,尝试用1+1方式查询,+编码为%2B id=1%2B1&submit=%E6%9F%A5%E8%AF%A2成功回显 order by查询字段数,在为3的时候回显异常,判断字段数为2查库,查出数据…

设备管理系统功能拆解——设备报修维修管理

在生产过程中,设备的高效运作是确保生产顺利进行的重要基础。但是运行时间长了,设备难免会出现故障,如何高效地进行报修和维修管理,成为每个企业必须面对的问题。 通过有效的报修维修管理,企业可以快速响应设备故障,合理分配资源,从而最大限度地减少停机时间。这篇我们将…