testing.T.Fatal în Go

Marchează testul ca eșuat, scrie mesajul și oprește imediat testul curent; celelalte teste continuă.

Sintaxă
func (c *T) Fatal(args ...any)
func (c *T) Fatalf(format string, args ...any)

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.Fatal dintr-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ște t.Error).
  • Folosești Fatal pentru fiecare verificare. Afli câte o singură problemă pe rulare; pentru verificări independente t.Error e 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.