~/Ali GÖREN

Testify ile Go’da Unit Testler Yazmak

Ali Goren · · 3 dk okuma

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

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.