Tests

GO programlama dilinde test ifadelerini yazmak için birkaç yazım kuralını izleriz:

  1. test işlemini yapacağımız dosya için dosya ile aynı isimli _test.go ile biten bir ifade yazılmalıdır. Örneğin hesapla.go ifadesinin testleri hesapla_test.go içerisinde yer almalıdır.
  2. _test.go ile biten ifademizdeki test fonksiyonu func Test... şeklinde yazılmalıdır. hesapla.go dosyamızda Ortalama() isimli bir fonksiyon varsa hesapla_test.go dosyamızda TestOrtalama() isminde bir fonksiyonumuz olmalıdır.
  3. test fonksiyonunun scope içeriğinde testing kütüphanesi kullanılmalıdır. Bu kütüphanede çağrılan veriler ve beklenenler tanımlanır.
  4. test fonksiyonlarınız farklı paketler içerisinde yer alsa dahil go test ./... -v ifadesiyle tüm paketlerdeki testleri aynı anda çalıştırılabilir.
  5. Belirli bir paketteki testleri çalıştırmak istediğimizde go test ./paketadı -v ifadesini 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 -v kullanmadan 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.