使用 TestContainers 进行数据库集成测试

testcontainers · 浏览次数 : 0

小编点评

## TestContainers 简介 TestContainers 是一个用于集成测试的开源工具,可以简化集成测试中的容器管理。它支持多种容器化技术,如 Docker、Kubernetes 等,并且可以与各种编程语言和测试框架集成。 **优势:** * 简化环境搭建 * 隔离性和可重复性 * 真实环境下的集成测试 * 发现潜在问题和缺陷 **使用 TestContainers 的步骤:** 1. 引入 TestContainers 的依赖 2. 创建测试环境 3. 创建容器实例 4. 启动容器 5. 运行测试 6. 销毁容器 **示例代码:** ```csharp // 创建容器实例 using (var container = new PostgreSqlContainer()) { // 启动容器 await container.StartAsync(); } ``` **其他信息:** * TestContainers 提供多种用法,例如可以手动配置容器信息,或者使用配置文件来设置环境变量。 * 它支持多种编程语言,包括 .NET、Python、Java、Go 等。 * 测试环境可以从 Docker Hub 或 Kubernetes 等镜像中创建。 **结论:** TestContainers 是一个强大的工具,可以帮助我们简化集成测试中的容器管理,提高测试的效率和质量。

正文

在软件开发过程中,集成测试是至关重要的一环。它确保不同组件之间的协作正常,并验证系统在整体上的功能和性能。然而,传统的集成测试往往需要依赖于外部资源,如数据库、消息队列等,这给测试环境的搭建和维护带来了一定的挑战。
为了解决这个问题,我们可以使用 TestContainers 这个强大的开源工具。TestContainers 提供了一种简单而强大的方式来管理和运行容器化的测试环境。它支持多种容器化技术,如 Docker、Kubernetes 等,并且可以与各种编程语言和测试框架集成。

什么是 TestContainers?

TestContainers 是一个用于集成测试的开源工具,它的目标是简化集成测试中的容器管理。它提供了一套简洁的 API,可以轻松地创建、启动和销毁容器。通过使用 TestContainers,我们可以在测试中使用真实的容器化环境,而无需手动安装和配置外部资源。

TestContainers 的优势

使用 TestContainers 进行集成测试有以下几个优势:

  1. 简化环境搭建
    TestContainers 可以自动下载和启动所需的容器镜像,无需手动安装和配置外部资源。这样,我们可以快速搭建测试环境,减少了环境搭建的时间和工作量。
  2. 隔离性和可重复性
    每个测试用例都可以在独立的容器中运行,确保了测试的隔离性和可重复性。每次测试运行时,TestContainers 都会为每个测试用例创建一个新的容器实例,避免了测试之间的相互影响。
  3. 真实环境测试
    通过使用真实的容器化环境,我们可以更准确地模拟生产环境,并进行真实环境下的集成测试。这有助于发现潜在的问题和缺陷,并提高系统的稳定性和可靠性。

使用 TestContainers

  1. 引入 TestContainers 依赖
    首先,我们需要在项目中引入 TestContainers 的相关依赖。具体的依赖配置可以根据项目的需求和使用的编程语言进行调整。
  2. 创建容器实例
    在测试用例中,我们可以使用 TestContainers 提供的 API 创建容器实例。可以根据需要选择合适的容器类型,如 PostgreSQL、MySQL、Redis 等。
  3. 启动容器
    在测试开始前,我们需要启动容器。TestContainers 提供了简单的方法来启动容器,并等待容器完全启动。
  4. 运行测试
    在容器启动后,我们可以在测试用例中使用容器提供的连接信息,如数据库连接字符串、端口号等。这样,我们可以在测试中使用真实的容器化环境进行集成测试。

    可以看到当测试运行的时候 TestContainers 会在容器环境内建立多个实例。
  5. 销毁容器
    在测试结束后,我们需要销毁容器,释放资源。TestContainers 提供了相应的方法来销毁容器,并确保资源的正确释放。

示例

以下我们对常见的 Repositroy 进行一个单元测试。通常我们的单元测试是无法测试 Repostiory 的方法的,因为它直接原来数据库。

using Microsoft.VisualStudio.TestTools.UnitTesting;
using Testcontainers.PostgreSql;
using Microsoft.EntityFrameworkCore;

namespace TestContainersTryRun.Tests
{
    [TestClass()]
    public class EfRepositoryTests
    {
        static PostgreSqlContainer _container = new PostgreSqlBuilder().WithImage("postgres:15.1").Build();

        [ClassInitialize]
        public static async Task ClassInitialize(TestContext context)
        {
            await _container.StartAsync();
        }

        [ClassCleanup]
        public static async Task ClassCleanup()
        {
            await _container.DisposeAsync();
            Console.WriteLine($"PostgreSqlContainer dispose");
        }

        [TestMethod()]
        public async Task AddTest()
        {
            // Arrange
            DbContext dbContext = new PostgresqlDbContext(_container.GetConnectionString());
            dbContext.Database.EnsureCreated();
            var repository = new EfRepository<User>(dbContext);

            // Act
            var user = new User { 
                Id = 1,
                Name = "Test",
                Email = "xx@xx.com",
                Password = "123456"
            };

            repository.Add(user);
            await repository.SaveAsync();

            // Assert
            var users = await dbContext.Set<User>().ToListAsync();
            Assert.AreEqual(1, users.Count);
            Assert.AreEqual(user.Id, users[0].Id);
        }
    }
}

使用 TestContainers 的时候可以轻而易举的对其进行测试。

总结

TestContainers 是一个强大而灵活的工具,可以帮助我们简化集成测试中的容器管理。通过使用 TestContainers,我们可以快速搭建测试环境,提高测试的隔离性和可重复性,并进行真实环境下的集成测试。
希望本文对你理解和使用 TestContainers 有所帮助!如果你对 TestContainers 感兴趣,可以查阅官方文档以获取更多详细信息和示例代码。
Happy testing with TestContainers!

与使用 TestContainers 进行数据库集成测试相似的内容:

使用 TestContainers 进行数据库集成测试

在软件开发过程中,集成测试是至关重要的一环。它确保不同组件之间的协作正常,并验证系统在整体上的功能和性能。然而,传统的集成测试往往需要依赖于外部资源,如数据库、消息队列等,这给测试环境的搭建和维护带来了一定的挑战。 为了解决这个问题,我们可以使用 TestContainers 这个强大的开源工具。T

使用Cloudflare Worker加速docker镜像

前言 开发者越来越难了,现在国内的docker镜像也都️了,没有镜像要使用docker太难了,代理又很慢 现在就只剩下自建镜像的办法了 GitHub上有开源项目可以快速搭建自己的镜像库,不过还是有点麻烦,还好Cloudflare暂时还活着‍ 本文记录一下使用 Cloudf

使用C#/.NET解析Wiki百科数据实现获取历史上的今天

创建一个webapi项目做测试使用。 创建新控制器,搭建一个基础框架,包括获取当天日期、wiki的请求地址等 创建一个Http请求帮助类以及方法,用于获取指定URL的信息 使用http请求访问指定url,先运行一下,看看返回的内容。内容如图右边所示,实际上是一个Json数据。我们主要解析 大事记 部

Pybind11和CMake构建python扩展模块环境搭建

使用pybind11的CMake模板来创建拓展环境搭建 从Github上下载cmake_example的模板,切换分支,并升级pybind11子模块到最新版本 拉取pybind11使用cmake构建工具的模板仓库 git clone --recursive https://github.com/mr

说说RabbitMQ延迟队列实现原理?

使用 RabbitMQ 和 RocketMQ 的人是幸运的,因为这两个 MQ 自身提供了延迟队列的实现,不像用 Kafka 的同学那么苦逼,还要自己实现延迟队列。当然,这都是题外话,今天咱们重点来聊聊 RabbitMQ 延迟队列的实现原理,以及 RabbitMQ 实现延迟队列的优缺点有哪些? 很多人

使用FModel提取游戏资产

目录前言FModel简介FModel安装FModel使用初次使用资产预览资产导出附录dumperDumper-7生成usmap文件向游戏中注入dll 前言 这篇文章仅记录我作为初学者使用FModel工具提取某款游戏模型的过程。 FModel简介 FModel是一个开源软件,可以用于查看和提取UE4-

使用GSAP制作动画视频

GSAP 3Blue1Brown给我留下了深刻印象。利用动画制作视频,内容简洁,演示清晰。前两天刚好碰到一件事,我就顺便学习了一下怎么用代码做动画。 以javascrip为例,有两个动画引擎,GSAP和Animajs。由于网速的原因,询问了GPT后,我选择了GSAP来制作我的第一个动画视频。 制作动

使用ML.NET训练一个属于自己的图像分类模型,对图像进行分类就这么简单!

前言 今天大姚给大家分享一个.NET开源、免费、跨平台(支持Windows、Linux、macOS多个操作系统)的机器学习框架:ML.NET。并且本文将会带你快速使用ML.NET训练一个属于自己的图像分类模型,对图像进行分类。 ML.NET框架介绍 ML.NET 允许开发人员在其 .NET 应用程序

使用libzip压缩文件和文件夹

简单说说自己遇到的坑: 分清楚三个组件:zlib、minizip和libzip。zlib是底层和最基础的C库,用于使用Deflate算法压缩和解压缩文件流或者单个文件,但是如果要压缩文件夹就很麻烦,主要是不知道如何归档,在zip内部形成对应的目录。这时就需要用更高级别的库,也就是minizip或li

使用gzexe加密shell脚本

使用 gzexe 加密 shell 脚本是一个相对简单的过程。以下是具体的步骤: 编写你的 shell 脚本:首先,你需要有一个 shell 脚本文件,比如 myscript.sh。 确保脚本可执行:使用 chmod 命令确保你的脚本文件是可执行的: chmod +x myscript.sh 使用