[Программирование, Java] Интеграционное тестирование в SpringBoot с TestContainers-стартером (перевод)
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Перевод статьи подготовлен в преддверии старта курса «Разработчик на Spring Framework».
Одна из причин популярности Spring и Spring Boot — это хорошая поддержка тестирования. Можно писать как юнит-тесты с Mockito без использования функциональности Spring’а, так и интеграционные с инициализацией Spring-контекста.
Для интеграционных тестов может потребоваться взаимодействие с внешними сервисами, такими как реляционные базы данных, NoSQL-базы данных, Kafka и другими. При тестировании удобно разворачивать эти сервисы в Docker-контейнерах.
Testcontainers
Из документации Testcontainers:
TestContainers — это Java-библиотека, которая поддерживает JUnit-тесты, предоставляя легкие, временные экземпляры для популярных баз данных, веб-браузеров с Selenium и всего остального, что может работать в Docker-контейнере.
С помощью Testcontainers запустить Singleton Docker-контейнер можно следующим образом:
@SpringBootTest
@ContextConfiguration(initializers = {UserServiceIntegrationTest.Initializer.class})
class UserServiceIntegrationTest {
private static PostgreSQLContainer sqlContainer;
static {
sqlContainer = new PostgreSQLContainer("postgres:10.7")
.withDatabaseName("integration-tests-db")
.withUsername("sa")
.withPassword("sa");
sqlContainer.start();
}
static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
TestPropertyValues.of(
"spring.datasource.url=" + sqlContainer.getJdbcUrl(),
"spring.datasource.username=" + sqlContainer.getUsername(),
"spring.datasource.password=" + sqlContainer.getPassword()
).applyTo(configurableApplicationContext.getEnvironment());
}
}
@Autowired
private UserService userService;
@Test
void shouldGetAllUsers() {
// test userService.getAllUsers()
}
}
Так как такое используется довольно часто, то для упрощения жизни сообществом был создан стартер — Testcontainers Spring Boot Starter.
Testcontainers SpringBoot Starter
Testcontainers--стартер зависит от spring-cloud-starter. Если в вашем приложении не используются SpringCloud-стартеры, то необходимо добавить spring-cloud-starter как test-зависимость.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
<scope>test</scope>
</dependency>
И также добавить библиотеку для базы данных. Например, если вы хотите использовать Postgresql:
<dependency>
<groupId>com.playtika.testcontainers</groupId>
<artifactId>embedded-postgresql</artifactId>
<scope>test</scope>
</dependency>
При добавлении embedded-postgresql в окружении будут доступны следующие свойства:
embedded.postgresql.port
embedded.postgresql.host
embedded.postgresql.schema
embedded.postgresql.user
embedded.postgresql.password
Их можно использовать для настройки источника данных (datasource).
Как правило, Docker-контейнеры используются только для интеграционных тестов, но не для юнит-тестов. С помощью профилей мы можем отключить их по умолчанию и включить только для интеграционных тестов.
src/test/resources/bootstrap.properties
embedded.postgresql.enabled=false
src/test/resources/bootstrap-integration-test.properties
embedded.postgresql.enabled=true
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://${embedded.postgresql.host}:${embedded.postgresql.port}/${embedded.postgresql.schema}
spring.datasource.username=${embedded.postgresql.user}
spring.datasource.password=${embedded.postgresql.password}
Теперь можно запускать интеграционные тесты с профилем integration-test с помощью @ActiveProfiles:
@SpringBootTest
@ActiveProfiles("integration-test")
class UserServiceIntegrationTest {
@Autowired
private UserService userService;
@Test
void shouldGetAllUsers() {
// test userService.getAllUsers()
}
}
Указать конкретную версию docker-образа можно следующим образом:
src/test/resources/bootstrap-integration-test.properties
embedded.postgresql.dockerImage=postgres:10.7
embedded.postgresql.enabled=true
Testcontainers-стартер уже обеспечивает поддержку наиболее популярных контейнеров, таких как Postgresql, MariaDB, MongoDB, Redis, RabbitMQ, Kafka, Elasticsearch и других.
На удивление, на данный момент нет прямой поддержки MySQL. Хотя для этого есть простое обходное решение, описанное здесь
Рефакторинг кода приложений на Spring
===========
Источник:
habr.com
===========
===========
Автор оригинала: SivaLabs
===========Похожие новости:
- [Программирование микроконтроллеров, Схемотехника, Производство и разработка электроники] Как я на спор в разработчики электроники попал
- [Программирование, Go] Указатель или копия структуры: что выгоднее использовать в Golang?
- [Программирование, Беспроводные технологии, Хакатоны, Интервью, IT-компании] Победитель хакатона: права на цифровое решение остались за нами
- [Open source, Системное администрирование, JavaScript, IT-инфраструктура] Решаем практические задачи в Zabbix с помощью JavaScript
- [Программирование, Серверное администрирование] Запуск Camunda BPM в Kubernetes (перевод)
- [Ruby, Python, Программирование] Как работают профайлеры в Ruby и Python?
- [Разработка под iOS, Swift] Создаем калькулятор на Swift 5
- [Java, Разработка под Android, Kotlin, Системы сборки] Композитная сборка как альтернатива buildSrc в Gradle
- [Занимательные задачки, Java, Управление персоналом, Конференции] Alfa Battle — как это было, запись конференции и список задач
- [Разработка веб-сайтов, JavaScript, Интерфейсы, ReactJS] Concurrent Mode в React: адаптируем веб-приложения под устройства и скорость интернета
Теги для поиска: #_programmirovanie (Программирование), #_java, #_spring, #_springboot, #_testcontainers, #_blog_kompanii_otus._onlajnobrazovanie (
Блог компании OTUS. Онлайн-образование
), #_programmirovanie (
Программирование
), #_java
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 23:49
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Перевод статьи подготовлен в преддверии старта курса «Разработчик на Spring Framework». Одна из причин популярности Spring и Spring Boot — это хорошая поддержка тестирования. Можно писать как юнит-тесты с Mockito без использования функциональности Spring’а, так и интеграционные с инициализацией Spring-контекста. Для интеграционных тестов может потребоваться взаимодействие с внешними сервисами, такими как реляционные базы данных, NoSQL-базы данных, Kafka и другими. При тестировании удобно разворачивать эти сервисы в Docker-контейнерах. Testcontainers Из документации Testcontainers:
TestContainers — это Java-библиотека, которая поддерживает JUnit-тесты, предоставляя легкие, временные экземпляры для популярных баз данных, веб-браузеров с Selenium и всего остального, что может работать в Docker-контейнере. С помощью Testcontainers запустить Singleton Docker-контейнер можно следующим образом: @SpringBootTest
@ContextConfiguration(initializers = {UserServiceIntegrationTest.Initializer.class}) class UserServiceIntegrationTest { private static PostgreSQLContainer sqlContainer; static { sqlContainer = new PostgreSQLContainer("postgres:10.7") .withDatabaseName("integration-tests-db") .withUsername("sa") .withPassword("sa"); sqlContainer.start(); } static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> { public void initialize(ConfigurableApplicationContext configurableApplicationContext) { TestPropertyValues.of( "spring.datasource.url=" + sqlContainer.getJdbcUrl(), "spring.datasource.username=" + sqlContainer.getUsername(), "spring.datasource.password=" + sqlContainer.getPassword() ).applyTo(configurableApplicationContext.getEnvironment()); } } @Autowired private UserService userService; @Test void shouldGetAllUsers() { // test userService.getAllUsers() } } Так как такое используется довольно часто, то для упрощения жизни сообществом был создан стартер — Testcontainers Spring Boot Starter. Testcontainers SpringBoot Starter Testcontainers--стартер зависит от spring-cloud-starter. Если в вашем приложении не используются SpringCloud-стартеры, то необходимо добавить spring-cloud-starter как test-зависимость. <dependency>
<groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter</artifactId> <scope>test</scope> </dependency> И также добавить библиотеку для базы данных. Например, если вы хотите использовать Postgresql: <dependency>
<groupId>com.playtika.testcontainers</groupId> <artifactId>embedded-postgresql</artifactId> <scope>test</scope> </dependency> При добавлении embedded-postgresql в окружении будут доступны следующие свойства: embedded.postgresql.port
embedded.postgresql.host embedded.postgresql.schema embedded.postgresql.user embedded.postgresql.password Их можно использовать для настройки источника данных (datasource). Как правило, Docker-контейнеры используются только для интеграционных тестов, но не для юнит-тестов. С помощью профилей мы можем отключить их по умолчанию и включить только для интеграционных тестов. src/test/resources/bootstrap.properties embedded.postgresql.enabled=false
src/test/resources/bootstrap-integration-test.properties embedded.postgresql.enabled=true
spring.datasource.driver-class-name=org.postgresql.Driver spring.datasource.url=jdbc:postgresql://${embedded.postgresql.host}:${embedded.postgresql.port}/${embedded.postgresql.schema} spring.datasource.username=${embedded.postgresql.user} spring.datasource.password=${embedded.postgresql.password} Теперь можно запускать интеграционные тесты с профилем integration-test с помощью @ActiveProfiles: @SpringBootTest
@ActiveProfiles("integration-test") class UserServiceIntegrationTest { @Autowired private UserService userService; @Test void shouldGetAllUsers() { // test userService.getAllUsers() } } Указать конкретную версию docker-образа можно следующим образом: src/test/resources/bootstrap-integration-test.properties embedded.postgresql.dockerImage=postgres:10.7
embedded.postgresql.enabled=true Testcontainers-стартер уже обеспечивает поддержку наиболее популярных контейнеров, таких как Postgresql, MariaDB, MongoDB, Redis, RabbitMQ, Kafka, Elasticsearch и других. На удивление, на данный момент нет прямой поддержки MySQL. Хотя для этого есть простое обходное решение, описанное здесь Рефакторинг кода приложений на Spring =========== Источник: habr.com =========== =========== Автор оригинала: SivaLabs ===========Похожие новости:
Блог компании OTUS. Онлайн-образование ), #_programmirovanie ( Программирование ), #_java |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 23:49
Часовой пояс: UTC + 5