Pengujian integrasi di SpringBoot dengan starter TestContainers

Terjemahan artikel disiapkan untuk mengantisipasi dimulainya kursus "Pengembang di Kerangka Musim Semi" .








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







All Articles