You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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,但可以通过以下步骤实现需求:

  1. 先正常用MsSqlBuilder构建并启动容器:
var mssqlContainer = new MsSqlBuilder()
    .WithPassword("YourStrong!Passw0rd")
    .WithImage("mcr.microsoft.com/mssql/server:2022-latest")
    .Build();

await mssqlContainer.StartAsync();
  1. 拿到容器的连接字符串,连接到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 14:02:33