Mikroservis Entegrasyon Testleri: Gerçek DB mi Mock mi?

Mikroservis testlerinde iki yol vardır: gerçek bir veritabanına bağlanmak veya sahte (mock) veri kullanmak. Hangisi daha iyi? Cevap: ikisinin de yeri var, ama entegrasyon testleri için gerçek DB tercih edilir.

Sahte veriler hızlıdır ama veritabanı davranışını tam yansıtmaz. Gerçek DB ise yavaş olabilir ama güvenilir sonuç verir.

Testcontainers, her test için yalıtılmış, gerçek bir Docker konteyneri içinde veritabanı çalıştırır. Test bitti mi, konteynir silinir. Hızlı, güvenilir ve izole.

Bir ödeme servisi test edelim. Kullanıcı bakiyesi kontrol etmeli, sonra ödemeyi kaydetmeli.

1. Bağımlılık ekle:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1<dependency>
2<groupId>org.testcontainers</groupId>
3<artifactId>testcontainers</artifactId>
4<version>1.19.0</version>
5<scope>test</scope>
6</dependency>
7<dependency>
8<groupId>org.testcontainers</groupId>
9<artifactId>postgresql</artifactId>
10<version>1.19.0</version>
11<scope>test</scope>
12</dependency>

2. Test yazın:

1import org.testcontainers.containers.PostgreSQLContainer;
2import org.junit.jupiter.api.Test;
3
4class PaymentServiceTest {
5static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:15").withDatabaseName("testdb").withUsername("test").withPassword("test");
6
7@Test
8void testPaymentDeduction() {
9// Test başında otomatik başlar
10String jdbcUrl = postgres.getJdbcUrl();
11
12// Veritabanına bağlan
13Connection conn = DriverManager.getConnection(
14jdbcUrl, "test", "test"
15);
16
17// Kullanıcı ekle: ID=1, Bakiye=100
18conn.createStatement().execute(
19"INSERT INTO users (id, balance) VALUES (1, 100)"
20);
21
22// Ödeme servisi çağır
23PaymentService service = new PaymentService(conn);
24boolean success = service.deductBalance(1, 30);
25
26// Sonuç kontrol et
27assert success;
28
29ResultSet rs = conn.createStatement().executeQuery("SELECT balance FROM users WHERE id=1");
30rs.next();
31assert rs.getInt("balance") == 70; // 100 - 30
32}
33}

Çıktı:

1Test başarılı.
2PostgreSQL konteyneri başlatıldı: localhost:32768
3Test bitti, konteynir silindi.
ÖzellikGerçek DB (Testcontainers)Mock
HızYavaşHızlı
GüvenilirlikYüksekDüşük
GerçekçilikTamKısmi
KurulumKolayÇok kolay

Sonuç: Entegrasyon testleri için Testcontainers kullan. Unit testlerde mock yeterlidir.

bknz: Exception Handling: Try-Catch mi Result Pattern mi?

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz
  • gonyali

    testcontainers çok güzel her testte temiz veritabanı baştan başlaması gerçekten rahatlatıyor gerçek db kullanmak başında yavaş gibi gelse de mocktan

  • adlı kullanıcıya yanıt verdi
    kodkafasi

    aynen mockla uğraşırken sonra productionda farklı davranış görüyorsun ya testcontainersla en azından o sürprizlerden kurtuluyorsun

  • adlı kullanıcıya yanıt verdi
    gonyali

    evet ya mock testler geçiyor diye productionda patlaması çok sinir bozucu testcontainers

  • adlı kullanıcıya yanıt verdi
    kodkafasi

    ya bizim de böyle olmuştu mock testler hep yeşil ama canlıya geçince transaction timeout filan çıkıyor kontrol ettik sonra database constrainti

  • adlı kullanıcıya yanıt verdi
    gonyali

    transaction timeout işte tam bu yüzden ya mockta hiç yoktu bu tarz problemler veritabanı