如何用MsSqlBuilder为.NET Core 7 Web API集成测试配置SQL Server数据库
.NET Core 7 Web API + SQL Server Testcontainers集成测试数据库初始化指南
一、数据库/架构的创建时机与位置
不用折腾底层Testcontainers类,直接在容器启动完成后,通过数据库连接执行初始化操作就行。常用两种方式:
- 在测试类的初始化方法里(比如xUnit的
IClassFixture的InitializeAsync,或者NUnit的SetUpAsync),拿到容器的连接字符串后,连接到master库执行创建数据库、架构、表的脚本。 - 把初始化逻辑封装成SQL脚本文件,在容器启动后读取文件内容执行,这种方式适合脚本较长的场景。
二、MsSqlBuilder的配置与脚本执行
MsSqlBuilder本身确实没提供直接创建自定义数据库的API,但可以通过以下步骤实现需求:
- 先正常用MsSqlBuilder构建并启动容器:
var mssqlContainer = new MsSqlBuilder() .WithPassword("YourStrong!Passw0rd") .WithImage("mcr.microsoft.com/mssql/server:2022-latest") .Build(); await mssqlContainer.StartAsync();
- 拿到容器的连接字符串,连接到master库执行初始化命令:
// 连接到master库 using var connection = new SqlConnection(mssqlContainer.GetConnectionString("master")); await connection.OpenAsync(); // 创建测试数据库 await using var createDbCmd = new SqlCommand("CREATE DATABASE TestApiDb;", connection); await createDbCmd.ExecuteNonQueryAsync(); // 切换到新数据库,创建架构和业务表 var initScript = @" USE TestApiDb; CREATE SCHEMA Core; CREATE TABLE Core.Products ( Id INT PRIMARY KEY IDENTITY(1,1), Name NVARCHAR(100) NOT NULL, Price DECIMAL(18,2) NOT NULL ); "; await using var initCmd = new SqlCommand(initScript, connection); await initCmd.ExecuteNonQueryAsync();
三、CREATE DATABASE指定FILENAME的存储位置
如果手动指定FILENAME,文件是存在容器内部的文件系统里,不是你本地机器的路径。SQL Server容器默认会把数据库文件放在/var/opt/mssql/data/(Linux镜像)或对应的Windows路径下,一般不需要手动指定,让SQL Server自动处理就行,除非你有特殊的存储需求。
四、能不能直接用master库?
技术上可行,但绝对不推荐。master是SQL Server的系统核心库,存的是系统配置、登录信息这些核心数据,直接在里面加业务表会污染系统环境,而且不符合生产环境的数据库隔离规范。创建独立的测试数据库,既能模拟真实环境,也不会干扰系统对象,测试结束销毁容器时也能彻底清理。
内容的提问来源于stack exchange,提问作者Terry
相关产品推荐
相关产品推荐

