如何获取Testcontainers创建的MS SQL容器连接串并覆盖配置
解决Testcontainers MSSQL容器连接字符串获取与配置覆盖问题
一、从Docker Desktop获取连接字符串
- 打开Docker Desktop,进入Containers页面找到目标MSSQL测试容器
- 点击容器进入详情页,切换到Inspect标签:
- 在
NetworkSettings.Ports下找到宿主机映射的端口(容器内默认是1433端口,映射到宿主机随机端口) - 在
Config.Env中确认用户名(默认是sa)和你设置的密码
- 在
- 手动拼接连接字符串:
注:Server=localhost,<宿主机映射端口>;Database=master;User Id=sa;Password=Sup3r.Str0ng.P4ss;TrustServerCertificate=True;TrustServerCertificate=True是测试环境必需,用于跳过SSL证书验证。
二、通过C#代码获取并覆盖配置
你的现有代码存在异步方法未等待的问题,容器未完全启动就执行后续操作会导致连接失败,先修正并获取连接串:
1. 修正测试代码,直接获取连接串
[Given("a valid file request (.*)")] public async Task GivenAValidFileUploaded(string fileName) // 改为异步方法 { var testcontainersBuilder = new TestcontainersBuilder<MsSqlTestcontainer>() .WithDatabase(new MsSqlTestcontainerConfiguration { Password = "Sup3r.Str0ng.P4ss" }); var testContainer = testcontainersBuilder.Build(); await testContainer.StartAsync(); // 等待容器启动完成 // 直接从Testcontainer实例获取封装好的连接字符串 string connectionString = testContainer.ConnectionString; var body = GetFile(fileName); _scenarioContext.Set(body, "Body"); _scenarioContext.Set(connectionString, "TestDbConnection"); // 存入上下文供后续步骤使用 }
2. 覆盖appsettings.json配置
如果你的测试依赖配置文件中的连接串,可以通过以下方式覆盖:
- 若使用ASP.NET Core测试的
WebApplicationFactory,可在工厂内修改配置:
public class CustomWebApplicationFactory<TStartup> : WebApplicationFactory<TStartup> where TStartup : class { public string TestDbConnectionString { get; set; } protected override void ConfigureWebHost(IWebHostBuilder builder) { builder.ConfigureAppConfiguration(config => { // 覆盖指定的连接串配置项 config.AddInMemoryCollection(new Dictionary<string, string> { { "ConnectionStrings:YourDbKey", TestDbConnectionString } }); }); } }
- 也可以在使用Dapper的直接逻辑中,跳过配置读取,直接使用从
ScenarioContext取出的connectionString。
三、关键注意事项
- 必须等待
StartAsync()执行完成后再获取连接串,否则容器未就绪会引发连接错误 MsSqlTestcontainer已封装ConnectionString属性,无需手动拼接,该属性自动包含TrustServerCertificate=True- 测试完成后建议调用
await testContainer.StopAsync()释放容器资源
内容的提问来源于stack exchange,提问作者Pikachuuuu
相关产品推荐
相关产品推荐

