Otomasyon QABackend QA Mühendisi, Otomasyon QA Lideri

Dış hizmetlerle, örneğin üçüncü taraf API'ler veya veritabanları ile çalışırken otomatik testlerin izolasyonunu ve bağımsızlığını nasıl sağlarsınız?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Dış hizmetlerle testlerin izolasyonu, güvenilir otomasyonun zorunlu bir şartıdır.

Sorunun Tarihi: Erken otomasyon sistemleri, sıklıkla ya erişilemeyen ya da beklenmedik veriler döndüren dış API'lere ve DB'lere çarpıştı. Testlerin izolasyonu olmadan sonuçlar tekrar üretilemez: flicker, dış sorunlar nedeniyle çökmeler, rastgele hatalar.

Sorun:

  • Dış hizmetler genellikle istikrarsızdır: sözleşme değişebilir, veriler mevcut olmayabilir veya test yan etkiler oluşturabilir.
  • Sonucun öngörülebilirliği için dış yanıtın kontrol edilmesi ("dondurulması") gerekliliği.
  • Yavaş yanıtlar ve senaryoların yerel veya CI'da tekrar üretilememesi.

Çözüm:

  1. Dış API'lerin yanıtlarını simüle eden yerel "mock" ve "stub" kullanımı. Popüler olanlar arasında WireMock (Java), httpmock (Python), MockServer, TestContainers bulunmaktadır.

  2. Her testten önce temizlenip yeniden doldurulabilen in-memory çözümleri veya fixture'lar ile DB'nin taklit edilmesi.

  3. Test verisi ID'lerinin değişkenlere çıkarılması, böylece testlerin paralel çalışabilmesi ve birbiriyle "çakışmaması".

    import requests BASE_URL = "http://localhost:1080/api" def test_order_creation(): mock_response = {"orderId": 12345, "state": "created"} # Gerçek testlerde yanıt mock sunucusu dönecek # Burada requests.post çağrısı ve assert ...

Anahtar özellikler:

  • Üçüncü taraf bağımlılıklarını taklit etmek için mock sunucuların kullanımı.
  • Durum temizliği: verilerin testten önce/sonra temizlenmesi (setup/teardown).
  • Test varlıklarının kimliklerinin izolasyonu.

Aldatıcı Sorular.

Her durumda gerçek hizmetler üzerinden entegrasyon testleri yapmak zorunlu mu?

Hayır. Düzenli olarak mock/stub kullanılabilir ve entegrasyon testleri ayrı, daha az sık ve kontrol altında çalıştırılabilir.

Gerçek dış API ile yapılan testler her zaman daha güvenilir sonuçlar verir mi?

Hayır. Aksine, daha az stabildirler, ortak tarafta değişiklikler nedeniyle çökerler. Sürekli flicker testleri, pipeline kalitesini bozar.

Dış hizmetlerle paralel otomatik testler için aynı test verilerini kullanmak mümkün mü?

Hayır. Bu, çakışmalara, "yarışmalara" ve istikrarsızlığa yol açabilir. Kimlikler ve durum, test/akış başına benzersiz olmalıdır.

Yaygın Hatalar ve Anti-Desenler

  • Test verilerinin temizliği veya izolasyonu yoktur.
  • Hatta birim testleri için bile gerçek API kullanmak.
  • Bekleme süresinin (timeout) gereksiz yere kısaltılması, bu da yanlış başarısızlıklara yol açar.
  • Dış API'deki değişikliklerin dikkate alınmaması (testleri hepsi birden kırdı).

Gerçek Hayattan Bir Örnek

Olumsuz Durum

Şirkette tüm otomatik testlerin gerçek üçüncü taraf API'leri (ödeme geçidi) kullanılarak hızlı bir şekilde çalıştırılması kararlaştırıldı. Birkaç kez testler yasaklandı, sınırlar geldi, erişimi geri kazanmak zorunda kaldılar, veriler "canlı" raporlara akıyor, yanlış kez tetiklenme problemine yol açıyordu.

Artılar:

  • Gerçek hizmetle hızlı entegrasyon.

Eksiler:

  • Operatör tarafındaki değişiklikler testleri kırdı, zaman ve para kaybı, test atıkları "canlı" hizmetlerde, yeniden üretim zorluğu.

Olumlu Durum

MockServer ve sahte bir in-memory DB ayarlandı. Her testten önce durum sıfırlandı, veriler benzersiz oldu. Gerçek entegrasyon testleri ayrı ve daha az sık yapıldı.

Artılar:

  • Maksimum istikrar, hız, testlerin yerel olarak tekrar üretilebilmesi.

Eksiler:

  • Mock'ların sürdürülmesi için daha fazla kod, "canlı" entegrasyonlar için ayrı bir strateji gereklidir.