Testcontainers: Pengujian Integrasi Basis Data Nyata
Jalankan PostgreSQL dalam Docker dengan Testcontainers dan lakukan pengujian integrasi terhadap basis data nyata.
Testcontainers: Pengujian Integrasi Basis Data Nyata adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.
Mengapa Testcontainers?
Basis data H2 dalam memori tidak mendukung fitur khusus PostgreSQL (JSON, pencarian teks lengkap, ON CONFLICT). Testcontainers menjalankan kontainer Docker nyata selama pengujian, sehingga menyediakan basis data yang identik dengan produksi.
Menambahkan Dependensi Testcontainers
Tambahkan BOM Testcontainers dan modul PostgreSQL ke berkas build Anda. Spring Boot 3.1+ menyertakan versi Testcontainers yang dikelola.
// 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
Anotasi kelas pengujian dengan @Testcontainers dan deklarasikan kontainer sebagai bidang statis @Container. JUnit 5 akan memulai dan menghentikannya secara otomatis.
@Testcontainers
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class UserRepositoryIntegrationTest {
@Container
static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:16-alpine")
.withDatabaseName("testdb")
.withUsername("test")
.withPassword("test");
}Mengonfigurasi DataSource dari Kontainer
Gunakan @DynamicPropertySource untuk menyuntikkan port dinamis dan kredensial kontainer ke 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+ mengonfigurasi DataSource secara otomatis dari bean Testcontainers @Container yang diberi anotasi @ServiceConnection — tidak perlu menggunakan @DynamicPropertySource.
@Bean
@ServiceConnection
static PostgreSQLContainer<?> postgresContainer() {
return new PostgreSQLContainer<>("postgres:16-alpine");
}Pola Kontainer Singleton
Menjalankan satu kontainer untuk setiap kelas pengujian membutuhkan waktu lama. Bagikan satu kontainer ke semua pengujian menggunakan bidang statis dengan Startables.deepStart() atau kelas dasar 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 Fitur Khusus PostgreSQL
Dengan Testcontainers, Anda dapat menguji kolom JSON, operator JSONB, pencarian teks lengkap, dan ON CONFLICT DO UPDATE — hal 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());
}Beberapa Kontainer: Compose
Gunakan DockerComposeContainer untuk menjalankan stack lengkap (PostgreSQL + Redis + Kafka) dalam pengujian integrasi yang memerlukan beberapa layanan.
@Container
static DockerComposeContainer<?> compose = new DockerComposeContainer<>(
new File("src/test/resources/docker-compose.yml"))
.withExposedService("postgres", 5432)
.withExposedService("redis", 6379);Ryuk: Pembersihan Otomatis
Testcontainers menggunakan kontainer Ryuk untuk menghentikan dan menghapus kontainer secara otomatis saat JVM berhenti — bahkan ketika pengujian gagal, sehingga mencegah kontainer tertinggal.
@SpringBootTest dengan Testcontainers
Gunakan @SpringBootTest, bukan @DataJpaTest, untuk menguji seluruh stack aplikasi (pengontrol, layanan, repositori) terhadap kontainer PostgreSQL nyata.
@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());
}
}Penyimpanan Citra Kontainer
Testcontainers menyimpan citra Docker yang diunduh secara lokal. Unduh citra di CI sebelum pengujian dijalankan (docker pull postgres:16-alpine) untuk menghindari beban pengunduhan selama proses pengujian.
Pemeriksaan Cepat
Anotasi apa yang menghubungkan kontainer Testcontainers secara otomatis ke DataSource Spring dalam Spring Boot 3.1+?
Ringkasan
Testcontainers menjalankan kontainer Docker nyata untuk pengujian integrasi. Gunakan @Container + @DynamicPropertySource atau @ServiceConnection (Boot 3.1+). Bagikan kontainer ke berbagai pengujian dengan pola singleton. Uji fitur khusus PostgreSQL yang mustahil dilakukan dengan H2.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Testcontainers: Pengujian Integrasi Basis Data Nyata” gratis?
Ya — teks lengkap “Testcontainers: Pengujian Integrasi Basis Data Nyata” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Testcontainers: Pengujian Integrasi Basis Data Nyata”?
Jalankan PostgreSQL dalam Docker dengan Testcontainers dan lakukan pengujian integrasi terhadap basis data nyata. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Java Academy?
Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Testcontainers: Pengujian Integrasi Basis Data Nyata” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?
Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Pengujian Berparameter dengan @CsvSource dan @MethodSource
- Mockito Tingkat Lanjut: Penangkap Argumen dan Spy
- Irisan Pengujian Spring Boot: @WebMvcTest dan @DataJpaTest
- Testcontainers: Pengujian Integrasi Basis Data Nyata