Testcontainers ile Test Etmek

Emre Eren
emlakjet
Published in
4 min readAug 24, 2022
Photo by Pixabay

Giriş

Bir önceki yazımızda belirttiğimiz üzere bir uygulamayı yazdıktan sonra o uygulamanın özelliklerini test etmek için otomatize edilmiş testler uygulanır. Bu testlerden bazıları unit, integration ve acceptance testlerdir.

Bu testleri uygularken gerekli komponentleri tek tek kurup, test ettikten sonra da silmek oldukça kaynak, zaman ve efor harcayan bir iş olduğundan zaman içinde daha az kaynak gerektiren çözümler gerekmektedir.

Halihazırda bulunan çözümler niye işe yaramıyor?

Halihazırda bulunan çözümlerden birisi o komponenti taklit eden farklı, daha hafif ve kullanımı daha kolay bir komponent bulup tüm testleri bu komponent üzerinde gerçekleştirmektir. Bu her ne kadar yeterli bir çözüm gibi görünse de büyük projelerde o komponentin her özelliği kullanılması gerektiğinde aslından farklı bir özelliğe illa rastlanacaktır. Bu da testlerin güvenilirliğini azaltacaktır.

Bir örnek vermemiz gerekirse şurada göreceğiniz üzere asıl komponente gelen yenilik eşzamanlı olarak test için kullandığımız komponente gelmiyor. Bu da yeni özellikler sayesinde kodumuzda yapacağımız iyileştirmeleri engelliyor. Ya teknolojiyi geriden takip etmek zorunda kalıyorunuz ya da iki ortamda da çalışabilmesi için daha düşük performanslı ya da en iyi başarımı sağlamayan yöntemi tercih etmek zorunda kalıyorsunuz.

Testcontainers’ın çıkışı

Bunun gibi sıkıntıları fark eden Richard North, Docker’ın da yardımıyla taklit sistemler yerine gerçek sistemlerde testleri çalıştırmamızı sağlayan bir araç geliştirdiler. Bu aracın adı ise Testcontainers.

Testcontainers nedir? Testcontainers, junit ile kullanılan, hafif, kullanılıp atılabilir yapıda bir test platformudur. Kullanım amacınıza göre integration ve acceptance testlerinizi taklit yöntemiyle test etmeye oranla daha güvenilir hale getirir.

Daha güvenilir hale getirmesinin sebebi ise yukarıda belirttiğimiz gibi taklit yönteminin tam olarak gerçek komponentin yerini tutmamasıdır. Test için kullanılan komponent %90 oranında gerçeğine yakın çalışsa da bizim testlerimizin güvenilir olması için aynı şekilde çalışması gerekmektedir.

Testcontainers’ın çalışma prensibi

Testcontainers temelinde Docker’ı kullanır. Dolayısıyla docker bilgisayarımızda yüklü olmalı. Üzerinde testlerimizi çalıştırmak istediğimiz komponentin docker imajını test edeceğimiz sınıfın içinde tanımlayarak başlatırız ve üzerinde testlerimizi uygularız. Testlerimiz bittiğinde ise varsayılan olarak konteynerimiz kapatılır ve silinir.

Kullanım detayları

Projemizde Testcontainers kurulumu yapmak için öncelikle projemize Testcontainers kütüphanesini ve Testcontainers’ın resmi olarak destekliyorsa, desteklediği komponentleri eklemeliyiz. Eğer sizin kullanacağınız bir komponentin resmi desteği gözükmüyorsa GenericContainer sayesinde manuel olarak parametre vererek konteynırlarınızı çalıştırabilirsiniz.

Ben projemde Postgresql kullandığım ve resmi olarak desteklediği için onu da bağımlılıklara ekliyorum. Bunun için pom.xml dosyamıza aşağıdaki kodu ekliyoruz. Tabiki en güncel versiyonu kullanmayı unutmayın. Örnek projeyi kaynakça kısmına ekledim.

Dependencies

Testlerimizi yapmak için bir test sınıfı açmalıyız. Ama ben bunu yapmadan önce örnek olması açısından bir repository oluşturup okuma yazma testini bu repository üzerinden gerçekleştireceğim.

Repository

Repository açtıktan sonra bunun için bir test sınıfı oluşturuyoruz. Testleri önce ayrı bir veritabanına sahip olduğumuz versiyonuyla yapıp daha sonra Testcontainers haline getireceğim. Test ortamında aktif olan veritabanının bilgilerini application.yml üzerinde belirttikten sonra aşağıdaki testi çalıştırdığımız zaman sonucunu göreceğiz.

Test without Testcontainers

Peki ya test ortamındaki veritabanımız değiştiğinde ne olacak? Örneğin veritabanında olan bir değere göre test yazdığımızda ve birisi gidip o değeri sildiğinde ne olacak? Bu gibi durumlarda örnek verilerimizi kullanarak oluşturduğumuz bir Postgresql konteynırı işimizi fazlasıyla görecektir.

Şimdi bu kodun Testcontainers versiyonuna geçelim. Bir adet veritabanı konteynırı oluşturup bunun bilgilerini bizim ayarlarımızın üstüne yazmalıyız. Tabi bir diğer seçenek olarak bir veritabanı ismi, giriş bilgisi ve kullanıcı bilgilerini bu yeni oluşturacağımız veritabanına verip onunla açılmasını da isteyebiliriz ama ilk bahsettiğim seçenek daha basit oluyor Testcontainers ile.

Test with Testcontainers

Böylece Testcontainers kullanarak ilk testimizi yazmış olduk! Bu yapıyı biraz daha geliştirip testler arası geçiş yaparken konteynırların kapanıp açılması gibi sorunları giderebiliriz, böylece performans düşüşü sağlamamış oluruz. Ya da örnek veri için bir sql dosyası oluşturup bunu konteynır açıldığında konteynıra yükleyerek içindeki verilerle testlerimizi çalıştırabiliriz.

Kaynakça

--

--