Salt la conținutul principal
Modulul 9 · Lecția 1 din 541/50 în curs~12 min
Lecții din modul (1/5)

Pachetul `testare`

În Go, testele sunt parte din stdlib: fără bibliotecă externă, fără cadru de configurat. Tot ce aveți nevoie este un fișier *_test.go lângă cod, câteva funcții TestXxx și comanda go test.

Convenții de bază

  • Fișierele de testare sunt denumite <something>_test.go și trăiesc în același pachet ca și codul pe care îl testează (sau într-un pachet <name>_test pentru „testele cutie neagră”).
  • Funcțiile de testare au o semnătură exactă: func TestXxx(t *testing.T) unde Xxx începe cu o literă mare.
  • Importați testing din stdlib.
  • Nu assertEquals: folosești if got != want { t.Errorf(...) } cu fmt-verbe.
Go
// math.go
package math

func Sum(a, b int) int { return a + b }

// math_test.go
package math

import "testing"

func TestSum(t *testing.T) {
    got := Sum(2, 3)
    if got != 5 {
        t.Errorf("Sum(2,3) = %d; voglio %d", got, 5)
    }
}

Rulați-l cu:

Bash
go test ./...        # all packages in the module
go test -v ./pkg     # verbose: prints test names
go test -run TestSum  # only tests matching the regex

t.Error vs t.Fatal

Acestea sunt cele două verbe de bază pentru a semnala un eșec:

MetodaEfect
t.Log(args...)Înregistrează, dar nu eșuează (vizibil numai cu -v sau în caz de eșec).
t.Error(args...)Înregistrează, marchează FAIL, continuă funcția de testare.
t.Errorf(fmt, ...)Precum Error cu formatare.
t.Fatal(args...)Înregistrează, marchează FAIL, oprește testul (apelează runtime.Goexit).
t.Fatalf(fmt, ...)Precum Fatal cu formatare.

Regula generală: utilizați Fatal atunci când continuarea nu are sens (de exemplu, configurare eșuată, dereferire iminentă a indicatorului zero); în caz contrar, Error, care vă permite să vedeți toate eșecurile într-o singură rulare.

Go
func TestOpen(t *testing.T) {
    f, err := os.Open("fixtures/sample.txt")
    if err != nil {
        t.Fatal(err) // if it doesn't open, the next steps would fail on nil
    }
    defer f.Close()
    // ... assert on content with t.Errorf
}

Configurați și demontați cu t.Cleanup

Pentru a elibera resurse la sfârșitul unui test (sau sub-test), utilizați t.Cleanup în loc de defer:

Go
func TestDB(t *testing.T) {
    db := newTestDB(t)
    t.Cleanup(func() { db.Close() })
    // ... test
}

Avantajul față de defer: asistentul care creează db poate înregistra curățarea intern, astfel încât apelanții nu trebuie să-l amintească.

Testează ajutoarele

Metoda t.Helper() marchează o funcție ca „ajutor”: atunci când un test eșuează, urmărirea stivei omite funcția de ajutor și indică direct apelantul:

Go
func mustParseInt(t *testing.T, s string) int {
    t.Helper()
    n, err := strconv.Atoi(s)
    if err != nil {
        t.Fatalf("parse %q: %v", s, err)
    }
    return n
}

Exerciții

Exercițiu#go.m9.l1.e1
Încercări: 0Se încarcă…

Definiți funcția TestSum care verifică Sum(2,3) == 5 folosind t.Errorf cu un mesaj formatat.

Se încarcă editorul...

Soluție disponibilă după 3 încercări

Exercițiu#go.m9.l1.e2
Încercări: 0Se încarcă…

În TestDiv, utilizați t.Fatal pentru a opri imediat testul dacă Div returnează o valoare neașteptată.

Se încarcă editorul...

Soluție disponibilă după 3 încercări

Quiz#go.m9.l1.e3
Gata

Care este diferența fundamentală dintre t.Error și t.Fatal?

Go
if err != nil {
  t.???(err)
}
Opțiuni de răspuns