Unit tests with real dependencies

Testcontainers is an open source library for providing throwaway, lightweight instances of databases, message brokers, web browsers, or just about anything that can run in a Docker container.
How it works

Test dependencies as code

No more need for mocks or complicated environment configurations. Define your test dependencies as code, then simply run your tests and containers will be created and then deleted.

With support for many languages and testing frameworks, all you need is Docker.

GenericContainer redis = new GenericContainer("redis:5.0.3-alpine")
    .withExposedPorts(6379);
container, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{
    ContainerRequest: testcontainers.ContainerRequest{
        Image:        "redis:5.0.3-alpine",
        ExposedPorts: []string{"6379/tcp"},
        WaitingFor:   wait.ForLog("Ready to accept connections"),
    },
    Started:          true,
})
RedisContainer redisContainer = new RedisBuilder().Build();
await redisContainer.StartAsync();
const redis = await new GenericContainer("redis:5.0.3-alpine")
    .withExposedPorts(6379)
    .withWaitStrategy(Wait.forLogMessage("Ready to accept connections"))
    .start();
redis = (
    DockerContainer("redis:5.0.3-alpine")
        .with_exposed_ports(6379)
)
redis.start()
wait_for_logs(redis, "Ready to accept connections")
let redis = GenericImage::new("redis", "7.2.4")
    .with_exposed_port(6379)
    .with_wait_for(WaitFor::message_on_stdout("Ready to accept connections"))
    .start();
redis <-
  run $
    containerRequest (TestContainers.fromTag "redis:5.0.3-alpine")
      & setExpose ["6379/tcp"]
      & setWaitingFor (waitUntilMappedPortReachable "6379/tcp")
redis = Testcontainers::DockerContainer.new("redis:5.0.3-alpine").with_exposed_port(6379)
redis.start
(def container (-> (tc/create {:image-name "redis:5.0.3-alpine")
                               :exposed-ports [6379]})
                   (tc/start!)))
{:ok, _} = Testcontainers.start_link()
config = %Testcontainers.Container{image: "redis:5.0.3-alpine"}
{:ok, container} = Testcontainers.start_container(config)
Modules

Test Anything You Can Containerize: Database, Message Broker, And More

Use cases

How Testcontainers® can help you

Data access layer integration tests

Use a containerized instance of your database to test your data access layer code for complete compatibility, without requiring a complex setup on developer machines. Trust that your tests will always start with a known state.

UI/Acceptance tests

Use containerized web browsers, compatible with Selenium, to run automated UI tests. Each test gets a fresh, clean instance of the browser, without having to worry about variations in plugins or required updates.

Application integration tests

Run your application in a short-lived test mode with dependencies, such as databases, message queues or web servers, to give you a rich interactive and explorative testing environment.
Get started

Supported Languages

There are implementations of Testcontainers® in all of your favorite languages. Click through to read their specific documentation.
Industry standard

Companies using Testcontainers