0Pricing
Java Academy · Ders

Testcontainers: Gerçek Veritabanı Tümleştirme Testleri

Testcontainers ile Docker'da PostgreSQL başlatın ve tümleştirme testlerini gerçek bir veritabanına karşı çalıştırın.

Testcontainers: Gerçek Veritabanı Tümleştirme Testleri, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.

Testcontainers Neden Kullanılır?

Bellek içi H2 veritabanları PostgreSQL'e özgü özellikleri (JSON, tam metin araması, ON CONFLICT) desteklemez. Testcontainers, sınamalar sırasında gerçek Docker konteynerlerini başlatarak üretim ortamıyla aynı veritabanını kullanmanızı sağlar.

Testcontainers Bağımlılığını Ekleme

Testcontainers BOM'unu ve PostgreSQL modülünü derleme dosyanıza ekleyin. Spring Boot 3.1 ve sonraki sürümleri yönetilen bir Testcontainers sürümü içerir.

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

Sınama sınıfına @Testcontainers ek açıklamasını ekleyin ve konteyneri statik bir @Container alanı olarak tanımlayın. JUnit 5, konteyneri otomatik olarak başlatıp durdurur.

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

Konteynerden DataSource Yapılandırma

Konteynerin dinamik bağlantı noktasını ve kimlik bilgilerini Spring'in DataSource yapılandırmasına aktarmak için @DynamicPropertySource kullanın.

@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+, @ServiceConnection ile açıklanmış bir Testcontainers @Container nesnesinden DataSource'u otomatik olarak yapılandırır — @DynamicPropertySource gerekmez.

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

Tekil Kapsayıcı Deseni

Her sınama sınıfı için bir kapsayıcı başlatmak yavaştır. Startables.deepStart() kullanan statik bir alanla veya soyut bir temel sınıfla tek kapsayıcıyı tüm sınamalar arasında paylaşın.

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'e Özgü Özellikleri Sınama

Testcontainers ile JSON sütunlarını, JSONB işleçlerini, tam metin aramasını ve ON CONFLICT DO UPDATE işlemini sınayabilirsiniz — bunlar H2 ile mümkün değildir.

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

Birden Çok Kapsayıcı: Compose

Birden çok hizmet gerektiren tümleştirme sınamaları için tam yığını (Postgres + Redis + Kafka) çalıştırmak üzere DockerComposeContainer kullanın.

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

Ryuk: Otomatik Temizleme

Testcontainers, JVM sonlandığında kapsayıcıları otomatik olarak durdurup kaldırmak için bir Ryuk kapsayıcısı kullanır — sınama başarısız olsa bile kapsayıcı sızıntılarını önler.

Testcontainers ile @SpringBootTest

Gerçek bir Postgres kapsayıcısına karşı tüm uygulama yığınını (denetleyiciler, hizmetler, depolar) sınamak için @DataJpaTest yerine @SpringBootTest kullanın.

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

Kapsayıcı Görüntülerini Önbelleğe Alma

Testcontainers, indirilen Docker görüntülerini yerel olarak önbelleğe alır. Sınama çalıştırması sırasında indirme ek yükünü önlemek için sınamalar çalışmadan önce CI'da görüntüleri indirin (docker pull postgres:16-alpine).

Hızlı Kontrol

Spring Boot 3.1+ sürümünde hangi ek açıklama, bir Testcontainers kapsayıcısını Spring'in DataSource'una otomatik olarak bağlar?

Özet

Testcontainers, tümleştirme sınamaları için gerçek Docker kapsayıcıları çalıştırır. @Container + @DynamicPropertySource veya @ServiceConnection (Boot 3.1+) kullanın. Tekil kapsayıcı deseniyle kapsayıcıları sınamalar arasında paylaşın. H2 ile mümkün olmayan PostgreSQL'e özgü özellikleri sınayın.

Sıkça Sorulan Sorular

“Testcontainers: Gerçek Veritabanı Tümleştirme Testleri” dersi ücretsiz mi?

Evet — “Testcontainers: Gerçek Veritabanı Tümleştirme Testleri” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.

“Testcontainers: Gerçek Veritabanı Tümleştirme Testleri” dersinde ne öğreneceğim?

Testcontainers ile Docker'da PostgreSQL başlatın ve tümleştirme testlerini gerçek bir veritabanına karşı çalıştırın. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Java Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Testcontainers: Gerçek Veritabanı Tümleştirme Testleri” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. @CsvSource ve @MethodSource ile Parametreli Testler
  2. Mockito İleri Düzey: Bağımsız Değişken Yakalayıcıları ve Casuslar
  3. Spring Boot Test Dilimleri: @WebMvcTest ve @DataJpaTest
  4. Testcontainers: Gerçek Veritabanı Tümleştirme Testleri
← Java Academy Sayfasına Dön