使用 TestContainers 进行数据库集成测试
在软件开发过程中,集成测试是至关重要的一环。它确保不同组件之间的协作正常,并验证系统在整体上的功能和性能。然而,传统的集成测试往往需要依赖于外部资源,如数据库、消息队列等,这给测试环境的搭建和维护带来了一定的挑战。
为了解决这个问题,我们可以使用 TestContainers 这个强大的开源工具。TestContainers 提供了一种简单而强大的方式来管理和运行容器化的测试环境。它支持多种容器化技术,如 Docker、Kubernetes 等,并且可以与各种编程语言和测试框架集成。
什么是 TestContainers?
TestContainers 是一个用于集成测试的开源工具,它的目标是简化集成测试中的容器管理。它提供了一套简洁的 API,可以轻松地创建、启动和销毁容器。通过使用 TestContainers,我们可以在测试中使用真实的容器化环境,而无需手动安装和配置外部资源。
TestContainers 的优势
使用 TestContainers 进行集成测试有以下几个优势:
- 简化环境搭建
TestContainers 可以自动下载和启动所需的容器镜像,无需手动安装和配置外部资源。这样,我们可以快速搭建测试环境,减少了环境搭建的时间和工作量。 - 隔离性和可重复性
每个测试用例都可以在独立的容器中运行,确保了测试的隔离性和可重复性。每次测试运行时,TestContainers 都会为每个测试用例创建一个新的容器实例,避免了测试之间的相互影响。 - 真实环境测试
通过使用真实的容器化环境,我们可以更准确地模拟生产环境,并进行真实环境下的集成测试。这有助于发现潜在的问题和缺陷,并提高系统的稳定性和可靠性。
使用 TestContainers
- 引入 TestContainers 依赖
首先,我们需要在项目中引入 TestContainers 的相关依赖。具体的依赖配置可以根据项目的需求和使用的编程语言进行调整。

- 创建容器实例
在测试用例中,我们可以使用 TestContainers 提供的 API 创建容器实例。可以根据需要选择合适的容器类型,如 PostgreSQL、MySQL、Redis 等。 - 启动容器
在测试开始前,我们需要启动容器。TestContainers 提供了简单的方法来启动容器,并等待容器完全启动。 - 运行测试
在容器启动后,我们可以在测试用例中使用容器提供的连接信息,如数据库连接字符串、端口号等。这样,我们可以在测试中使用真实的容器化环境进行集成测试。

可以看到当测试运行的时候 TestContainers 会在容器环境内建立多个实例。 - 销毁容器
在测试结束后,我们需要销毁容器,释放资源。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的现代化集成测试进阶之路
大型的软件工程项目除了大量的产品级代码外必不可少的还有大量的自动化测试.自动化测试包含从前端到后端甚至到产品线上不同模块和环境的各种类型的测试.一个比较经典的关于自动化测试分布的理论就是测试金字塔,是 ...
- 好代码是管出来的——.Net Core集成测试与数据驱动测试
软件的单元测试关注是的软件最小可执行单元是否能够正常执行,但是软件是由一个个最小执行单元组成的集合体,单元与单元之间存在着种种依赖或联系,所以在软件开发时仅仅确保最小单元的正确往往是不够的,为了保证软 ...
- Spring4.1新特性——Spring缓存框架增强(转)
目录 Spring4.1新特性——综述 Spring4.1新特性——Spring核心部分及其他 Spring4.1新特性——Spring缓存框架增强 Spring4.1新特性——异步调用和事件机制的异 ...
- Spring4.1新特性——Spring MVC增强
目录 Spring4.1新特性——综述 Spring4.1新特性——Spring核心部分及其他 Spring4.1新特性——Spring缓存框架增强 Spring4.1新特性——异步调用和事件机制的异 ...
- JSP应用开发 -------- 电纸书(未完待续)
http://www.educity.cn/jiaocheng/j9415.html JSP程序员常用的技术 第1章 JSP及其相关技术导航 [本章专家知识导学] JSP是一种编程语言,也是一种动 ...
- java单元/集成测试中使用Testcontainers
1.Testcontainers介绍: Testcontainers是一个Java库,它支持JUnit测试,提供公共数据库.SeleniumWeb浏览器或任何可以在Docker容器中运行的轻量级.一次 ...
- e2e 自动化集成测试 架构 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (三) SqlServer数据库的访问
上一篇文章“e2e 自动化集成测试 架构 京东 商品搜索 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step 二 图片验证码的识别” ...
- ASP.NET Core 中文文档 第五章 测试(5.2)集成测试
原文: Integration Testing 作者: Steve Smith 翻译: 王健 校对: 孟帅洋(书缘) 集成测试确保应用程序的组件组装在一起时正常工作. ASP.NET Core支持使用 ...
- 生产环境中,数据库升级维护的最佳解决方案flyway
官网:https://flywaydb.org/ 转载:http://casheen.iteye.com/blog/1749916 1. 引言 想到要管理数据库的版本,是在实际产品中遇到问题后想到的 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (38) ------ 第七章 使用对象服务之动态创建连接字符串和从数据库读取模型
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第七章 使用对象服务 本章篇幅适中,对真实应用中的常见问题提供了切实可行的解决方案. ...
随机推荐
- 【01】微服务(Microservice)是什么?为什么会出现微服务?
微服务(Microservice)虽然是当下刚兴起的比较流行的新名词,但本质上来说,微服务并非什么新的概念. 实际上,很多 SOA(面向服务的架构)实施成熟度比较好的企业,已经在使用和实施微服务了.只 ...
- 抓包整理————wireshark DNS 演练[三]
前言 简单整理一些wireshark dns 演练. 正文 简单介绍一下什么是dns. 这个其实可以百度一下哈,其实就是将域名转换为ip. 然后查询过程是这样的: 根域名服务器 权威服务器 dns 被 ...
- 使用mmdetection训练自己的coco数据集(免费分享自制数据集文件)
首先需要准备好数据集,这里有labelme标签数据转coco数据集标签的说明:labelme转coco数据集 - 一届书生 - 博客园 (cnblogs.com) 1. 准备工作目录 我们的工作目录, ...
- Python 潮流周刊#47:当你的老师希望你去做开源
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- 转载(localStorage设置过期时间)
转载地址:https://blog.csdn.net/zhaoxiang66/article/details/86703438 class Storage{ constructor(name){ th ...
- 【笔记】go语言--函数式编程
[笔记]go语言--函数式编程 简单来说,go语言的函数式编程体现的是一个闭包的情况 函数式编程 VS 函数指针 函数是一等公民:参数,变量,返回值都可以是函数 高阶函数 函数->闭包 &quo ...
- 力扣1132(MySQL)-报告的记录Ⅱ(中等)
题目: 编写一段 SQL 来查找:在被报告为垃圾广告的帖子中,被移除的帖子的每日平均占比,四舍五入到小数点后 2 位. Actions 表: Removals 表: Result 表: 2019-07 ...
- 力扣306(java)-累加数(中等)
题目: 累加数 是一个字符串,组成它的数字可以形成累加序列. 一个有效的 累加序列 必须 至少 包含 3 个数.除了最开始的两个数以外,序列中的每个后续数字必须是它之前两个数字之和. 给你一个只包含数 ...
- WPF开源轻便、快速的桌面启动器
前言 今天大姚给大家分享一款WPF开源.简单.轻便.快速的桌面启动器(支持多主题.多语言:简体中文.繁体中文.英文等):CurvaLauncher. WPF介绍 WPF 是一个强大的桌面应用程序框架, ...
- dotnet 统信 UOS 运行 UNO FrameBuffer 应用错误 Failed to open FrameBuffer device
本文记录在 UOS 统信系统上运行 UNO 的基于 Skia 的 FrameBuffer 应用报错问题,错误提示是 Unhandled exception. System.InvalidOperati ...