Salah satu alasan popularitas Spring dan Spring Boot adalah dukungan pengujian yang baik . Anda dapat menulis kedua pengujian unit dengan Mockito tanpa menggunakan fungsionalitas Spring, dan pengujian integrasi dengan inisialisasi konteks Spring.
Tes integrasi mungkin memerlukan interaksi dengan layanan eksternal seperti database relasional, database NoSQL, Kafka, dan lainnya. Saat menguji, akan lebih mudah untuk menerapkan layanan ini di kontainer Docker.
Penguji
Dari dokumentasi Testcontainers:
TestContainers adalah pustaka Java yang mendukung pengujian JUnit dengan menyediakan instance ringan dan sementara untuk database populer, browser web dengan Selenium, dan apa pun yang dapat berjalan di container Docker.
Dengan menggunakan Testcontainers, Anda dapat meluncurkan container Docker Singleton sebagai berikut:
@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()
}
}
Karena ini cukup sering digunakan, starter dibuat oleh komunitas untuk menyederhanakan hidup komunitas - Testcontainers Spring Boot Starter .
Testcontainers SpringBoot Starter
Testcontainers - Starter bergantung pada spring-cloud-starter . Jika aplikasi Anda tidak menggunakan permulaan SpringCloud, maka Anda perlu menambahkan spring-cloud-starter sebagai ketergantungan pengujian.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
<scope>test</scope>
</dependency>
Dan juga menambahkan perpustakaan untuk database. Misalnya, jika Anda ingin menggunakan Postgresql:
<dependency>
<groupId>com.playtika.testcontainers</groupId>
<artifactId>embedded-postgresql</artifactId>
<scope>test</scope>
</dependency>
Saat ditambahkan
embedded-postgresqlke lingkungan, properti berikut akan tersedia:
embedded.postgresql.port
embedded.postgresql.host
embedded.postgresql.schema
embedded.postgresql.user
embedded.postgresql.password
Mereka dapat digunakan untuk menyiapkan sumber data.
Biasanya, kontainer Docker hanya digunakan untuk pengujian integrasi, bukan pengujian unit. Dengan bantuan profil, kami dapat menonaktifkannya secara default dan mengaktifkannya hanya untuk uji integrasi.
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}
Sekarang Anda dapat menjalankan pengujian integrasi dengan profil pengujian integrasi menggunakan
@ActiveProfiles:
@SpringBootTest
@ActiveProfiles("integration-test")
class UserServiceIntegrationTest {
@Autowired
private UserService userService;
@Test
void shouldGetAllUsers() {
// test userService.getAllUsers()
}
}
Anda dapat menentukan versi tertentu dari gambar buruh pelabuhan sebagai berikut:
src/test/resources/bootstrap-integration-test.properties
embedded.postgresql.dockerImage=postgres:10.7
embedded.postgresql.enabled=true
Starter testcontainers sudah memberikan dukungan untuk container paling populer seperti Postgresql, MariaDB, MongoDB, Redis, RabbitMQ, Kafka, Elasticsearch, dan banyak lagi.
Anehnya, saat ini tidak ada dukungan langsung untuk MySQL. Meskipun ada solusi sederhana untuk ini seperti yang dijelaskan di sini
Refactoring kode aplikasi di Spring