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

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

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

前言

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: 10120
  servlet:
    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 {
   

    @Test
    void 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 {
   

    @Test
    void 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
        @Test
        void 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 {
   

    @Test
    void 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的探索与实践,持续迭代中。

目录
相关文章
|
10月前
|
Java 测试技术 容器
Jmeter工具使用:HTTP接口性能测试实战
希望这篇文章能够帮助你初步理解如何使用JMeter进行HTTP接口性能测试,有兴趣的话,你可以研究更多关于JMeter的内容。记住,只有理解并掌握了这些工具,你才能充分利用它们发挥其应有的价值。+
1452 23
|
SQL 安全 测试技术
2025接口测试全攻略:高并发、安全防护与六大工具实战指南
本文探讨高并发稳定性验证、安全防护实战及六大工具(Postman、RunnerGo、Apipost、JMeter、SoapUI、Fiddler)选型指南,助力构建未来接口测试体系。接口测试旨在验证数据传输、参数合法性、错误处理能力及性能安全性,其重要性体现在早期发现问题、保障系统稳定和支撑持续集成。常用方法包括功能、性能、安全性及兼容性测试,典型场景涵盖前后端分离开发、第三方服务集成与数据一致性检查。选择合适的工具需综合考虑需求与团队协作等因素。
1919 24
|
10月前
|
测试技术 Python
Python接口自动化测试中Mock服务的实施。
总结一下,Mock服务在接口自动化测试中的应用,可以让我们拥有更高的灵活度。而Python的 `unittest.mock`库为我们提供强大的支持。只要我们正确使用Mock服务,那么在任何情况下,无论是接口是否可用,都可以进行准确有效的测试。这样,就大大提高了自动化测试的稳定性和可靠性。
400 0
|
JSON 前端开发 测试技术
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
1064 10
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
|
JSON 前端开发 API
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
930 5
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
|
SQL 测试技术
除了postman还有什么接口测试工具
最好还是使用国内的接口测试软件,其实国内替换postman的软件有很多,这里我推荐使用yunedit-post这款接口测试工具来代替postman,因为它除了接口测试功能外,在动态参数的支持、后置处理执行sql语句等支持方面做得比较好。而且还有接口分享功能,可以生成接口文档给团队在线浏览。
609 2
|
存储 JSON API
Python测试淘宝店铺所有商品接口的详细指南
本文详细介绍如何使用Python测试淘宝店铺商品接口,涵盖环境搭建、API接入、签名生成、请求发送、数据解析与存储、异常处理等步骤。通过具体代码示例,帮助开发者轻松获取和分析淘宝店铺商品数据,适用于电商运营、市场分析等场景。遵守法规、注意调用频率限制及数据安全,确保应用的稳定性和合法性。
|
监控 API 开发工具
Socket.IO介绍,以及怎么连接测试Socket.IO接口?
Socket.IO 是一个用于浏览器和服务器间实时双向通信的库,支持低延迟消息传递、跨平台运行及自动重连。文章介绍了其特点与调试需求,并详细说明如何使用 Apifox 工具创建、连接、发送/接收 Socket.IO 事件,以及团队协作和调试技巧。掌握这些技能可提升实时应用开发效率与质量。
|
小程序 测试技术 数据安全/隐私保护
微信公众号接口测试实战指南
微信公众号接口测试是确保系统稳定性和功能完整性的重要环节。本文详细介绍了测试全流程,包括准备、工具选择(如Postman、JMeter)、用例设计与执行,以及常见问题的解决方法。通过全面测试,可以提前发现潜在问题,优化用户体验,确保公众号上线后稳定运行。内容涵盖基础接口、高级接口、微信支付和数据统计接口的测试,强调了功能验证、性能优化、安全保护及用户体验的重要性。未来,随着微信生态的发展,接口测试将面临更多挑战和机遇,如小程序融合、AI应用和国际化拓展。
|
负载均衡 Dubbo Java
Spring Cloud Alibaba与Spring Cloud区别和联系?
Spring Cloud Alibaba与Spring Cloud区别和联系?