Selamlar bugün size testcontainers hakkında bilgi vermeye çalışacağım.
Projelerimize unit test yazarız ama sadece unit test yazmak yeterli olmayabilir. Örneğin bir database methodunun kullanıldığı bir methoda ilgili database methodunu mocklayıp unit test yazıldığında yazdığımız kodun istediğimiz şekilde çalıştığını görebiliriz ama database’in davranışını göremeyiz.
Testcontainers sayesinde dockerla istediğimiz db öğesini kaldırıp db ile projemizin entegrasyon testini yapabiliriz. Bunun dışında testcontainers ile entegrasyon testleri için kafka ve rabbitmq gibi message queuelarını kaldırıp entegrasyon testleri yapabilir ayrıca browser kaldırıp ui ve acceptance testlerimizi koşabiliriz.
Ben bugün yapacağım projede spring boot ile couchbase’e data yazan basit bir uygulama yazacağım ardından önce unit testleri daha sonrasında da Testcontainers ile entegrasyon testlerini yazacağım.
Proje Linki:
Projede String title ve String text alanlarına sahip Message isimli objemiz bulunmakta. MessageService’de sendMessage ve getMessageById şeklinde 2 methodumuz bulunuyor.
sendMessage methodunda gelen message objesini messageRepository.save(message); şeklinde kaydediyoruz. Aşağıda bu method için yazdığım unit test bulunuyor.
Bu unit testte sadece messageRepositorynin save methoduna gidip gitmediğini kontrol ediyoruz, methodun çalışmasıyla alakalı bir test yapamadık.
getMessageById methodunda da gelen id değeriyle messageRepository.findMessageById(id) şeklinde bir arama yapıp varolan dökümanlarda bu idli bir değer varsa onu dönüyoruz.
Bu unit testte ise mockladığımız service’ten istediğimiz objenin döndüğünü kabul ettik ve mock olarak bunu döndük ve bu methodun da unit testini yazmış olduk.
Bu 2 unit testi yazmış olmamıza rağmen projeyi ayağa kaldırıp test etmeye başladığımızda save ettiğimiz message objesini getById ile elde edemeyebilirdik.
Bu gibi durumlarda db ile olan entegrasayonumuzu test etmek için Testcontainers’a başvurabiliriz.
CouchbaseTestContainer classımızda [@Testcontainers](twitter.com/Testcontainers "Twitter profile for @Testcontainers"), [@ActiveProfiles](twitter.com/ActiveProfiles "Twitter profile for @ActiveProfiles")(“container”), [@SpringBootTest](twitter.com/SpringBootTest "Twitter profile for @SpringBootTest") annotationları ekli.
DockerImageName olarak couchbase:enterprise ve tag değeri olarak 7.1.0 değerini veriyoruz.
[@ClassRule](twitter.com/ClassRule "Twitter profile for @ClassRule") olarak da yukardaki DockerImageName değerini alıp Message Bucket’ı ve istediğimiz username password değerleriyle oluşturuyoruz. Before Class methodunda containerımızı start ediyoruz.
bindCouchbaseProperties methodunda ise kaldırdığımız couchbase’in port bilgisini application-container.yml dosyasının içine ekliyoruz.
MessageServiceIT classımız CouchbaseTestContainer’dan extends alıyor. shouldSendAndGetMessage methodunda önce sendMessage methodunu çağırarak couchbaseimize bir kayıt atıyoruz ardından getById ile bu kaydı çekerek daha sonrasında id, text ve title değerlerini kontrol ediyoruz. Bu şekilde apimizin database’imiz ile entegrasyon testini yapmış oluyoruz.
Testcontainers hakkında daha fazla bilgi edinmek için kendi dökümastasyonunu inceleyebilirsiniz. Basitçe Testcontainers hakkında bilgi vermeye çalıştım umarım faydalı olmuştur. Bir sonraki yazımda görüşmek üzere hoşçakalın.
Not: Bana mentörlük yapan ve bu teknoloji ile tanışmamı sağlayan Cemal Önder’e teşekkür ederim.
Kaynakça
https://www.testcontainers.org
https://www.swtestacademy.com/couchbase-testcontainers-in-spring-boot-tests-with-junit-5/