in Go

Go için Unit Test ve Integration Test Ayrımı

Go ile uygulama geliştirirken Unit Test yazmak gerçekten pratik. Geliştirme sürecinin doğal bir parçası olarak zahmetsizce test’e odaklanmayı sağlıyor. Tabi kaliteli bir yazılım geliştirmek sadece Unit Test yazarak mümkün olmuyor. Yazılımın doğru çalıştığını uçtan uca test eden Integration Test‘leri de yazmak kaliteyi yakalamak için gerekli adımlardan biri.

Go’da Integration Test fonksiyonlarını yine Unit Test dosyasının içinde yazabilirsiniz ve Unit Test’lerle çalıştırabilirsiniz gel gelelim ikisi farklı şeyler.
Integration Test’lerin çalışabilmesi için sistemin ayakta olması ve amacını gerçekleştirecek durumda çalışıyor olması gerekir fakat Unit Test kendi başına çalışan yazılımın sadece bir fonksiyonunu test eder. Yani bu ikisini aynı anda çalıştıramayacağınızdan ayrılması gerekir.

Bu ihtiyacı karşılamak için Go’nun Build Constraints özelliği kullanışlı bir çözüm sunuyor. Aaşağıdaki örneği inceleyelim.

3 dosyamız var.

.
├── main.go
├── main_integ_test.go
└── main_test.go

Bu dosyalardan main.go esas işi yapan parça. main_test.go ise içinde unit test barındıran dosyamız ve main_integ_test.go ise sadece integration testlerinin bulunduğu dosyamız.

Dosyaların en başına bakarsanız // +build integ ve // +build !integ satırları dikkatinizi çekecektir. İşte compiler ayrımı bu etiketlere göre yapıyor. Biz build integ ile tag’ı integ değeri alan testleri çalıştır diyoruz. !integ dediğimiz ise olumsuz yani Integration Test’lerinin olmadığı dosyalar için kullanıyoruz.

Şimdi sadece unit tesleri çalıştırmak için proje dizininde aşağıdaki komutu verelim.

go test -v

Çıktı;

=== RUN   Test_Topla
--- PASS: Test_Topla (0.00s)
PASS
ok      console 0.005s

Görüldüğü gibi sadece main_test.go dosyasındaki Test_Topla test’i çalıştırıldı. Bu bizim unit testleri çalıştırıken kullanacağımız test.

Integration Test için ise tahmin edeceğiniz üzere aşağıdaki komut koşacak.

go test -v -tags=integ

Çıktı;

=== RUN   Test_Toplama_Yapiyor_Mu
--- PASS: Test_Toplama_Yapiyor_Mu (0.00s)
PASS
ok      console 0.010s

Tags parametresine integ değerini verdiğimizde ise sadece Integration için yazdığımız fonksiyonlar çalışmış oldu.

Konu ile alakalı daha fazla özelik için Go’nun Build paketini incelemenizi öneririm.