Skip to content

Microsoft SQL Server

Microsoft SQL Server, also known as MSSQL, is a relational database engine developed by Microsoft and is a popular choice in enterprise systems.

Add the following dependency to your project file:

NuGet
1
dotnet add package Testcontainers.MsSql

You can start a MSSQL container instance from any .NET application. Here, we create different container instances and pass them to the base test class. This allows us to test different configurations.

1
2
3
4
5
6
7
8
[UsedImplicitly]
public sealed class MsSqlDefaultConfiguration : MsSqlContainerTest
{
    public MsSqlDefaultConfiguration()
        : base(new MsSqlBuilder().Build())
    {
    }
}

This example uses xUnit.net's IAsyncLifetime interface to manage the lifecycle of the container. The container is started in the InitializeAsync method before the test method runs, ensuring that the environment is ready for testing. After the test completes, the container is removed in the DisposeAsync method.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public Task InitializeAsync()
{
    return _msSqlContainer.StartAsync();
}

public Task DisposeAsync()
{
    return _msSqlContainer.DisposeAsync().AsTask();
}

[Fact]
[Trait(nameof(DockerCli.DockerPlatform), nameof(DockerCli.DockerPlatform.Linux))]
public void ConnectionStateReturnsOpen()
{
    // Given
    using DbConnection connection = new SqlConnection(_msSqlContainer.GetConnectionString());

    // When
    connection.Open();

    // Then
    Assert.Equal(ConnectionState.Open, connection.State);
}

[Fact]
[Trait(nameof(DockerCli.DockerPlatform), nameof(DockerCli.DockerPlatform.Linux))]
public async Task ExecScriptReturnsSuccessful()
{
    // Given
    const string scriptContent = "SELECT 1;";

    // When
    var execResult = await _msSqlContainer.ExecScriptAsync(scriptContent)
        .ConfigureAwait(true);

    // Then
    Assert.True(0L.Equals(execResult.ExitCode), execResult.Stderr);
    Assert.Empty(execResult.Stderr);
}

The test example uses the following NuGet dependencies:

1
2
3
4
5
<PackageReference Include="Microsoft.NET.Test.Sdk"/>
<PackageReference Include="coverlet.collector"/>
<PackageReference Include="xunit.runner.visualstudio"/>
<PackageReference Include="xunit"/>
<PackageReference Include="Microsoft.Data.SqlClient"/>

To execute the tests, use the command dotnet test from a terminal.

Tip

For the complete source code of this example and additional information, please refer to our test projects.

A Note To Developers

Once Testcontainers creates a server instance, developers may use the connection string with any of the popular data-access technologies found in the .NET ecosystem. Some of these libraries include Entity Framework Core, Dapper, and NHibernate. At which point, developers can execute database migrations and SQL scripts.