Skip to content

PostgreSQL

PostgreSQL is a powerful, open-source relational database management system (RDBMS) used to store, manage, and retrieve structured data.

Add the following dependency to your project file:

NuGet
1
dotnet add package Testcontainers.PostgreSql

You can start a PostgreSQL container instance from any .NET application. To create and start a container instance with the default configuration, use the module-specific builder as shown below:

1
2
var postgreSqlContainer = new PostgreSqlBuilder("postgres:15.1").Build();
await postgreSqlContainer.StartAsync();

The following example utilizes the xUnit.net module to reduce overhead by automatically managing the lifecycle of the dependent container instance. It creates and starts the container using the module-specific builder and injects it as a shared class fixture into the test class.

 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
[Fact]
[Trait(nameof(DockerCli.DockerPlatform), nameof(DockerCli.DockerPlatform.Linux))]
public void ConnectionStateReturnsOpen()
{
    // Given
    using DbConnection connection = fixture.CreateConnection();

    // When
    connection.Open();

    // Then
    Assert.Equal(ConnectionState.Open, connection.State);
    Assert.Equal(fixture.Container.GetConnectionString(), fixture.Container.GetConnectionString(ConnectionMode.Host));
}

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

    // When
    var execResult = await fixture.Container.ExecScriptAsync(scriptContent, TestContext.Current.CancellationToken)
        .ConfigureAwait(true);

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

SSL

Use WithSsl to enable TLS and map the server certificates. Configure the client connection string with SslMode and (for validation) the CA certificate.

Note

When SSL is enabled, Testcontainers doesn't set the SSL mode for the connection string. You'll need to choose the SslMode and configure it yourself.

1
2
protected override PostgreSqlBuilder Configure()
    => base.Configure().WithSsl(ServerCertificateFilePath, ServerCertificateKeyFilePath, CaCertificateFilePath);
1
2
3
4
var connectionStringBuilder = new NpgsqlConnectionStringBuilder(base.ConnectionString);
connectionStringBuilder.SslMode = SslMode.VerifyCA;
connectionStringBuilder.RootCertificate = CaCertificateFilePath;
return connectionStringBuilder.ConnectionString;

VerifyFull and DNS SANs

SslMode=VerifyFull validates DNS SANs. Use a DNS host like localhost if you need full verification.

1
2
3
4
5
// Npgsql checks VerifyFull against DNS SANs, it's necessary to use "localhost" instead of
// the IP address. Testcontainers defaults to using the IP because of an old Docker bug
// with IPv4/IPv6 port mapping, where "localhost" might resolve to a different public port.
connectionStringBuilder.Host = "localhost";
connectionStringBuilder.SslMode = SslMode.VerifyFull;

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.v3"/>
<PackageReference Include="Npgsql"/>

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.