Ce face testing.T.Fatal
t.Fatal și t.Fatalf sunt ca t.Error/t.Errorf, dar opresc imediat funcția de test (apelează t.FailNow, care oprește goroutine-ul testului). Restul liniilor din test nu mai rulează; funcțiile înregistrate cu defer și t.Cleanup rulează. Celelalte teste din pachet rulează normal.
Folosește Fatal când testul nu poate continua: pregătirea a eșuat (fișier de test lipsă, conexiune refuzată) sau o funcție a returnat eroare și rezultatul ei e invalid. Atenție: t.Fatal trebuie apelat din goroutine-ul testului, nu din goroutine pornite de test.
Parametri
| Parametru | Descriere |
|---|---|
args |
Valorile mesajului. |
format |
La Fatalf: șablonul mesajului. |
Ce returnează
Nu se întoarce: testul curent se oprește.
Exemple
Exemplul 1: Oprirea testului la o eroare
Al doilea test primește eroare de la funcție; Fatalf îl oprește înainte să folosească rezultatul invalid.
// fișierul client.go
package magazin
import (
"errors"
"strings"
)
type Client struct {
Nume, Email, Oras string
}
func ParseazaClient(rand string) (*Client, error) {
c := strings.Split(rand, ";")
if len(c) != 3 {
return nil, errors.New("rândul trebuie să aibă 3 câmpuri")
}
return &Client{Nume: c[0], Email: c[1], Oras: c[2]}, nil
}
// fișierul client_test.go
package magazin
import "testing"
func TestParseazaClient(t *testing.T) {
c, err := ParseazaClient("Ana;ana@exemplu.ro;Iași")
if err != nil {
t.Fatalf("eroare neașteptată: %v", err)
}
if c.Oras != "Iași" {
t.Errorf("Oras = %q", c.Oras)
}
}
func TestParseazaClientFaraOras(t *testing.T) {
c, err := ParseazaClient("Mihai;mihai@exemplu.ro")
if err != nil {
t.Fatalf("eroare neașteptată: %v", err)
}
t.Log("această linie nu se mai execută")
if c.Nume != "Mihai" {
t.Errorf("Nume = %q", c.Nume)
}
}
Rezultatul în terminal (timpii diferă la fiecare rulare)
$ go test -v
=== RUN TestParseazaClient
--- PASS: TestParseazaClient (0.00s)
=== RUN TestParseazaClientFaraOras
client_test.go:18: eroare neașteptată: rândul trebuie să aibă 3 câmpuri
--- FAIL: TestParseazaClientFaraOras (0.00s)
FAIL
exit status 1
FAIL magazin 0.280s
Exemplul 2: Ce se întâmplă cu Error în loc de Fatal
Cu t.Errorf, testul continuă și folosește c, care este nil: testul se oprește cu panică. (Am scurtat lista de apeluri de la final.)
// fișierul client_test.go (aceeași funcție ParseazaClient)
package magazin
import "testing"
func TestParseazaClientFaraOras(t *testing.T) {
c, err := ParseazaClient("Mihai;mihai@exemplu.ro")
if err != nil {
t.Errorf("eroare neașteptată: %v", err) // greșit: trebuia Fatalf
}
if c.Nume != "Mihai" {
t.Errorf("Nume = %q", c.Nume)
}
}
Rezultatul în terminal (timpii diferă la fiecare rulare)
$ go test
--- FAIL: TestParseazaClientFaraOras (0.00s)
client_test.go:8: eroare neașteptată: rândul trebuie să aibă 3 câmpuri
panic: runtime error: invalid memory address or nil pointer dereference [recovered, repanicked]
[signal SIGSEGV: segmentation violation code=0x2 addr=0x0 pc=0x102692dac]
goroutine 4 [running]:
...
magazin.TestParseazaClientFaraOras(0x5eb29498c248)
/home/ana/magazin/client_test.go:10 +0x6c
...
exit status 2
FAIL magazin 0.293s
Greșeli frecvente
- Apelezi
t.Fataldintr-o goroutine pornită în test. Oprește doar acea goroutine, nu testul; trimite eroarea pe un canal și apeleazăFatalîn testul principal (sau foloseștet.Error). - Folosești
Fatalpentru fiecare verificare. Afli câte o singură problemă pe rulare; pentru verificări independentet.Errore mai util.
Comenzi înrudite
testing.T.Error: Marchează testul ca eșuat și scrie un mesaj, dar lasă testul să continue (Errorf formatează ca Printf).testing.T.Cleanup: Înregistrează o funcție de curățenie care rulează după ce testul (și subtestele lui) s-au terminat.log.Fatal: Scrie mesajul în jurnal și oprește imediat programul cu codul 1 (ca log.Print urmat de os.Exit(1)).testing.T: Tipul primit de fiecare funcție de test; prin el raportezi erori, scrii mesaje și controlezi testul.