Skip to content

1.18.0

Compare
Choose a tag to compare
@github-actions github-actions released this 04 Apr 06:16
· 1279 commits to refs/heads/main since this release
a2ac6fd

Core module

  • Modules images such as MySQLContainer are now automatically compatible with their corresponding images with the library prefix
MySQLContainer<?> mysql = new MySQLContainer<>("library/mysql");
  • testcontainers/vnc has been bumped to version 1.3.0, which brings ARM support.
  • Goodbye to the whale in the logs. In order to provide an easy way to filter container logs the tc prefix has been added to display all container logs or tc.<image-name:tag> for a specific one. Check the logging docs.
  • There is a new WaitStrategy, ShellStrategy. It can also be used by calling Wait.forSuccessfulCommand(<command>)

New integration

Jib has been integrated to Testcontainers in order to take advantage of the nice API it provides to create containers

GenericContainer<?> busybox = new GenericContainer<>(
                new JibImage(
                    "busybox:1.35",
                    jibContainerBuilder -> {
                        return jibContainerBuilder.setEntrypoint("echo", "Hello World");
                    }
                )
            )
                .withStartupCheckStrategy(new OneShotStartupCheckStrategy().withTimeout(Duration.ofSeconds(3)))

New modules 🆕

CrateDB module

In order to use CrateDBContainer , declare the dependency in your pom.xml/build.gradle

<dependency>
    <groupId>org.testcontainers</groupId>
    <artifactId>cratedb</artifactId>
    <version>1.18.0</version>
    <scope>test</scope>
</dependency>
testImplementation "org.testcontainers:cratedb:1.18.0"

Choose a crate image version and use it as declared below with your postgres driver

CrateDBContainer cratedb = new CrateDBContainer("crate:5.2.5");

Solace Module

In order to use SolaceContainer , declare the dependency in your pom.xml/build.gradle

<dependency>
    <groupId>org.testcontainers</groupId>
    <artifactId>solace</artifactId>
    <version>1.18.0</version>
    <scope>test</scope>
</dependency>
testImplementation "org.testcontainers:solace:1.18.0"

Now, you can use a Solace PubSub running in a container and connecting via AMQP by doing the following:

SolaceContainer solace = new SolaceContainer("solace/solace-pubsub-standard:10.2");
solace.start();
Session session = createSession(
                solaceContainer.getUsername(),
                solaceContainer.getPassword(),
                solaceContainer.getOrigin(Service.AMQP)
            );

More information about SolaceContainer can be found in the documentation.

Container modules

CockroachDB

Starting with cockroachdb/cockroach:22.1.0, there is support for setting the username, password and database name via environment variables. Now, the Testcontainers module provides convenient setters:

CockroachContainer cockroach = new CockroachContainer("cockroachdb/cockroach:22.1.0")
    .withUsername("test_user")
    .withPassword("test_password")
    .withDatabaseName("test_database");

GCloud module

Google has released a new image which supports ARM and therefore BigtableEmulatorContainer, DatastoreEmulatorContainer, FirestoreEmulatorContainer, PubSubEmulatorContainer now support it as well.

So, if previously you were doing something like

DockerImageName.parse("gcr.io/google.com/cloudsdktool/google-cloud-cli:380.0.0-emulators")
    .asCompatibleSubstituteFor("gcr.io/google.com/cloudsdktool/cloud-sdk");

Now, you can simply do

DockerImageName.parse("gcr.io/google.com/cloudsdktool/google-cloud-cli:380.0.0-emulators");

JUnit Jupiter Module

@Testcontainers offers a new attribute parallel, which start those containers classes annotated by @Container

@Testcontainers(parallel = true)
class ParallelTest {

	@Container
private static final PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:15-alpine")
    .withCopyFileToContainer(MountableFile.forClasspathResource("db.sql"), "/docker-entrypoint-initdb.d/")
    .withNetwork(network)
    .withNetworkAliases("postgres");

@Container
private static final ToxiproxyContainer toxiproxy = new ToxiproxyContainer("ghcr.io/shopify/toxiproxy:2.5.0")
    .withNetwork(network);

}

Kafka Module

Self-managed or Kraft mode (a.k.a Zookeeperless) support has been added

KafkaContainer kafka = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:7.0.1")).withKraft()

LocalStack Module

SERVICES environment variable became optional in version 0.13.0 and instead LocalStack will initialize a service once the first request is served. So, nowadays LocalStackContainer can be used just like this:

LocalStackContainer localstack = new LocalStackContainer("localstack/localstack:2.0.0");

Also, LocalStack module supports version 2.0. It is highly recommended to use the latest version of LocalStack images.
Last but not least, dependency on AWS SDK V1 was dropped. So, that means by upgrading to version 1.18.0, the dependency can be removed if not used directly.

MongoDB Module

MongoDBContainer by default has been enabling ReplicaSet mode. Starting in this version, sharding has been added.

MongoDBContainer mongodb = new MongoDBContainer("mongo:6")
    .withSharding();

Selenium Module

Selenium 4 has built-in support for Microsoft Edge (which is based on Chromium) and now it is supported by BrowserWebDriverContainer as well:

BrowserWebDriverContainer<?> edge = new BrowserWebDriverContainer<>("selenium/standalone-edge:4.8.0")
    .withCapabilities(new EdgeOptions());

More

⚠️ Breaking API changes

  • Removed deprecated methods and undeclared transitive dependency to AWS SDK v1 (#5827) @AB-xdev
  • Move junit-jupiter-api's dependency configuration to implementation (#5985) @edysli

🚀 Features & Enhancements

  • Improve startup wait checks (#6384) @deejgregor
  • #6667: reset network creation state if network creation fails. (#6668) @k-wall
  • [Feature]: ShellStrategy, a new WaitStrategy (#6672) @m4rii0
  • feat: also check DOCKER_AUTH_CONFIG for registry auth config as an alternative to config.json (#6238) @roseo1
  • Ensure readability of MySQL and MariaDB config override (#6625) @famod
  • Bugfix: Log consumers are now called with exactly one complete log line (#5854) @SgtSilvio
  • ClickHouse uses new driver if it is available and version is compatible (#6236) @trolley813
  • Add devcontainer file (#6412) @eddumelendez
  • Add Docker image name to ContainerLaunchException message (#6408) @Donnerbart
  • Make sure we don't hide exceptions from waitUntilContainerStarted (#6167) @deejgregor
  • feat: enable reuse for mongodb (#6235) @tiboun
  • Avoid Pattern recompilation in log output processing (#6239) @dreis2211
  • Fixes the issue of missing root cause in container launch TimeoutException (e.g. SSLHandshakeException) (#5778) @cdanger

☠️ Deprecations

🐛 Bug Fixes

  • Short-circuit CompletableFuture returned by Startables#deepStart on exception (#5930) @pivovarit
  • fix: Don't return JSON auth config for partial registry name match (#6323) @kiview
  • Fix allowInsecure() on HttpWaitStrategy for non-localhost Docker daemon (#6314) @kiview