.Net Core ve Docker ile Entegrasyon Testi

You can access the English version via this link.

CI iş hattında entegrasyon testleri kolayca nasıl yapılabilir? Bu yazıda Docker konteynerlerini kullanarak bu sorunun cevabını bulmaya çalışacağız.

Photo by Sigmund on Unsplash

Entegrasyon testi yazmaya çalıştığım bir projede dış bağımlılıkları yönetmekte zorlanmaktaydım. Testleri çalıştırmadan önce otomatik olarak veri tabanı, mesaj kuyruğu vb. bileşenleri yaratmanın ve test işlemi bittikten sonra bu bileşenleri temizlemenin yollarını aramaya başladım. TestContainers adındaki açık kaynak kodlu bir pakete denk geldim. Bu paketi çok beğendim ve entegrasyon testi yazarken benzer sıkıntılar yaşamış insanlara yardımcı olabilmek için küçük bir demo hazırlamak istedim.

Örnek projeye bu GitHub linki ile ulaşabilirsiniz.

Projemizi Oluşturalım

Demo amaçlı çok basit bir ToDo WebApi projesi hazırlayacağız. Bu WebApi aracılığı ile aşağıdaki işlemleri yerine getireceğiz.

  • Bir ToDo oluşturmak
  • Kimlik numarası ile ToDo sorgulayabilmek
  • “Tamamlandı” veya “Tamamlanmadı” şeklinde ToDo değerlerini etiketlemek

Öncelikli olarak aşağıda modeli verilen ToDoItemModel sınıfımızı oluşturalım.

Ardından ToDoDbContext adını verdiğimiz DbContext sınıfını miras alan sınıfımızı oluşturalım.

dotnet-ef aracılığıyla veri tabanımızı yapılandıracak scriptlerin yaratılmasını sağlayacağız. Bu işlemin ardından Startup sınıfını aşağıdaki gibi modifiye edeceğiz. Böylelikle ilk istekle beraber veri tabanında gerekli değişikliklerin yapılmasını sağlayacağız.

ToDoController sınıfımızı hazırlamaya başlayabiliriz. Demo basit olsun diye işlemleri doğrudan burada yürüteceğiz.

Uygulamamızın iş süreçlerini oluşturmuş olduk. Artık test aşamasına geçebiliriz.

Docker ile Test Ortamının Oluşturulması

Birim testi yazanların aşina olacağı bir kütüphane olan xUnit kütüphanesini kullanarak test senaryolarımızı yazacağız. Uygulamamızı TestServer üzerinde çalıştırıp test senaryolarımızı kullanarak uygulamamızı sınayacağız. Aşağıda uygulamamızın TestServer üzerinde çalışan versiyonunu oluşturan kod bloğunu görebilmekteyiz.

Burada asıl konuya geliyoruz artık. Uygulamamız ilk istekle beraber Sql Server üzerinde yer alması gereken veri tabanlarını oluşturacaktı. O halde uygulama örneğimizi çalıştırmadan önce bizim bir Sql Server yapılandırıp çalıştırmamız gerekecek. Bunun için yukarıdaki kod parçasında üç nokta ile boş bırakılmış alana aşağıdaki kod parçası ekliyoruz. BuildSqlServerTestContainer adındaki metodun bize çalıştırılabilir bir konteyner vereceğini hayal ederek sorunumuzu soyutluyoruz.

BuildSqlServerTestContainer adındaki metot aracılığıyla Sql Server konteynerini yapılandırdığımız süreci enkapsüle ettik. Bu metot içerisinde DbContext sınıfı aracılığıyla bağlantı cümlesini elde edecek ve böylece uygulamanın bağlantı kurmak istediği Sql Server için sağlamamız gereken port ve şifre bilgisini öğreneceğiz.

TestcontainerBuilder sınıfı aracılığıyla istediğimiz Docker Image’den bir konteyner yaratabiliriz. DotNet.TestContainers kütüphanesi Sql Server, RabbitMq gibi sık ihtiyaç duyulan bileşenler için hazır arayüzler sunmaktadır. Biz de aşağıda paketin sunduğu arayüzü kullanarak konteynerimizin port ve şifre ayarlarını yapıyoruz.

Infra yapımızı temsil edecek bir varlık tasarladık. Sıra testleri çalıştırmadan önce bu sınıfa ait objeyi oluşturmaya geldi. Bunun için xUnit kütüphanesinin bize sunduğu Collection Fixture özelliğinden faydalanabiliriz. Böylece tüm test senaryolarımız için tek bir Sql Server kullanmış olacağız. Çok sayıda Sql Server konteyneri yaratmaktan kaçınmamızın sebebi konteyner yaratmanın hem zaman hem bellek açısından maliyetli oluşudur.

Aşağıda ToDo kaynağı üzerinde gerçekleştirilen GET işlemine ait test senaryolarını görebilmekteyiz.

Get-ToDo hizmet noktamızın gerektiği gibi çalışıp çalışmadığını kontrol edecek testlere sahibiz. Sıra bu testleri otomatik olarak iş hattında çalıştırmaya geldi.

CI İş Hattında Testlerimizi Çalıştıralım

Projenin içerisine aşağıda yer alan yml dosyasını ekleyerek her git-push işleminde testlerin GitHub Actions üzerinde çalışmasını sağlayalım. Böylelikle yaptığımız her değişiklikte, uygulamamızın beklendiği gibi çalışacağından emin olabiliriz.

Not: Platformdan bağımsız bir şekilde iş hattı kurgulamak isterseniz Cake Build hakkındaki yazımı okuyabilirsiniz.

Umarım yararlı bir yazı olmuştur. Diğer yazılarıma göz atmak için bu linke tıklayabilirsiniz.

--

--

var software = ConvertFrom(caffeine)

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store