Testcontainers — это библиотека для Java, которая позволяет запускать Docker-контейнеры в процессе выполнения тестов. Это особенно полезно для интеграционного тестирования, когда вам нужно протестировать взаимодействие вашего приложения с реальными внешними системами, такими как базы данных, очереди сообщений или другие сервисы. Testcontainers предоставляет легкий способ запуска таких зависимостей в изолированных контейнерах, что делает тесты более реалистичными и приближенными к production-среде.
Изоляция тестов
Каждый тест запускается в своем собственном контейнере, что обеспечивает изоляцию тестов друг от друга. Это исключает возможность влияния одного теста на другой.
Реалистичность тестов
Поскольку тесты выполняются с реальными системами (например, PostgreSQL, Kafka, Redis), вы можете быть уверены, что ваше приложение будет работать корректно в production-среде.
Простота настройки
Testcontainers автоматически управляет жизненным циклом контейнеров: создает их перед запуском тестов и удаляет после завершения.
Поддержка множества технологий
Testcontainers поддерживает множество популярных технологий, таких как базы данных (PostgreSQL, MySQL), очереди сообщений (Kafka, RabbitMQ), кэши (Redis) и многое другое.
Для начала необходимо добавить зависимость Testcontainers в ваш проект. Если вы используете Maven, добавьте следующий фрагмент в ваш pom.xml
:
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers</artifactId>
<version>1.19.0</version>
<scope>test</scope>
</dependency>
Для Gradle добавьте следующее в build.gradle
:
testImplementation 'org.testcontainers:testcontainers:1.19.0'
Testcontainers предоставляет готовые классы для работы с популярными технологиями. Например, для работы с PostgreSQL можно использовать класс PostgreSQLContainer
:
import org.testcontainers.containers.PostgreSQLContainer;
public class PostgresContainerTest {
private static final PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:13");
static {
postgres.start();
}
}
В этом примере контейнер с PostgreSQL версии 13 будет запущен перед выполнением тестов.
Теперь вы можете использовать контейнер в своих тестах. Например, вы можете подключиться к базе данных и выполнить некоторые операции:
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.PostgreSQLContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
@Testcontainers
public class PostgresContainerTest {
@Container
private static final PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:13");
@Test
public void testDatabaseConnection() throws Exception {
String jdbcUrl = postgres.getJdbcUrl();
String username = postgres.getUsername();
String password = postgres.getPassword();
try (Connection connection = DriverManager.getConnection(jdbcUrl, username, password);
Statement statement = connection.createStatement()) {
statement.execute("CREATE TABLE test (id SERIAL PRIMARY KEY, name VARCHAR(255))");
statement.execute("INSERT INTO test (name) VALUES ('John Doe')");
ResultSet resultSet = statement.executeQuery("SELECT * FROM test");
while (resultSet.next()) {
System.out.println(resultSet.getString("name"));
}
}
}
}
В этом примере:
Testcontainers интегрируется с JUnit 5 через аннотацию @Testcontainers
. Эта аннотация автоматически управляет жизненным циклом контейнеров:
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.PostgreSQLContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
@Testcontainers
public class PostgresContainerTest {
@Container
private static final PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:13");
@Test
public void testDatabaseConnection() {
String jdbcUrl = postgres.getJdbcUrl();
System.out.println("JDBC URL: " + jdbcUrl);
}
}
Testcontainers поддерживает множество других технологий. Например, для работы с Kafka можно использовать класс KafkaContainer
:
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.KafkaContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
@Testcontainers
public class KafkaContainerTest {
@Container
private static final KafkaContainer kafka = new KafkaContainer();
@Test
public void testKafkaConnection() {
String bootstrapServers = kafka.getBootstrapServers();
System.out.println("Kafka Bootstrap Servers: " + bootstrapServers);
}
}
Testcontainers — это мощный инструмент для интеграционного тестирования, который позволяет запускать Docker-контейнеры с реальными зависимостями (базы данных, очереди сообщений и т.д.) в процессе выполнения тестов. Основные преимущества:
Использование Testcontainers позволяет писать интеграционные тесты, которые максимально приближены к реальной production-среде, что повышает уверенность в корректности вашего приложения.