Table-Driven Tests
Jadval asosidagi testlar (qaytadan)
"Professional Go Testing" kursida jadval asosidagi testlarni chuqur ko'rgan edingiz. Bu qisqa darsda esa, ularni shu kursda ko'rgan naqshlarning birortasini sinash uchun to'g'ridan-to'g'ri qo'llab, ikki g'oyani birlashtiramiz: Strategy naqshini (chegirma hisoblash) jadval orqali sinaymiz.
package main
import "testing"
type DiscountStrategy interface {
Apply(price float64) float64
}
type PercentDiscount struct{ Percent float64 }
func (p PercentDiscount) Apply(price float64) float64 {
return price * (1 - p.Percent/100)
}
func TestPercentDiscount(t *testing.T) {
tests := []struct {
name string
percent float64
price float64
want float64
}{
{"10 foiz", 10, 100, 90},
{"50 foiz", 50, 200, 100},
{"chegirmasiz", 0, 100, 100},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
s := PercentDiscount{Percent: tc.percent}
got := s.Apply(tc.price)
if got != tc.want {
t.Errorf("Apply(%.0f) = %.2f, kutilgan %.2f", tc.price, got, tc.want)
}
})
}
}Bu — allaqachon tanish naqsh, faqat endi u dizayn naqshi (Strategy) bilan birlashtirilgan holda ko'rsatilmoqda: jadvaldagi har bir qator turli xil chegirma stsenariysini ifodalaydi, va bitta test funksiyasi ularning barchasini bir xil kodda tekshiradi. Bu — real loyihalarda naqshlarni sinashning aynan qanday ko'rinishda bo'lishini ko'rsatadi.
E'tibor bering: bu darsda ham, oldingi "Professional Go Testing" kursidagidek, kodingiz Go Playground'da haqiqiy go test sifatida ishga tushiriladi — chiqishda === RUN va --- PASS qatorlarini ko'rasiz.
>_ Exercise
FixedDiscount strategiyasi uchun jadval asosidagi test yozing.
- •FixedDiscount struct'i (Amount float64) va Apply metodini yozing (price - Amount, manfiy bo'lsa 0)
- •TestFixedDiscount funksiyasida kamida ikkita holatni (oddiy va manfiyga aylanadigan) jadval bilan tekshiring
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Dizayn naqshlari (masalan Strategy)ni sinashda ham jadval asosidagi testlar juda qulay — har bir qator bitta stsenariyni ifodalaydi, bitta test funksiyasi esa ularning barchasini tekshiradi.
NEXT UP
Object Pooling with sync.Pool
$ go run main.go
Kodingizni ishga tushiring