SpringBoot 使用 Testcontainers 进行容器化集成测试

news2024/12/26 15:15:56

SpringBoot 使用 Testcontainers 进行容器化集成测试

容器化集成测试是测试应用程序与其依赖项之间的集成,其中依赖项以容器的形式运行。SpringBoot提供了Testcontainers来测试应用程序与依赖项之间的集成,本文将介绍如何使用Testcontainers进行容器化集成测试。

在这里插入图片描述

1. 什么是 Testcontainers

Testcontainers是一个Java测试库,用于在测试中启动Docker容器。Testcontainers可以在测试运行时自动启动和停止Docker容器,并提供简单的API来访问容器中的服务。Testcontainers支持各种数据库、消息代理和其他服务,以便在测试中模拟外部依赖项。

2. 如何使用 Testcontainers

使用Testcontainers非常简单,只需要在测试类中创建一个Testcontainers实例,并使用该实例启动Docker容器即可。例如,以下是一个使用Testcontainers测试MySQL数据库的示例:

@RunWith(SpringRunner.class)
@SpringBootTest
@Testcontainers
public class UserRepositoryIntegrationTest {

    @Container
    private static final MySQLContainer mysqlContainer = new MySQLContainer()
            .withUsername("test")
            .withPassword("test")
            .withDatabaseName("test");

    @Autowired
    private UserRepository userRepository;

    @Test
    public void shouldSaveUser() {
        User user = new User("John Smith");
        userRepository.save(user);
        assertThat(user.getId()).isNotNull();
    }
}

在测试中,使用了Spring Boot Test和JUnit的注解来配置测试环境。@Testcontainers注解用于启用Testcontainers,@Container注解用于创建MySQL容器。在测试方法中,使用自动注入的UserRepository实例保存用户,并使用断言验证用户ID是否已设置。

3. Testcontainers 的高级用法

Testcontainers提供了许多高级用法,以便在测试中启动和管理Docker容器。以下是一些常见的高级用法:

3.1 使用自定义 Docker 镜像

Testcontainers支持使用自定义Docker镜像启动容器。您可以使用以下代码指定自定义Docker镜像:

@Container
private static final GenericContainer<?> container = new GenericContainer<>("my-image:1.0.0")
        .withExposedPorts(8080);

在此示例中,使用了GenericContainer来创建容器,并指定了自定义Docker镜像和端口号。

3.2 使用容器网络

Testcontainers支持使用容器网络连接多个容器。您可以使用以下代码指定容器网络:

@Container
private static final Network network = Network.newNetwork();

@Container
private static final MySQLContainer mysqlContainer = new MySQLContainer()
        .withNetwork(network)
        .withNetworkAliases("mysql")
        .withUsername("test")
        .withPassword("test")
        .withDatabaseName("test");

@Container
private static final MyApplicationContainer appContainer = new MyApplicationContainer()
        .withNetwork(network)
        .withEnv("SPRING_DATASOURCE_URL", "jdbc:mysql://mysql:3306/test")
        .withEnv("SPRING_DATASOURCE_USERNAME", "test")
        .withEnv("SPRING_DATASOURCE_PASSWORD", "test");

在此示例中,使用了Network来创建容器网络,并将MySQL容器和应用程序容器连接到同一网络。应用程序容器使用了MySQL容器的网络别名来访问MySQL数据库。

3.3 使用容器等待策略

Testcontainers支持使用容器等待策略等待容器启动。您可以使用以下代码指定容器等待策略:

@Container
private static final MySQLContainer mysqlContainer = new MySQLContainer()
        .withStartupTimeout(Duration.ofSeconds(30))
        .withUsername("test")
        .withPassword("test")
        .withDatabaseName("test")
        .waitingFor(Wait.forLogMessage(".*ready for connections.*\\n", 1));

在此示例中,使用了MySQL容器的waitingFor方法来等待MySQL容器启动,并打印"ready for connections"日志消息。

3.4 使用容器卷

Testcontainers支持使用容器卷将本地文件映射到容器中。您可以使用以下代码指定容器卷:

@Container
private static final MySQLContainer mysqlContainer = new MySQLContainer()
        .withUsername("test")
        .withPassword("test")
        .withDatabaseName("test")
        .withCopyFileToContainer(MountableFile.forClasspathResource("test.sql"), "/docker-entrypoint-initdb.d/test.sql");

在此示例中,使用了MySQL容器的withCopyFileToContainer方法将本地资源文件test.sql复制到MySQL容器的/docker-entrypoint-initdb.d目录中,以便在容器启动时自动运行SQL脚本。

4. 总结

Testcontainers是一个强大的Java测试库,用于在测试中启动和管理Docker容器。使用Testcontainers可以方便地测试应用程序与其依赖项之间的集成,以及模拟外部依赖项。本文介绍了Testcontainers的基本用法和一些高级用法,包括使用自定义Docker镜像、容器网络、容器等待策略和容器卷。

在SpringBoot应用程序中使用Testcontainers非常简单,只需要在测试类中创建Testcontainers实例,并使用该实例启动Docker容器即可。使用Testcontainers进行容器化集成测试可以帮助我们更好地测试应用程序与其依赖项之间的集成,提高测试覆盖率和测试质量。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

详细解说一次性低代码和持续化低代码的关键区别在哪里

为什么很多开发团队吐槽低代码开发平台&#xff0c;其中大致归结了几个方面的原因&#xff1a; 1、使用过后会降低对技术的依赖度&#xff0c;工具人的倾向更加严重 2、目前大部分的低代码都是一次性的低代码&#xff0c;仅仅是在第一次构建模型的时候&#xff0c;可以生成一…

CDC介绍

CDC介绍 1 CDC Change Data Capture&#xff1a;定义了一种场景&#xff0c;即识别并捕获数据库表中数据的变更&#xff0c;并交付给下游进一步处理。CDC是对针对行级数据记录的。其中数据的变更信息&#xff0c;即 CDC 的数据结构&#xff0c;包括变更是什么样的操作&#x…

《JDK8特性深入讲解》学习笔记

Lambda表达式 如果不适用lambda表达式的话&#xff0c;可以使用匿名内部类&#xff0c;但是代码会显得有点多 lambda表达式其实就是匿名内部类 Lambda表达式简化了匿名内部类的使用&#xff0c;语法更加简单。 语法规则 (参数类型 参数名称) -> {代码体; } Lambda表达…

Unreal 5 实现Data Table 数据表格的使用

数据是一个游戏重要的组成部分&#xff0c;按分工&#xff0c;数据会交由策划去配置&#xff0c;所以&#xff0c;你的数据不可能直接写到蓝图里面&#xff0c;而是有一个专门的数据表格去配置。 大家通用的方式是策划在Excel内编辑完成&#xff0c;然后通过工具生成游戏需要使…

RabbitMQ安装以及SpringBoot整合RabbitMQ

SpringBootMQ整合Rabbit RabbitMQ安装以及SpringBoot整合 1、Docker安装RabbitMQ #拉取rabbitmq镜像 docker pull rabbitmq#启动RabbitMQ docker run -d --hostname my-rabbit --name rabbit -p 15672:15672 -p 5672:5672 rabbitmq#安装图形化插件 #进入容器 docker exec -i…

ubantu16.04搭建Qt环境

目录 ubantu16.04搭建Qt环境 下载opensource 安装qmake 安装g以及依赖库 配置环境 编译原码 安装make 查看qmake是否安装 配置环境变量 qmake编译c/c代码 安装qtcreator Linux编译Qt代码 ubantu16.04搭建Qt环境 下载opensource 「下载 qt-everywhere-opensource-s…

用于配电室的内部环境监控系统设计与产品选型

摘要&#xff1a;配电室是配电系统的重要组成部分&#xff0c;影响着电力用户的用电需求&#xff0c;需要保障其安全、可靠运行。针对配电室内部环境进行了深入分析&#xff0c;设计了一种内部环境监控系统。通过该系统可以采集配电室内部的温度、湿度、液位、SF6气体和烟雾&am…

伪随机码详解

本专栏包含信息论与编码的核心知识&#xff0c;按知识点组织&#xff0c;可作为教学或学习的参考。markdown版本已归档至【Github仓库&#xff1a;https://github.com/timerring/information-theory 】或者公众号【AIShareLab】回复 信息论 获取。 文章目录 伪随机码伪随机序列…

期末复习【网络安全】

期末复习【网络安全】 前言推荐期末复习第1章 引言1.1 计算机安全概念1.2 OSI安全体系结构 61.3 安全攻击 71.3.1 被动攻击1.3.2 主动攻击 第2章 对称加密和消息机密性2.1 对称加密原理 232.1.3 Feistel密码结构 25 2.2 对称分组加密算法 272.2.1 数据加密标准2.2.2 三重DES2.2…

【C#】并行编程实战:任务并行性(下)

本章继续介绍任务并行性&#xff0c;因篇幅所限&#xff0c;本章为下篇。 6、处理任务异常 所有优秀的程序员都擅长高效地处理异常&#xff0c;这也是并行编程最重要的方面之一。任务并行库&#xff08;TPL&#xff09;提供了一种高效的设计来处理异常&#xff1a;任务中发生的…

山西电力市场日前价格预测【2023-06-26】

日前价格预测 预测明日&#xff08;2023-06-26&#xff09;山西电力市场全天平均日前电价为395.92元/MWh。其中&#xff0c;最高日前价格为477.34元/MWh&#xff0c;预计出现在19: 00。最低日前电价为309.90元/MWh&#xff0c;预计出现在13: 00。以上预测仅供学习参考&#xff…

Android中的EventBus变迁史

Android中的EventBus变迁史 什么是EventBus&#xff1f; EventBus是软件架构中使用的一种通信机制&#xff0c;用于促进系统内不同组件或服务之间的事件交换。它为组件提供了一种发布和订阅事件的方法&#xff0c;从而实现松散耦合和异步通信。 EventBus充当中央集线器或消息…

SpringBoot 性能优化的主要组件及特点

SpringBoot 性能优化的主要组件及特点 简介 在开发应用程序时&#xff0c;性能是一个非常重要的因素。如果应用程序的性能不佳&#xff0c;那么它可能会影响用户的体验&#xff0c;甚至会导致系统崩溃。而在 SpringBoot 应用程序中&#xff0c;我们可以通过一些组件来优化应用…

PCB板为什么要做表面处理?你知道吗

PCB板为什么要做表面处理&#xff1f; 由于PCB上的铜层很容易被氧化&#xff0c;因此生成的铜氧化层会严重降低焊接质量&#xff0c;从而降低最终产品的可靠性和有效性&#xff0c;为了避免这种情况的发生&#xff0c;需要对PCB进行表面处理。 常见的表面处理方式包括OSP、喷…

Java虚拟机(JVM)面试题

JVM 说一下 JVM 的主要组成部分及其作用&#xff1f; 总体来说&#xff0c;方法区和堆是所有线程共享的内存区域&#xff1b;而虚拟机栈、本地方法栈和程序计数器的运行是线程私有的内存区域&#xff0c;运行时数据区域就是我们常说的JVM的内存 类加载子系统&#xff1a;根据…

SpringBoot 使用 MockMvc 进行 Web 集成测试

SpringBoot 使用 MockMvc 进行 Web 集成测试 在 SpringBoot 应用程序中&#xff0c;我们可以使用 MockMvc 进行 Web 集成测试。MockMvc 是一个测试框架&#xff0c;可以模拟 HTTP 请求和响应&#xff0c;并且可以使用 Spring MVC 的控制器进行测试。MockMvc 可以让我们测试 Sp…

Apollo分布式配置中心(一)

目录 什么是配置&#xff1f; 什么是配置中心&#xff1f; 配置中心需要满足条件 什么是Apollo&#xff1f; Apollo特性 Apollo执行流程 Apollo安装 Git地址&#xff1a; 用户手册&#xff1a; 环境准备&#xff1a; 使用idea 的git clone 拉取源码 修改Apollo\scripts…

面对AI,要(能)当“杜兰特”吗?

大家好&#xff0c;我是老三&#xff0c;先说一下这篇文章没什么干货&#xff0c;就是一篇随笔。 今天闲来无事&#xff0c;在掘金上刷到一篇文章&#xff1a;GPT-4都来了&#xff0c;我们还需要刷算法题和背八股文吗&#xff1f;&#xff1a;https://juejin.cn/post/72111208…

总结Linux 中实时查看日志的3种方法

一、前言 我们大家应该都知道如何在 Linux 中查看文件&#xff0c;比如可以使用 cat 或者 less 命令。 这对于查看静态文件来说是可以的&#xff1b;日志文件是动态的&#xff0c;其内容随时会变化&#xff0c;要监测日志文件&#xff0c;需要在日志文件内容改变时也能实时看到…

配置右键菜单功能 :一键csv转excel

配置右键菜单功能 &#xff1a;一键csv转excel 无需点开文件&#xff0c;双击即可以生成新的excel文件 步骤&#xff1a; 1、配置Python&#xff0c;安装依赖库 pip install openpyxl pip install pandas2、创建Python文件 csv_to_excel.py # -*- coding:utf-8 -*- impor…