Entegrasyon testleri, yazılım bilesenlerinin birlikte calistigini dogrulayan kritik güvenlik agidir. Birim testler izolasyonla hiz kazanirken, entegrasyon testleri gerçek veya yakın-gerçek bağımlılıklar uzerinden sözleşme ihlallerini, veri tutarsizliklarini ve altyapi yapılandırma hatalarini yakalar. Ancak yanlış tasarlanmis entegrasyon testleri yavas, kararsiz ve bakimi zor hale gelir. Bu yazida saglam bir entegrasyon test stratejisi icin mimari kararlar, veritabanı yönetimi, HTTP mock ve gerçek sunucu dengesi ile CI pipeline entegrasyonunu inceliyoruz.
Entegrasyon testi ne zaman gerekir?
Asagidaki riskler birim testle tam kapanmaz: ORM mapping hatalari, transaction sınırları, HTTP istemci timeout davranisi, serilestirme formatlari, mesaj kuyrugu tuketici mantigi, cache invalidation. Bu senaryolarda en az iki gerçek bilesen bir arada calistirilmalidir. Entegrasyon testi birim testin yerine gecmez; piramidin orta katmanini doldurur.
Test turu seçimi icin karar agaci: Dis servis çağrısı var mi? Veritabanı yaziliyor mu? Birden fazla modül ayni transaction icinde mi? Evet cevaplari entegrasyon adayidir. Tüm bağımlılıklar mock ise bu hala birim test sinifina girer.
Test ortami modelleri
Gomulu veritabanı
SQLite in-memory veya Testcontainers ile geçici PostgreSQL container'i. Her test class'i icin schema migrate edilir; test sonunda veri temizlenir veya container yok edilir. Hiz ve izolasyon dengesi iyidir.
Paylasilan test ortami
Takım genelinde sabit bir staging veritabanı. Maliyet düşük ama izolasyon zayif; paralel testler birbirini etkiler. Yalnizca read-heavy veya idempotent senaryolarda veya legacy sistemlerde tercih edilir.
WireMock ve HTTP stub
Dis API'ler kontrol altinda tutulur. Gerçek odeme saglayicisi yerine WireMock sunucusu sabit JSON doner. Sözleşme testleri (Pact) tuketici ve saglayici uyumunu korur.
- Testcontainers: Gerçek PostgreSQL, Redis, Kafka davranisi; Docker zorunlu.
- LocalStack: AWS servislerinin yerel emulasyonu.
- WebApplicationFactory: ASP.NET Core uygulamasini test host'ta ayaga kaldirir.
- TestServer: HttpClient ile gerçek pipeline middleware zinciri test edilir.
Veritabanı stratejileri
Entegrasyon testlerinde en sik sorun veri izolasyonudur. Transaction rollback pattern'i her testi transaction icinde calistirir, sonunda geri alir; hızlı ama async commit veya çoklu connection gerektiren kodda calismayabilir.
Database per test class veya benzersiz schema adi paralel calistirmayi destekler. Flyway veya EF Core migrations her test kosusundan once veya container baslatildiginda uygulanir. Seed verisi minimal tutulur; her test kendi Arrange adiminda ihtiyaç duydugu kaydi oluşturur.
public class OrderIntegrationTests : IAsyncLifetime{private readonly PostgreSqlContainer _db = new PostgreSqlBuilder().Build();public async Task InitializeAsync(){await _db.StartAsync();await RunMigrations(_db.GetConnectionString());}[Fact]public async Task CreateOrder_PersistsLineItems(){await using var ctx = CreateDbContext();var order = OrderFactory.WithTwoItems();ctx.Orders.Add(order);await ctx.SaveChangesAsync();var loaded = await ctx.Orders.Include(o => o.Items).FirstAsync();Assert.Equal(2, loaded.Items.Count);}}HTTP ve API entegrasyonu
ASP.NET Core'da WebApplicationFactory ile gerçek middleware, routing, authentication ve validation pipeline test edilir. HttpClient uzerinden istek atilir; response status, header ve body assert edilir. Authentication icin test scheme veya JWT uretici kullanılır.
Dis servis bağımlılıkları icin iki yaklaşım vardir: tamamen mock HTTP server veya sandbox ortami. Odeme testlerinde sandbox API anahtarlari CI secret olarak saklanir; rate limit ve maliyet dikkate alinir. Mock tercih edildiginde sözleşme testi ile mock'un gerçek API ile uyumu periyodik dogrulanir.
Determinizm ve flaky onleme
Entegrasyon testleri zaman, rastgele ID ve async gecikme nedeniyle flaky olabilir. Sabit saat enjekte edin (IClock, TimeProvider). Guid veya snowflake ID ureticisi testte sabitlenir. Async bekleme icin polling with timeout kullanın; Thread.Sleep'ten kacinilin.
Paralel çalıştırma: xUnit collection fixture ile paylasilan container'lar gruplanir; ayni veritabanına yazan testler ayni collection'da seri kosar. Test parallelization ayarlari dokumante edilir.
Test verisi yönetimi
Factory ve builder pattern ile okunabilir test verisi uretilir. Anlamsiz "test1", "test2" stringleri yerine domain dilinde isimler kullanılır. Testler birbirinin verisine bağımlı olmamali; her test kendi preconditions'unu kurar.
- Arrange: Gerekli entity'leri oluştur.
- Act: Entegrasyon sinirini gecen işlemi tetikle.
- Assert: Kalıcı durumu ve yan etkileri dogrula.
- Cleanup: Container modelinde otomatik; paylasilan DB'de explicit delete.
Performans ve pipeline süreleri
Entegrasyon testleri birim testlerden 10-100 kat yavas olabilir. Hedef: PR pipeline'inda entegrasyon katmanı 5-15 dakika araliginda kalmali. Container image on-cache, migration sadece bir kez, gereksiz Sleep kaldirma ile optimize edilir.
Agir testler nightly'e tasinir veya shard'lara bolunur. Test impact analysis: değişen dosyalara gore ilgili entegrasyon subset'i calistirilir. Tam suite haftada bir zorunlu kosabilir.
Güvenlik ve gizli bilgiler
Test ortaminda production credential kullanılmaz. Connection string'ler environment variable veya CI secret'tan okunur. Loglarda hassas veri maskelenir. Test veritabanına üretim dump'i yuklenmez; GDPR ve güvenlik riski tasir. Sentetik veya anonimlestirilmis fixture kullanılır.
Monolith ve microservice farklari
Monolith'te WebApplicationFactory yeterli olabilir. Microservice'te servisler arasi çağrı entegrasyon testi icin docker-compose ile tüm bağımlılıklar ayaga kaldirilir veya test harness tek servisi digerlerini stub'layarak calistirir. Mesh ortamlarinda service virtualization maliyetleri artar; onceliklendirme kritiktir.
Olum kriterleri ve bakım
Entegrasyon testi silinmeli veya birimlestirilmeli eger: ayni senaryo E2E'de zaten varsa, 6 aydan uzun suredir başarısız ve ignore edildiyse, çalışma suresi 2 dakikayi geciyorsa ve deger katkisi dusukse. Her test icin "hangi riski kapatiyor?" sorusu PR review'da sorulur.
Raporlama ve gozlemlenebilirlik
Başarısız entegrasyon testi loglari ve container stdout CI artefact olarak saklanir. Retry yalnizca bilinen geçici ag hatalarinda sinirli kullanılır. Trend analizi: son 30 gunde hangi entegrasyon testleri en cok kirdi; altyapi mi kod mu sorumlu?
Mesaj kuyrugu ve event-driven test
Kafka veya RabbitMQ tuketici entegrasyon testlerinde test container veya embedded broker kullanılır. Publish edilen mesajin doğru topic'e gittigi ve consumer'in idempotent isledigi dogrulanir. Outbox pattern testinde transaction commit ile mesaj birlikte assert edilir. Zaman asimi ve dead letter queue senaryolari entegrasyon katmaninda yakalanir; birim testte bu akis tam simule edilemez.
Feature flag ve konfigurasyon
Entegrasyon testleri feature flag açık ve kapali durumlarinda ayri kosulabilir. IOptions snapshot veya test-specific appsettings.json ile konfigurasyon override edilir. Yanlış connection string veya eksik environment variable entegrasyon testinde hemen patlar; production'a cikmadan once yakalanir.
Test veritabanı migration stratejisi
Her CI kosusunda sifirdan migration uzun surerse snapshot schema veya hazir image kullanılır. Migration testi ayri job'da çalışır: bos DB'den son surume kadar tüm script'lerin hatasiz uygulandigi dogrulanir. Rollback script varsa down migration da test edilir.
Idempotency ve tekrarlayan istekler
REST API'lerde POST isteklerinin yanlislikla iki kez gonderilmesi cift kayıt veya cift odeme üretir. Entegrasyon testinde ayni Idempotency-Key header ile ard arda iki istek gonderilir; veritabanında tek kayıt, ikinci yanıt birinci ile tutarlı olmali. Outbox ve saga desenlerinde adim tekrari senaryosu zorunludur. Saga compensation dalinda rollback transaction ile mesaj silme birlikte assert edilir.
Distributed tracing ve correlation ID
Mikroservis entegrasyon testlerinde X-Correlation-Id header'i tüm servis loglarinda aranir. Test başarısız oldugunda correlation ID ile log zinciri tek satirda bulunur. OpenTelemetry span export opsiyoneldir; en azindan structured log assert yeterli olabilir. Spansiz debug entegrasyon hatasini saatlerce uzatir.
Readiness ve health check testleri
WebApplicationFactory ayaga kalktiktan sonra /health ve /ready endpoint'leri 200 donmeli. Veritabanı baglantisi kopukken ready 503 vermeli; Kubernetes probe davranisi simule edilir. Migration henuz uygulanmamis ortamda health degraded durumu beklenir. Bu testler release oncesi altyapi regresyonunu erken yakalar.
Connection pool ve timeout davranisi
Yüksek paralellikte connection pool tukenmesi entegrasyon testinde reproduce edilebilir. Kisa command timeout ile yavas sorgu timeout exception firlatmali. Retry policy gerçek HttpClient ile test edilir; test server gecikme enjekte eder. Circuit breaker acildiginda fallback çağrısı dogrulanir.
Entegrasyon test stratejisi doğru kuruldugunda birim testlerin yakalayamadigi gerçek dünya hatalarini erken yakalar, production guvenini artirir ve E2E yukunu makul seviyede tutar. Veritabanı izolasyonu, HTTP sozlesmesi yönetimi ve deterministik tasarım bu stratejinin uc temel diregidir.