Entegrasyon testleri yazan herkes sorunu biliyor: Ya gerçekliği yalnızca sınırlı ölçüde yansıtan taklitlerle çalışıyorsunuz, ya da yavaş ve bakımı zor olan test ortamlarıyla uğraşıyorsunuz. Mock'lar, testlerin hızlı bir şekilde yürütülmesi ve herhangi bir harici altyapı gerektirmemesi nedeniyle çekiciliğe sahiptir. Ancak bir tehlike oluşturuyorlar: Testler yeşile dönüyor çünkü taklitler testlerle mükemmel bir şekilde eşleşiyor. Bu mutlaka kodun gerçek sistemlerle çalışacağı anlamına gelmez. Sahtenin PostgreSQL veritabanının veya Kafka kuyruğunun davranışını doğru şekilde yansıtmasını kim sağlıyor?
Duyurudan sonra devamını okuyun
Gerçek hizmetlere sahip özel bir test ortamı şeklindeki alternatif başka sorunları da beraberinde getirir: testler arasında durumu nasıl geri yüklersiniz? Testlerin birbirini etkilemesi nasıl önlenir? Peki test ortamının üretim ortamıyla tam olarak eşleştiğinden nasıl emin olursunuz?
TestContainers'ın pragmatik bir çıkış yolu var: Kütüphane gerçek hizmetleri tek kullanımlık Docker konteynerlerinde başlatıyor. Her test, tamamen izole edilmiş, tanımlanmış bir başlangıç durumuna sahip ve test bittikten sonra otomatik olarak temizlenen kendi yeni örneğine sahip olur. Ancak bu yaklaşım yalnızca konteynerli hizmetlerin yeterince hızlı başlatılması durumunda pratiktir. Bir saniyeden daha kısa sürede hazır hale gelen bir veritabanıyla, her bir test için yeni bir kapsayıcı oluşturabilirsiniz. Ancak başlatma süresi birkaç dakika olan hizmetler için paylaşılan kapsayıcıları kullanmalısınız.
TestContainers'ın arkasındaki fikir
TestContainers, testlerde Docker konteynerlerini programlı olarak kontrol etmeye yönelik bir projedir. Temel fikir basittir: Simülasyonlar yazmak veya manuel test ortamlarını sürdürmek yerine, testin kendisinin gerekli altyapıyı oluşturmasına izin verirsiniz. Test bittiğinde TestContainers kendini otomatik olarak temizler: konteynerlerin manuel olarak kapatılması veya unutulan kaynaklar yoktur.
Kavramsal işlevsellik hızlı bir şekilde açıklanmaktadır: bir test bir veya daha fazla konteyneri başlatır, hazır olana kadar bekler, gerçek test adımlarını yürütür ve son olarak konteynerleri durdurur. TestContainers dinamik bağlantı noktası atamasını yönetir, böylece testinizin bağlantı noktası çakışmaları konusunda endişelenmesine gerek kalmaz. Yerleşik bir temizleme mekanizması, test çökse veya kesintiye uğrasa bile kapların temizlenmesini sağlar.
Bekleme stratejileri özellikle önemlidir. Başlatılan bir kapsayıcı, istekleri hemen işlemeye otomatik olarak hazır değildir. Örneğin, bir veritabanının başlatılması için zamana ihtiyacı vardır, önce bir web sunucusunun başlatılması gerekir. Bekleme stratejileri, belirli bir bağlantı noktasının dinlemesi, bir HTTP isteğinin başarılı olması veya belirli bir günlük satırının görünmesi gibi bir kapsayıcının ne zaman hazır kabul edildiğini tanımlar.
Duyurudan sonra devamını okuyun
TestContainers halihazırda PostgreSQL, MySQL, Redis, MongoDB ve Kafka gibi birçok yaygın uygulama ve hizmet için önceden oluşturulmuş modüller sunmaktadır. Bu modüller, standart bağlantı noktaları, tipik ortam değişkenleri ve uygun bekleme stratejileri gibi halihazırda yararlı varsayılanlarla birlikte gelen genel kapsayıcı API'sinin etrafındaki sarmalayıcı sınıflardır.
Daha az yaygın olan hizmetler veya kendi sistemleriniz için kendi sarmalayıcılarınızı yazabilirsiniz. Bunlar buna dayanıyor GenericContainer ve etki alanına özgü yapılandırmayı kapsülleyin. Aşağıdaki pratik örnek, uygulamanın ne kadar basit olduğunu göstermektedir: görüntüyü, bağlantı noktalarını ve komut satırı parametrelerini yapılandıran ve bir istemci örneğini döndüren bir sınıf. Sarmalayıcı, TestContainers API'sini soyutlar ve belirli hizmete göre uyarlanmış bir arayüz sağlar.
İlk bakışta Docker Compose, konteynerleri test için de başlatabilen bir alternatif gibi görünüyor. Ancak fark yaklaşımdadır: Docker Compose, YAML dosyalarıyla bildirimli olarak çalışır ve genellikle birden fazla test için paylaşılan bir ortam oluşturur. Öte yandan TestContainers programlıdır ve doğrudan test koduna entegre olur. Her testin kendi konteyner konfigürasyonu olabilir; Konteynerler operasyon sırasında çalıştırılır ve durdurulur.
Başka bir fark: Compose ile farklı testler arasında kapları açıkça sıfırladığınızdan emin olmanız gerekir. TestContainer'lar başlangıçtan itibaren izolasyon için tasarlanmıştır. Her teste yeni kaplar alınır ve bu da onları daha sağlam ve birbirlerinden bağımsız hale getirir.
Projeden çok fikir
TestContainers yekpare bir açık kaynak projesi değil, çeşitli programlama dillerinde uygulanan bir fikirdir. TestContainer'lar Java, Go, .NET, Node.js, Python, PHP, Rust ve diğer birçok dil için farklı bakım ekipleri tarafından farklı hedeflerle geliştirilmiştir.
Bu, örneğin Java uygulamasında belirgin olan özelliklerin Python sürümünde eksik olabileceği veya tam tersi anlamına gelir. API tasarımı aynı zamanda programlama dilleri arasında da farklılık gösterir, ancak kavramlar aynı kalır. Dokümantasyonun kalitesi ve uygulamaların olgunluğu farklılık gösterir.
Topluluk ve destek dile göre düzenlenmiştir: Go uygulamasıyla ilgili yardım, PHP sürümüne ek olarak diğer forumlarda da bulunabilir.
Belirli bir özelliğin sırf başka bir dilden bildiğiniz için var olduğunu varsaymamalısınız. İlgili uygulamanın belgelerine göz atmak önemlidir. İyi haber: Temel kavramlar her yerde aynı. Prensibi anlayan herkes hızla diğer uygulamalara yönelebilir.
Pratik bir örnek
TestContainers uygulamaları arasındaki farkları somut olarak göstermek için EventSourcingDB veritabanı örnek teşkil etmektedir. Bu, olay kaynağı bulma konusunda uzmanlaşmış, web tarafından geliştirilmiş yerel bir veritabanıdır. Kapalı kaynaktır ancak ilgili istemci SDK'ları (Yazılım Geliştirme Kiti) GitHub'da açık kaynak olarak mevcuttur.
EventSourcingDB, ister veritabanı, ister mesaj kuyruğu veya başka bir altyapı hizmeti olsun, uygulamalarda gerekli olan tipik hizmetlere bir örnektir. Örneğimiz için belirleyici avantaj: EventSourcingDB bir saniyeden kısa sürede başlar, bu da “test kapsayıcısı” yaklaşımını pratik hale getirir. Farklı dillere yönelik istemci SDK'larının her biri, uygulaması kontrol edilmeye değer olan kendi TestContainers entegrasyonunu içerir.
Bu makale Go ve PHP'nin uygulanmasını ayrıntılı olarak ele almaktadır. Her ikisi de aynı kavramsal yaklaşımı benimsiyor ancak önemli ayrıntılarda farklılık gösteriyor. Bu nedenle uygulamalar, TestContainers uygulamaları arasındaki farkları göstermek açısından faydalıdır.

Bir yanıt yazın