Tema
/
Struktūrinis programavimas GO
Pamoka 13 / 14 Testavimas (go test) ~45 min
📖 Teorija

Pratybos — parašyk testus

Skaityti testus neužtenka — reikia juos rašyti. Penkios pratybos: kiekvienai parašyk lentelės testą funkcijai, kurią jau turi (iš ankstesnių pamokų), paleisk go test ir palygink su sprendimu. Funkcija įvardyta kiekvienoje; sprendimas — pats testas.

1 (lengva) — testuok sumRange (5 pamoka): sumuoja sveikuosius nuo a iki b.

func TestSumRange(t *testing.T) {
    cases := []struct {
        a, b, want int
    }{
        {1, 5, 15},
        {3, 3, 3},
        {0, 0, 0},
    }
    for _, c := range cases {
        if got := sumRange(c.a, c.b); got != c.want {
            t.Errorf("sumRange(%d, %d) = %d, want %d", c.a, c.b, got, c.want)
        }
    }
}

2 (lengva) — testuok digitSum (5 pamoka): sumuoja skaitmenis. Įtrauk neigiamą, kad patikrintum tą kraštą.

func TestDigitSum(t *testing.T) {
    cases := []struct {
        in, want int
    }{
        {1234, 10},
        {0, 0},
        {-52, 7},
    }
    for _, c := range cases {
        if got := digitSum(c.in); got != c.want {
            t.Errorf("digitSum(%d) = %d, want %d", c.in, got, c.want)
        }
    }
}

3 (vidutinė) — testuok slug (7 pamoka): mažosios, tarpai → brūkšneliai, be kraštų.

func TestSlug(t *testing.T) {
    cases := []struct {
        in, want string
    }{
        {"  The Go Language ", "the-go-language"},
        {"Go", "go"},
    }
    for _, c := range cases {
        if got := slug(c.in); got != c.want {
            t.Errorf("slug(%q) = %q, want %q", c.in, got, c.want)
        }
    }
}

4 (vidutinė) — testuok grade (5 pamoka). Klaidos gyvena ribose — testuok 90, 89, 80, o ne tik „gerą balą".

func TestGrade(t *testing.T) {
    cases := []struct {
        score int
        want  string
    }{
        {90, "A"},
        {89, "B"},
        {80, "B"},
        {69, "F"},
    }
    for _, c := range cases {
        if got := grade(c.score); got != c.want {
            t.Errorf("grade(%d) = %q, want %q", c.score, got, c.want)
        }
    }
}

5 (sunkesnė) — testuok per ilgo pavadinimo šaką validateTitle. Reikia pasidaryti tikslaus ilgio įėjimą. Naudok strings.Repeat — ir prisimink, kad skaičiuoja simboliai, tad 41 „ą" viršija 40 simbolių ribą (nors tai 82 baitai).

func TestValidateTitleTooLong(t *testing.T) {
    long := strings.Repeat("ą", 41) // 41 simbolis, 82 baitai
    got := validateTitle(long)
    want := "title is too long (max 40 characters)"
    if got != want {
        t.Errorf("validateTitle(41 chars) = %q, want %q", got, want)
    }
}

Patarimas. Nori pamatyti raudoną? Tyčia pakeisk vieną want į klaidingą reikšmę ir paleisk go test — perskaityk nesėkmės eilutę, tada grąžink atgal. Žinoti, kaip atrodo krentantis testas — tai pusė pasitikėjimo praeinančiu.