为了账号安全,请及时绑定邮箱和手机立即绑定

Testcontainers 在 .NET 中的集成测试

介绍

集成测试是确保应用程序在真实环境中能按预期工作的关键方面。传统上,我们使用仿真来模拟与外部服务(如数据库)的交互。然而,这有时会导致测试不够全面,忽略了一些真实世界中的边缘情况。在这种情况下,这个开源库Testcontainers就开始发挥作用了。

Testcontainers 允许你在集成测试中运行 Docker 容器,提供了一个更真实的测试环境。

本文将探讨如何在 .NET 应用程序中执行 Testcontainers 的数据库集成测试,重点是 SQL Server。

Testcontainers — 图片来自 here

为什么选择Testcontainers而不是Mocking?

模拟依赖是单元测试中常用的一种做法,用于模拟依赖,如数据库。然而,它并不总是能准确地反映这些依赖的行为。模拟数据库可能无法发现与数据持久化、模式不匹配或连接问题相关的问题,这些问题在生产环境中可能会出现。

相比之下,Testcontainers 在测试时,会在 Docker 容器里启动实际的数据库或其他服务实例。这提供了一个真实的测试环境,确保你的应用程序与数据库的交互就像在生产环境中一样。

这种方法减少了因模拟可能忽视的未知 bug 而引发的部署问题的风险。

使用SQL Server测试.NET应用

我们来看一个例子,我们有一个简单的.NET Core应用程序,它与SQL Server数据库进行交互。我们将使用Testcontainers在Docker容器中创建一个SQL Server实例,并在这个数据库上运行集成测试以验证应用程序功能。

设置一下

首先,让我们创建并设置 .NET Core 项目,然后添加必要的 NuGet 包依赖。

dotnet new xunit -n TestcontainersExample  # 创建一个新的xUnit项目,命名为TestcontainersExample
cd TestcontainersExample                  # 进入TestcontainersExample目录
dotnet add package Testcontainers --version 3.9.0  # 添加Testcontainers库版本3.9.0
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.InMemory
dotnet add package Testcontainers.MsSql

创建SQL Server 测试容器

我们现在可以为 SQL Server 创建一个测试容器。

    使用Testcontainers.MsSql;  
    使用Microsoft.EntityFrameworkCore;  
    使用Xunit;  

    public class SqlServerIntegrationTests : IAsyncLifetime  
    {  
        private readonly MsSqlContainer _dbContainer;  

        public SqlServerIntegrationTests()  
        {  
            _dbContainer = new MsSqlBuilder()  
                .WithImage("mcr.microsoft.com/mssql/server:2022-latest")  
                .WithPassword("P@ssword1!")  
                .Build();  
        }  

        public async Task InitializeAsync()  
        {  
            await _dbContainer.StartAsync();  
        }  

        public async Task DisposeAsync()  
        {  
            await _dbContainer.StopAsync();  
        }  

        [Fact]  
        public async Task Should_Insert_And_Retrieve_Data()  
        {  
            var options = new DbContextOptionsBuilder<ApplicationDbContext>()  
                .UseSqlServer(_dbContainer.GetConnectionString())  
                .Options;  

            using (var context = new ApplicationDbContext(options))  
            {  
                // 确保数据库已创建  
                await context.Database.EnsureCreatedAsync();  

                // 准备  
                var entity = new SampleEntity { Name = "Test Entity" };  
                context.Add(entity);  
                await context.SaveChangesAsync();  

                // 执行操作  
                var retrievedEntity = await context.SampleEntities.FindAsync(entity.Id);  

                // 断言:  
                Assert.NotNull(retrievedEntity);  
                Assert.Equal("Test Entity", retrievedEntity.Name);  
            }  
        }  
    }  

    public class ApplicationDbContext : DbContext  
    {  
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { }  

        public DbSet<SampleEntity> SampleEntities { get; set; }  
    }  

    public class SampleEntity  
    {  
        public int Id { get; set; }  
        public string Name { get; set; }  
    }
运行测试程序

要运行测试,只需在终端中输入 dotnet test 命令。测试将会启动一个运行 SQL Server 的 Docker 容器实例,,在此实例上运行集成测试,最后关闭该容器。

使用Testcontainers的好处
  • 真实的测试环境: 与模拟不同,Testcontainers 提供了一个接近生产环境的真实世界环境,确保您的测试更准确、更可靠。
  • 捕获真实问题: 通过在测试中使用实际的服务(如 SQL Server),您更可能发现数据完整性、连接处理等模拟可能遗漏的问题。
  • 简化启动和清理: Testcontainers 自动化了服务的启动和清理,减少了测试中管理外部依赖的开销。
  • 跨平台一致性: 由于 Docker 容器与平台无关,您的测试将在不同环境(如开发、CI/CD 等)中保持一致。
引用

你可以在这里找到更多的用例和示例:这里

通过在测试中使用Docker容器,您可以在开发早期捕获潜在问题,从而构建更健壮且更适合生产的应用程序。虽然模拟在单元测试中仍然有用,但对于需要准确集成外部服务的情形而言,Testcontainers则是必不可少的。

从今天起将Testcontainers(一个测试工具)融入您的测试策略,确保您的.NET应用程序能够应对现实环境!

我相信这些信息对您来说很有价值。🌟 祝您学习愉快,收获满满!

📚 想了解更多这样的见解,欢迎 👏 点关注 👉 Merwan Chinta

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消