testing.T.Error în Go

Marchează testul ca eșuat și scrie un mesaj, dar lasă testul să continue (Errorf formatează ca Printf).

Sintaxă
func (c *T) Error(args ...any)
func (c *T) Errorf(format string, args ...any)

Ce face testing.T.Error

t.Error scrie valorile ca fmt.Println, iar t.Errorf le formatează ca fmt.Printf. Ambele marchează testul ca eșuat (FAIL) și scriu mesajul cu fișierul și linia, dar testul continuă. Așa afli dintr-o singură rulare toate verificările care au eșuat.

Sunt echivalente cu t.Log/t.Logf urmat de t.Fail(). Când o eroare face restul testului inutil (sau periculos, de exemplu o valoare nil), folosește t.Fatal.

Parametri

Parametru Descriere
args Valorile mesajului.
format La Errorf: șablonul mesajului.

Ce returnează

Nimic.

Exemple

Exemplul 1: Toate verificările eșuate, într-o singură rulare

Funcția are două greșeli: nu elimină spațiile din nume și scrie orașul cu majuscule. Testul raportează ambele.

// fișierul client.go
package magazin

import "strings"

type Client struct {
    Nume, Email, Oras string
}

// ParseazaClient citește un rând de forma "nume;email;oraș".
func ParseazaClient(rand string) Client {
    c := strings.Split(rand, ";")
    return Client{Nume: c[0], Email: strings.TrimSpace(c[1]), Oras: strings.ToUpper(c[2])}
}

// fișierul client_test.go
package magazin

import "testing"

func TestParseazaClient(t *testing.T) {
    c := ParseazaClient(" Ana Popescu;ana@exemplu.ro;Iași")
    if c.Nume != "Ana Popescu" {
        t.Errorf("Nume = %q, aștept %q", c.Nume, "Ana Popescu")
    }
    if c.Email != "ana@exemplu.ro" {
        t.Errorf("Email = %q, aștept %q", c.Email, "ana@exemplu.ro")
    }
    if c.Oras != "Iași" {
        t.Error("Oras greșit:", c.Oras)
    }
}

Rezultatul în terminal (timpii diferă la fiecare rulare)

$ go test
--- FAIL: TestParseazaClient (0.00s)
    client_test.go:8: Nume = " Ana Popescu", aștept "Ana Popescu"
    client_test.go:14: Oras greșit: IAȘI
FAIL
exit status 1
FAIL	magazin	0.300s

Exemplul 2: Verificarea unei erori așteptate

// fișierul stoc.go
package magazin

import (
    "errors"
    "fmt"
)

var ErrStocInsuficient = errors.New("stoc insuficient")

func Scoate(stoc map[string]int, produs string, n int) error {
    if stoc[produs] < n {
        return fmt.Errorf("%s: %w", produs, ErrStocInsuficient)
    }
    stoc[produs] -= n
    return nil
}

// fișierul stoc_test.go
package magazin

import (
    "errors"
    "testing"
)

func TestScoate(t *testing.T) {
    stoc := map[string]int{"cafea": 3}
    if err := Scoate(stoc, "cafea", 2); err != nil {
        t.Errorf("Scoate 2 din 3: eroare neașteptată: %v", err)
    }
    err := Scoate(stoc, "cafea", 5)
    if !errors.Is(err, ErrStocInsuficient) {
        t.Errorf("Scoate 5 din 1: eroare %v, aștept ErrStocInsuficient", err)
    }
    if stoc["cafea"] != 1 {
        t.Error("stoc final", stoc["cafea"], "aștept 1")
    }
}

Rezultatul în terminal (timpii diferă la fiecare rulare)

$ go test -v
=== RUN   TestScoate
--- PASS: TestScoate (0.00s)
PASS
ok  	magazin	0.313s

Greșeli frecvente

  • Folosești t.Error și apoi continui să folosești o valoare care poate fi nil. Testul se oprește cu panică; folosește t.Fatal în acest caz.
  • Scrii mesaje vagi (t.Error("greșit")). Include intrarea, ce ai primit și ce aștepți.

Comenzi înrudite

  • testing.T.Fatal: Marchează testul ca eșuat, scrie mesajul și oprește imediat testul curent; celelalte teste continuă.
  • testing.T: Tipul primit de fiecare funcție de test; prin el raportezi erori, scrii mesaje și controlezi testul.
  • testing.T.Helper: Marchează o funcție ca ajutătoare, ca erorile raportate din ea să arate linia din test care a apelat-o.
  • testing.T.Run: Rulează o funcție ca subtest, cu nume propriu; ideal pentru testele bazate pe un tabel de cazuri.