Testcontainers: integraatiotestit oikealla tietokannalla
Käynnistä PostgreSQL Dockerissa Testcontainersilla ja suorita integraatiotestejä oikeaa tietokantaa vasten.
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.
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
- Parametrisoidut testit @CsvSource- ja @MethodSource-annotaatioilla
- Mockito edistyneesti: argumenttikaappaajat ja vakoilijat
- Spring Boot -testiviipaleet: @WebMvcTest ja @DataJpaTest
- Testcontainers: integraatiotestit oikealla tietokannalla