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;34class PaymentServiceTest {5static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:15").withDatabaseName("testdb").withUsername("test").withPassword("test");67@Test8void testPaymentDeduction() {9// Test başında otomatik başlar10String jdbcUrl = postgres.getJdbcUrl();1112// Veritabanına bağlan13Connection conn = DriverManager.getConnection(14jdbcUrl, "test", "test"15);1617// Kullanıcı ekle: ID=1, Bakiye=10018conn.createStatement().execute(19"INSERT INTO users (id, balance) VALUES (1, 100)"20);2122// Ödeme servisi çağır23PaymentService service = new PaymentService(conn);24boolean success = service.deductBalance(1, 30);2526// Sonuç kontrol et27assert success;2829ResultSet rs = conn.createStatement().executeQuery("SELECT balance FROM users WHERE id=1");30rs.next();31assert rs.getInt("balance") == 70; // 100 - 3032}33}Çıktı:
1Test başarılı.2PostgreSQL konteyneri başlatıldı: localhost:327683Test bitti, konteynir silindi.| Özellik | Gerçek DB (Testcontainers) | Mock |
|---|---|---|
| Hız | Yavaş | Hızlı |
| Güvenilirlik | Yüksek | Düşük |
| Gerçekçilik | Tam | Kısmi |
| Kurulum | Kolay | Çok kolay |
Sonuç: Entegrasyon testleri için Testcontainers kullan. Unit testlerde mock yeterlidir.
5 yorum
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
aynen mockla uğraşırken sonra productionda farklı davranış görüyorsun ya testcontainersla en azından o sürprizlerden kurtuluyorsun
evet ya mock testler geçiyor diye productionda patlaması çok sinir bozucu testcontainers
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
transaction timeout işte tam bu yüzden ya mockta hiç yoktu bu tarz problemler veritabanı