Tests
GO programlama dilinde test ifadelerini yazmak için birkaç yazım kuralını izleriz:
- test işlemini yapacağımız dosya için dosya ile aynı isimli
_test.goile biten bir ifade yazılmalıdır. Örneğinhesapla.goifadesinin testlerihesapla_test.goiçerisinde yer almalıdır. _test.goile biten ifademizdeki test fonksiyonufunc Test...şeklinde yazılmalıdır.hesapla.godosyamızdaOrtalama()isimli bir fonksiyon varsahesapla_test.godosyamızdaTestOrtalama()isminde bir fonksiyonumuz olmalıdır.- test fonksiyonunun scope içeriğinde
testingkütüphanesi kullanılmalıdır. Bu kütüphanede çağrılan veriler ve beklenenler tanımlanır. - test fonksiyonlarınız farklı paketler içerisinde yer alsa dahil
go test ./... -vifadesiyle tüm paketlerdeki testleri aynı anda çalıştırılabilir. - Belirli bir paketteki testleri çalıştırmak istediğimizde
go test ./paketadı -vifadesini kullanırız.
Not Hesaplama Uygulaması Testi
Konunun daha iyi anlaşılabilmesi adına üniversite vize final bütünleme notlarına ait bir hesaplayıcı yazıp hesaplayıcının .alışmasını test edelim.
Yeni bir proje oluşturduktan sonra aşağıdaki şekilde bir dosya ağacı oluşturalım :
.
├── go.mod
├── hesapla
│ ├── hesapla.go
│ └── hesapla_test.go
└── main.go
Buradaki amacımız subdirectory ler yani alt dosya yolları içerisinde bulunan testleri nasıl çalıştıracağımızı öğrenmektir.
Şimdi hesapla.go isimli dosyamıza girerek içine ortalama hesaplayan bir fonksiyon yazalım.
package hesapla
import "fmt"
func Ortalama(ogrenciNot []int) float64 {
// toplam
sum := 0.0
for _, v := range ogrenciNot {
fmt.Printf("Ogrenci Notu: %d \n", v)
sum += float64(v)
fmt.Printf("Sum : %f \n", sum)
}
ortalama := float64(sum) / float64(len(ogrenciNot))
fmt.Println(ortalama)
return ortalama
}
Yukarıda dikkat ettiyseniz package hesapla olarak paket ismini tanımladık. İşlemlerimizi bu paket içinde gerçekleştireceğiz.
package hesapla
import "testing"
func TestOrtalama(t *testing.T) {
got := Ortalama([]int{65, 83})
want := 74.0
if got != want {
t.Errorf("got %f ,want %f", got, want)
}
}
Burada yazdığımız test fonksiyonunu detaylı olarak inceleyelim. package hesapla içinde yer alması gerekiyor ki hesapla.go içinde yer alan Ortalama() isimli fonksiyonu tespit edebilmesi için bunu belirtmemiz gerekiyor. Diğer adımda ise test fonksiyonumuzu yazmaya başlıyoruz.
import "testing"
func TestOrtalama(t *testing.T) {
got := Ortalama([]int{65, 83})
want := 74.0
if got != want {
t.Errorf("got %f ,want %f", got, want)
}
}
fonksiyon adımıza Test... ibaresini başına koyarak başlıyoruz. GO bunun bir test fonksiyonu olduğunu bu şekilde tespit eder. ikinci aşamada (t *testing.T) pointer ifadesiyle testing.T fonksiyonunun vereceğimiz değişkenleri argüman olarak alıp test işlemlerini gerçekleştireceğini belirtiyoruz. got ve want olmak üzere iki adet değişken alır. Bu değişkenlerin ilki yani got test edeceğimiz değerleri içerir. ikincisi ise yani want beklenen değerleri içerir. Bizim işlemimizde 65 ve 83 sayılarını ortalama fonksiyonuna argüman olarak verdiğimizde sonucun 74 olarak dönmesi gerekir.
Bir sonraki ifademizde ise if got != want {} mantıksal sınaması gelir. Yani beklenen değer karşılanmazsa t.Errorf() aracılığıyla ekrana bir hata mesajı döndürürüz.
Kodumuzu komut satırı aracılığıyla çalıştıralım.
go test ./... -v
Burada ./ ifadesi ile bir üst dizine çık ve ... ifadesiyle bu dizinin altında olan ne kadar test dosyası varsa çalıştır dedik. -v ifadesiyle ise çalıştırılan testlere ait ekran görsellerini görüntüle dedik. Eğer -v vermezsek ekranda yalnızca PASS veya FAIL ifadelerini ve test süresini görüntüleriz. -v ifadesi verbose anlamına gelir ve yapılan işlemleri ekranda görüntülemeye yarar.
? gkybrc/nothesaplama [no test files]
=== RUN TestOrtalama
Ogrenci Notu: 65
Sum : 65.000000
Ogrenci Notu: 83
Sum : 148.000000
74
--- PASS: TestOrtalama (0.00s)
PASS
ok gkybrc/nothesaplama/hesapla (cached)
TAVSİYE: Çok fazla testiniz mevcutsa ve hızlı olarak geçmeyen değeri tespit etmek istiyorsanız
-vkullanmadan testin olduğu fonksiyonu tespit edin. Ardından da yalnızca bu fonksiyona ait değerleri kontrol edin.
Mevcut Bir Testi Atlama
Birden çok test yazdınız fakat bir ya da bir kaç tanesini tüm testlere dahil etmek istemiyorsanız t.Skip() isimli aşağıdaki ifadeyi kullanmanızı öneriririm:
func TestAtlanacakTest(t *testing.T){
t.Skip("Bu Test Atlanmıştır!")
}
Mevcut Projemize bir fonksiyon daha ekledik diyelim. Buna ait yazdığımız testi silmeden diğer testler arasından çıkartabilmek için bu ifadeyi ekleyeceğiz.
Şimdi projemize geri dönelim ve test atlamayı projemize ekleyelim.
hesapla_test.go isimli dosyamıza aşağıdaki eklemeleri yapalım :
package hesapla
import "testing"
func TestOrtalama(t *testing.T) {
got := Ortalama([]int{65, 83})
want := 74.0
if got != want {
t.Errorf("got %f ,want %f", got, want)
}
}
func TestOrtalamaTwo(t *testing.T) {
got := Ortalama([]int{45, 43, 84})
want := 57.333333333333336
if got != want {
t.Errorf("got %f want %f", got, want)
}
}
func TestHarfCevir(t *testing.T) {
t.Skip("Harf Ceviri testi atlandı!")
}
Şimdi de hesapla.go isimli dosyamıza gereken eklemeleri yapalım :
package hesapla
import (
"fmt"
)
func Ortalama(ogrencinot []int) float64 {
sum := 0.0
for _, v := range ogrencinot {
fmt.Printf("ogrenci notu: %d \n", v)
sum += float64(v)
fmt.Printf("sum : %f \n", sum)
}
ortalama := float64(sum) / float64(len(ogrencinot))
fmt.Println(ortalama)
return ortalama
}
func HarfCevir(ortalama float64) string {
/*
aa: 90 - 100 / başarılı
ba: 80 - 89 / başarılı
bb: 75 - 79 / başarılı
cb: 70 - 74 / başarılı
cc: 60 - 69 / başarılı
dc: 50 - 59 / koşullu başarılı - başarısız
dd: 40 - 49 / başarısız
fd: 30 - 39 / başarısız
ff: 0 - 29 / başarısız
*/
if ortalama >= 90.0 && ortalama <= 100.00 {
return "AA"
} else if ortalama >= 80.0 && ortalama <= 89.0 {
return "BA"
} else if ortalama >= 75.0 && ortalama <= 79.0 {
return "BB"
} else if ortalama >= 70.0 && ortalama <= 74.0 {
return "CB"
} else if ortalama >= 60.0 && ortalama <= 69.0 {
return "CC"
} else if ortalama >= 50.0 && ortalama <= 59.0 {
return "DC"
} else if ortalama >= 40.0 && ortalama <= 49.0 {
return "DD"
} else if ortalama >= 30.0 && ortalama <= 39.0 {
return "FD"
} else {
return "FF"
}
}
Şimdi test komutumuzu çalıştıralım :
go test ./... -v
Ekran çıktımız aşağıdaki şekilde olacaktır.
? gkybrc/nothesaplama [no test files]
=== RUN TestOrtalama
ogrenci notu: 65
sum : 65.000000
ogrenci notu: 83
sum : 148.000000
74
--- PASS: TestOrtalama (0.00s)
=== RUN TestOrtalamaTwo
ogrenci notu: 45
sum : 45.000000
ogrenci notu: 43
sum : 88.000000
ogrenci notu: 84
sum : 172.000000
57.333333333333336
--- PASS: TestOrtalamaTwo (0.00s)
=== RUN TestHarfCevir
hesapla_test.go:24: Harf Ceviri testi atlandı!
--- SKIP: TestHarfCevir (0.00s)
PASS
ok gkybrc/nothesaplama/hesapla (cached)
Burada dikkat ederseniz TestHarfCevir isimli testimiz atlandı ve buna ait ifade aşağıdaki şekilde eklendi.
=== RUN TestHarfCevir
hesapla_test.go:24: Harf Ceviri testi atlandı!
--- SKIP: TestHarfCevir (0.00s)
PASS
Testler ile ilgili daha fazla bilgi almak için PKG.GO.DEV - testing adresini inceleyebilirsiniz.