Testify ile Go’da Unit Testler Yazmak
Testify ile Go’da Unit Testler Yazmak

Selamlar. Go öğrenirken ufak, büyük projeler yapmaya çalışıyorum. Bu aşamada unit test işlemlerini gerçekleştirmeye de özen gösteriyorum. Bu projeler GitHub’da bulunmamakta.
Aslında, testify gibi bir kütüphaneyi kullanmadan direkt olarak Go’nun testing paketini de kullanabilirsiniz. Bunu neden söylüyorum? Rob Pike beyefendinin Gopherfest 2015 videosunu izlediyseniz şöyle bir söylemi var: “A little copying is better than a little dependency”. Ancak ben assertion, mock vb. gibi işlemleri, testing işlemlerini testify ile daha basit halledebildiğimi düşünüyorum.
Örnek Go Projesi Oluşturalım
go mod init testing_example
Yukarıdaki komutu kullanarak basit bir proje oluşturalım. Daha sonra ana dizinde 2 farklı dosya oluşturalım. İlk dosyamız ilk_ornek.go adında bir dosya olsun ve içeriği şöyle olsun.
Bu örnekten anlayacağınız üzere, ad soyad bilgisi alarak, “Hoşgeldiniz: bla bla” şeklinde bir değerin geleceği varsayılmaktadır. Bu fonksiyon için testimizi ilk_ornek_test.go adlı bir dosyada yazalım.
Fonksiyon adı Test ile başladığı için test işlemini go otomatik olarak algılayacaktır. Ancak henüz test komutunu vermedik. Sadece göstermek istediğim şey şu, standart if gibi kontroller sağlayarak testimizi gerçekleştiriyoruz.
Yukarıdaki fonksiyon ilk parametresine testing.T değeri almaktadır. Testing paketi bu tarz işlemler için şunları içermektedir:
testing.T: Unit testing
testing.M: Life-cycle testing
testing.B: Benchmarking
testing.F: Fuzzing
Konumuzdan uzaklaşmadan, yukarıdaki test kodunu bir çalıştıralım. Bunun için
go test
Bu komutu vermek mevcuttaki tüm testleri çalıştırmamıza yardımcı olacaktır. Bilerek hatalı bir girdi verdim. Çıktısı şöyle oldu
Yukarıdaki test kodunu şimdi bir de testify ile yazalım isterseniz. Bunun için testify’ı aşağıdaki komut ile kuralım.
go get github.com/stretchr/testify
Bu komut ile testify’ı kurduktan sonra test kodumuz şöyle değişecek
Gördüğünüz gibi daha bir clean yapıda çalışan kod. Şimdi tekrar hatalı bir girdi ile deneyerek testimizi çalıştıralım.
Gördüğünüz gibi aynı sonuçları elde ediyoruz. Birkaç diff uygulanıyor sadece.
Eğer bir test fonksiyonu içerisinde birden fazla assertion uyguluyorsanız, assert için bir instance oluşturabilirsiniz. Böylelikle her defasında testing.T paslamanız da gerekmez. Örnekleyelim.
Peki bu assert kütüphanesi ne yapar?
- Developer dostu, okunabilir çıktılar üretir.
- Kodunuza okunabilirlik kadar
- İsterseniz, her assertion işlemine annotation uygulayabilirsiniz
Bu kütüphanede testler bool değer döner. Aslında bir hata fırlatmasını bekliyordunuz değil mi? Bu işi yapan bir kütüphane yine testify içerisinde yer alıyor. Adı da require
Bu paket assert kütüphanesi ile çok benzer. Yani Equal ya da NotEqual gibi fonksiyonları yine içeriyor. Eğer bir test fail olursa, anında test sonlanıyor.
Yukarıdaki test ilk test esnasında fail üretecek bir girdi alıyor. 2. test bu yüzden çalışmayacak. Örnek çıktıya bakalım isterseniz.
Gördüğünüz gibi diğer test çalışmadı. Bu testler ayrıca void fonksiyonlarla yapılıyor. Yani bir değer döndürmüyorlar. Bu paketi tüm testler sırasıyla doğru şekilde çalışacak bir senaryo ortada varsa kullanabilirsiniz.
Bir diğer kütüphane ise mock kütüphanesidir. Bu kütüphaneyi kullanarak gerçek nesneler yerine kullanılabilecek olan mock nesneleri oluşturabilir ve bunları test işleminde kullanabilirsiniz.
Bu kütüphane haricinde ayrıca bir de suite kütüphanesi var ancak çok denk gelmesem de basitçe açıklayayım.
Bu kütüphane ile nesne yönelimli dillerden edindiğiniz alışkanlıkları kullanabilirsiniz. Bu kütüphane ile bir testing suite oluşturup setup ve teardown işlemlerini gerçekleştirebilirsiniz. Ve yine bunları go test komutu ile çalıştırabilirsiniz.
Okuduğunuz için teşekkür ederim.
Bu yazıyla ilgili sorularınızı bana aşağıdaki kaynaklardan ulaşarak sorabilirsiniz;
Kaynaklar
- https://github.com/stretchr/testify
- https://towardsdev.com/five-minutes-to-start-learning-unit-test-in-golang-2a1ce07eafb0
Wingie / Enuygun’un büyüyen ekibinin bir parçası olmak isterseniz buradan açık pozisyonlarımıza göz atabilirsiniz. Tech ekibimize başvurmak için ise CV’nizi kariyer@enuygun.com’a iletebilirsiniz.