Java Academy · Oppitunti

Testcontainers: integraatiotestit oikealla tietokannalla

Käynnistä PostgreSQL Dockerissa Testcontainersilla ja suorita integraatiotestejä oikeaa tietokantaa vasten.

Oppitunti 4/413 vaihetta

Testcontainers: integraatiotestit oikealla tietokannalla on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Java Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Java Academy-kurssilla on yhteensä 4 oppituntia.

Miksi Testcontainers?

H2:n muistissa toimivat tietokannat eivät tue PostgreSQL-kohtaisia ominaisuuksia, kuten JSONia, kokotekstihakua ja ON CONFLICT -lauseketta. Testcontainers käynnistää testien ajaksi oikeat Docker-kontit, joten käytössänne on tuotantoa vastaava tietokanta.

Testcontainers-riippuvuuden lisääminen

Lisätkää Testcontainers BOM ja PostgreSQL-moduuli build-tiedostoon. Spring Boot 3.1+ sisältää hallitun Testcontainers-version.

// build.gradle:
testImplementation "org.testcontainers:junit-jupiter"
testImplementation "org.testcontainers:postgresql"
// Optionally use Spring Boot Testcontainers support:
testImplementation "org.springframework.boot:spring-boot-testcontainers"

@Testcontainers ja @Container

Merkitkää testiluokka @Testcontainers-annotaatiolla ja määritelkää kontti staattiseksi @Container-kentäksi. JUnit 5 käynnistää ja pysäyttää sen automaattisesti.

@Testcontainers
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class UserRepositoryIntegrationTest {
    @Container
    static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:16-alpine")
        .withDatabaseName("testdb")
        .withUsername("test")
        .withPassword("test");
}

DataSourcen määrittäminen kontin perusteella

Käyttäkää @DynamicPropertySource-annotaatiota kontin dynaamisen portin ja tunnistetietojen siirtämiseen Springin DataSource-asetuksiin.

@DynamicPropertySource
static void configureProperties(DynamicPropertyRegistry registry) {
    registry.add("spring.datasource.url",      postgres::getJdbcUrl);
    registry.add("spring.datasource.username", postgres::getUsername);
    registry.add("spring.datasource.password", postgres::getPassword);
}

Spring Boot 3.1:n ServiceConnection

Spring Boot 3.1+ määrittää DataSourcen automaattisesti Testcontainersin @Container-beanista, joka on merkitty @ServiceConnection-annotaatiolla — @DynamicPropertySource-määrittelyä ei tarvita.

@Bean
@ServiceConnection
static PostgreSQLContainer<?> postgresContainer() {
    return new PostgreSQLContainer<>("postgres:16-alpine");
}

Singleton-konttimalli

Kontin käynnistäminen jokaista testiluokkaa varten on hidasta. Jakakaa yksi kontti kaikkien testien kesken käyttämällä staattista kenttää ja Startables.deepStart()-kutsua tai abstraktia kantaluokkaa.

abstract class AbstractIntegrationTest {
    @Container
    static final PostgreSQLContainer<?> POSTGRES =
        new PostgreSQLContainer<>("postgres:16-alpine").withReuse(true);
    static { POSTGRES.start(); }
    @DynamicPropertySource
    static void props(DynamicPropertyRegistry r) {
        r.add("spring.datasource.url",      POSTGRES::getJdbcUrl);
        r.add("spring.datasource.username", POSTGRES::getUsername);
        r.add("spring.datasource.password", POSTGRES::getPassword);
    }
}

PostgreSQL-kohtaisten ominaisuuksien testaaminen

Testcontainersin avulla voitte testata JSON-sarakkeita, JSONB-operaattoreita, kokotekstihakua ja ON CONFLICT DO UPDATE -lausetta — H2:lla se ei ole mahdollista.

@Test
void jsonb_search_works() {
    // Insert row with JSONB column, then query
    List<Event> logins = repo.findByType("login");
    assertEquals(1, logins.size());
}

Useita kontteja: Compose

Käyttäkää DockerComposeContainer-luokkaa koko pinon (Postgres + Redis + Kafka) käynnistämiseen, kun integraatiotestit vaativat useita palveluita.

@Container
static DockerComposeContainer<?> compose = new DockerComposeContainer<>(
    new File("src/test/resources/docker-compose.yml"))
    .withExposedService("postgres", 5432)
    .withExposedService("redis", 6379);

Ryuk: automaattinen siivous

Testcontainers käyttää Ryuk-konttia pysäyttämään ja poistamaan kontit automaattisesti JVM:n sulkeutuessa — myös testin epäonnistuessa, mikä estää konttien jäämisen käyntiin.

@SpringBootTest Testcontainersin kanssa

Käyttäkää @SpringBootTest-annotaatiota @DataJpaTest-annotaation sijaan testataksenne koko sovelluspinon (ohjaimet, palvelut ja repositoriot) oikeaa Postgres-konttia vasten.

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@Testcontainers
class FullIntegrationTest extends AbstractIntegrationTest {
    @LocalServerPort int port;
    @Autowired TestRestTemplate rest;
    @Test
    void end_to_end_user_creation() {
        ResponseEntity<UserDto> r = rest.postForEntity("/api/users", createReq(), UserDto.class);
        assertEquals(HttpStatus.CREATED, r.getStatusCode());
    }
}

Konttikuvien välimuistitus

Testcontainers tallentaa ladatut Docker-kuvat paikallisesti välimuistiin. Ladatkaa kuvat CI-ympäristössä ennen testien suorittamista (docker pull postgres:16-alpine), jotta lataamiseen ei kulu aikaa testiajon aikana.

Pikatarkistus

Mikä annotaatio yhdistää Testcontainers-kontin automaattisesti Springin DataSourceen Spring Boot 3.1+:ssa?

Kertaus

Testcontainers suorittaa integraatiotestejä oikeissa Docker-konteissa. Käyttäkää yhdistelmää @Container + @DynamicPropertySource tai @ServiceConnection (Boot 3.1+). Jakakaa kontit testien kesken singleton-mallilla. Testatkaa PostgreSQL-kohtaisia ominaisuuksia, joita H2 ei tue.

Aloita maksutta

Opi Java tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
104
Oppitunnit
374

Usein kysytyt kysymykset

Onko oppitunti ”Testcontainers: integraatiotestit oikealla tietokannalla” ilmainen?

Kyllä – oppitunnin ”Testcontainers: integraatiotestit oikealla tietokannalla” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Java Academy-kurssin, päivitä CoddyKit PROhon. Java Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Testcontainers: integraatiotestit oikealla tietokannalla”?

Käynnistä PostgreSQL Dockerissa Testcontainersilla ja suorita integraatiotestejä oikeaa tietokantaa vasten. Harjoittelet Java Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Java Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Java Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”Testcontainers: integraatiotestit oikealla tietokannalla”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Java Academy-oppitunnilla?

Kyllä. Jokainen Java Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Parametrisoidut testit @CsvSource- ja @MethodSource-annotaatioilla
  2. Mockito edistyneesti: argumenttikaappaajat ja vakoilijat
  3. Spring Boot -testiviipaleet: @WebMvcTest ja @DataJpaTest
  4. Testcontainers: integraatiotestit oikealla tietokannalla
← Takaisin: Java Academy