CodeBlanks Logo Icon CodeBlanks

Tablo testi

Tablo tabanlı test desenini öğrenirsin.

Tablo testi

Go'nun en yaygın test deseni: girdi ve beklenen çıktıları bir dilimde tutup tek döngüyle denemek.

tests := []struct {
    ad   string
    a, b int
    want int
}{
    {"pozitif", 2, 3, 5},
    {"negatif", -2, -3, -5},
    {"sıfır", 0, 0, 0},
}
for _, tt := range tests {
    t.Run(tt.ad, func(t *testing.T) {
        if got := Topla(tt.a, tt.b); got != tt.want {
            t.Errorf("got %d, want %d", got, tt.want)
        }
    })
}

Yeni durum eklemek ucuzdur

Bir hata bildirildiğinde onu yakalayan yeni bir satır tabloya eklenir; test kodu değişmez. Kenar durumlarını (boş girdi, sınır değerleri, Unicode) unutmamak için tablo iyi bir kontrol listesidir. go test -run 'TestTopla/negatif' yalnızca o alt testi çalıştırır.

Uygulama Tablo döngüsü

Mutlak(n int) int yaz. {-3, 3}, {0, 0}, {4, 4} durumlarından oluşan anonim struct tablosunu döngüyle dene; geçen durum sayısını yazdır.

Başlangıç kodu

main.go
package main

import "fmt"

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import "fmt"

func Mutlak(n int) int {
    if n < 0 {
        return -n
    }
    return n
}

func main() {
    tests := []struct{ in, want int }{{-3, 3}, {0, 0}, {4, 4}}
    gecen := 0
    for _, tt := range tests {
        if Mutlak(tt.in) == tt.want {
            gecen++
        }
    }
    fmt.Println(gecen)
}

Beklenen çıktı

3

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Tablo testinde <code>t.Run</code> kullanmanın avantajı nedir?

  • Testler daha hızlı derlenir
  • Hata mesajı gerekmez
  • Kapsama artar
  • Her durum ayrı alt test olarak raporlanır ve -run ile tek tek çalıştırılabilir Doğru cevap

Açıklama: Alt test adları çıktıda görünür (TestTopla/negatif); bir durum Fatal olsa bile diğerleri çalışmaya devam eder.

2 Alt test

Soru
for _, tt := range tests {
    t.____(tt.ad, func(t *testing.T) {
        // ...
    })
}
Cevap
for _, tt := range tests {
    t.Run(tt.ad, func(t *testing.T) {
        // ...
    })
}

Açıklama: t.Run verilen adla bir alt test başlatır.

3 Tablo parçası

Kavram Anlamı
ad Alt test adı
girdi alanları Fonksiyona verilenler
want Beklenen sonuç
t.Run Ayrı raporlama

Orta seviye bölümündeki tüm dersler