Middle+
Bir mikroservisin sözleşme testinden bahsedin.
sobes.tech yapay zeka
AI'dan gelen yanıt
Sözleşme testi, mikroservisler arasındaki etkileşimi API seviyesinde (sözleşme) doğrulamaya odaklanır. Amaç, tüketici (API'yi kullanan hizmet) ve sağlayıcı (API'yi sağlayan hizmet) arasında belirli bir "sözleşmeye" (istek/yanıt şeması, veri formatı, beklentiler) uyulduğundan emin olmaktır.
Temel ilkeler:
- Tüketici odaklı: Testler, tüketicinin beklentilerine dayanır. Tüketici, ihtiyaç duyduğu veri ve formatları belirler.
- İki yönlü testler: Hem tüketicinin (mevcut sözleşmeyle çalışıp çalışmadığı) hem de sağlayıcının (tüketicinin beklentilerini karşılayıp karşılamadığı) durumu kontrol edilir.
- Hız: Testler hızlıca çalıştırılır, genellikle CI/CD boru hatları içinde, çünkü tüm bağımlı servislerin dağıtımını gerektirmez.
Genellikle şu adımları içerir:
- Tüketici, sağlayıcının API'sine ilişkin beklentilerini tanımlayan testler oluşturur. Bu testler "sözleşme" üretir.
- Sözleşme (örneğin, merkezi bir depo) yayınlanır.
- Sağlayıcı, yayınlanan sözleşmeyi kullanarak API uygulamasını doğrular. (Genellikle sağlayıcı tarafında çalıştırılır) ve API'nin sözleşmeye uygun olup olmadığını kontrol eder.
- Tüketicinin beklentileri ile sağlayıcının uygulaması arasında uyumsuzluk varsa, test başarısız olur ve sözleşme ihlali gösterilir.
Araçlar:
- Pact (en popüler)
- Spring Cloud Contract
- Swagger/OpenAPI ve doğrulama araçları
Avantajlar:
- En erken hata tespiti: Entegrasyon sorunları dağıtımdan önce tespit edilir.
- Entegrasyon testlerinin gereksinimini azaltma: Karmaşık ve yavaş uçtan uca testlere bağımlılığı azaltır.
- Bağımsız testler: Servisleri bağımsız olarak test etmeye olanak tanır.
- Beklentilerin net tanımı: Servisler arasındaki sözleşmeyi açıkça belirler.
Dezavantajlar:
- Tam entegrasyon testlerinin yerini almaz (sadece API seviyesinde etkileşimi kontrol eder).
- Sözleşmelerin sürüm yönetiminde disiplin gerektirir.
- Çok karmaşık sözleşmeler için daha zor olabilir.
Pact ile kullanım örneği:
- Tüketici (örneğin,
Order Serviceservisi) Pact kütüphanesini kullanarak tüketici tarafı testleri oluşturur.// Pact JVM ile tüketici testi örneği @ExtendWith(PactConsumerTestExt.class) @PactTestFor(providerName = "ProductService", port = "8080") public class ProductServiceContractTest { @Pact(consumer = "OrderService") public RequestResponsePact createPact(PactDslWithRequest r) { return r.given("a product with id 1 exists") .uponReceiving("a request for product by id") .path("/products/1") .method("GET") .willRespondWith() .status(200) .headers(Map.of("Content-Type", "application/json")) .body(new PactDslJsonBody() .stringValue("id", "1") .stringValue("name", "Laptop") .numberType("price", 1200.00)) .toPact(); } @Test void testGetProductById(MockServer mockServer) throws IOException { // API çağrısı yapma ve yanıtı doğrulama HttpResponse response = Request.Get(mockServer.getUrl() + "/products/1").execute().returnResponse(); assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); } } - Tüketici tarafı testleri çalıştırıldığında, bir sözleşme dosyası (
.json) oluşturulur. - Bu sözleşme dosyası, Pact Broker veya başka bir merkezi depoya yayınlanır.
- Sağlayıcı (
Product Service), Pact Provider Verifier gibi kütüphaneleri kullanarak, Pact Broker'dan alınan sözleşmeye göre API uygulamasını doğrular.// Pact Provider Verifier ile sağlayıcı testi örneği @Provider("ProductService") @PactFolder("relative/path/to/pacts") // veya Pact Broker kullan public class ProductServiceVerificationTest { @TestTemplate @ExtendWith(PactVerificationInvocationContextProvider.class) public void verifyPact(PactVerificationContext context) { context.verifyInteraction(); } @State("a product with id 1 exists") public void productWithId1Exists() { // Sağlayıcıdaki veri durumunu hazırlama } @BeforeEach void beforeEach(PactVerificationContext context) { context.setTarget(new HttpTestTarget("localhost", 8080)); } } - Sağlayıcı tarafındaki doğrulayıcı, gerçek API'yi çağırır ve yanıtı sözleşmedeki beklentilerle karşılaştırır.
Sözleşme testi, mikroservis tabanlı sistemlerin güvenilirliğini ve sürdürülebilirliğini sağlamak için önemli bir uygulamadır.