Java Academy · Pelajaran

Testcontainers: Ujian Integrasi Pangkalan Data Sebenar

Mulakan PostgreSQL dalam Docker dengan Testcontainers dan jalankan ujian integrasi terhadap pangkalan data sebenar.

Pelajaran 4 daripada 413 langkah

Testcontainers: Ujian Integrasi Pangkalan Data Sebenar ialah pelajaran Java Academy percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Java Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Java Academy merangkumi sejumlah 4 pelajaran.

Mengapa Testcontainers?

Pangkalan data dalam memori H2 tidak menyokong ciri khusus PostgreSQL seperti JSON, carian teks penuh dan ON CONFLICT. Testcontainers melancarkan kontena Docker sebenar semasa ujian, lalu menyediakan pangkalan data yang sepadan dengan persekitaran pengeluaran.

Menambah Kebergantungan Testcontainers

Tambahkan BOM Testcontainers dan modul PostgreSQL ke dalam fail binaan Anda. Spring Boot 3.1+ menyertakan versi Testcontainers yang diuruskan.

// 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 dan @Container

Anotasikan kelas ujian dengan @Testcontainers dan isytiharkan kontena sebagai medan statik @Container. JUnit 5 memulakan dan menghentikannya secara automatik.

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

Mengkonfigurasi DataSource daripada Kontena

Gunakan @DynamicPropertySource untuk menyuntik port dinamik dan kelayakan kontena ke dalam konfigurasi DataSource Spring.

@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 ServiceConnection

Spring Boot 3.1+ mengkonfigurasi DataSource secara automatik daripada bean Testcontainers @Container yang dianotasi dengan @ServiceConnection — @DynamicPropertySource tidak diperlukan.

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

Corak Bekas Tunggal

Memulakan bekas untuk setiap kelas ujian adalah perlahan. Kongsi satu bekas merentas semua ujian menggunakan medan statik dengan Startables.deepStart() atau kelas asas abstrak.

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);
    }
}

Menguji Ciri Khusus PostgreSQL

Dengan Testcontainers, anda boleh menguji lajur JSON, operator JSONB, carian teks penuh dan ON CONFLICT DO UPDATE — perkara yang mustahil dilakukan dengan H2.

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

Berbilang Bekas: Compose

Gunakan DockerComposeContainer untuk menjalankan tindanan penuh (Postgres + Redis + Kafka) bagi ujian integrasi yang memerlukan berbilang perkhidmatan.

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

Ryuk: Pembersihan Automatik

Testcontainers menggunakan bekas Ryuk untuk menghentikan dan mengalih keluar bekas secara automatik apabila JVM keluar — walaupun apabila ujian gagal, sekali gus mengelakkan bekas tertinggal.

@SpringBootTest dengan Testcontainers

Gunakan @SpringBootTest dan bukannya @DataJpaTest untuk menguji keseluruhan tindanan aplikasi (pengawal, perkhidmatan, repositori) terhadap bekas Postgres sebenar.

@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());
    }
}

Pencachean Imej Bekas

Testcontainers menyimpan imej Docker yang dimuat turun dalam cache setempat. Muat turun imej dalam CI sebelum ujian dijalankan (docker pull postgres:16-alpine) untuk mengelakkan overhed muat turun semasa ujian dijalankan.

Semakan Pantas

Anotasi manakah yang menyambungkan bekas Testcontainers secara automatik kepada DataSource Spring dalam Spring Boot 3.1+?

Imbas Kembali

Testcontainers menjalankan bekas Docker sebenar untuk ujian integrasi. Gunakan @Container + @DynamicPropertySource atau @ServiceConnection (Boot 3.1+). Kongsi bekas merentas ujian dengan corak bekas tunggal. Uji ciri khusus PostgreSQL yang mustahil dilakukan dengan H2.

Percuma untuk bermula

Pelajari Java dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
104
Pelajaran
374

Soalan Lazim

Adakah pelajaran “Testcontainers: Ujian Integrasi Pangkalan Data Sebenar” percuma?

Ya — teks penuh “Testcontainers: Ujian Integrasi Pangkalan Data Sebenar” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Java Academy, tingkat taraf kepada CoddyKit PRO. Kursus Java Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Testcontainers: Ujian Integrasi Pangkalan Data Sebenar”?

Mulakan PostgreSQL dalam Docker dengan Testcontainers dan jalankan ujian integrasi terhadap pangkalan data sebenar. Anda berlatih Java Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Java Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Java Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.

Berapa lamakah pelajaran “Testcontainers: Ujian Integrasi Pangkalan Data Sebenar” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Java Academy ini?

Ya. Setiap pelajaran Java Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Ujian Berparameter dengan @CsvSource dan @MethodSource
  2. Mockito Lanjutan: Penangkap Argumen dan Spy
  3. Slaid Ujian Spring Boot: @WebMvcTest dan @DataJpaTest
  4. Testcontainers: Ujian Integrasi Pangkalan Data Sebenar
← Kembali ke Java Academy