testing.T.Helper în Go

Marchează o funcție ca ajutătoare, ca erorile raportate din ea să arate linia din test care a apelat-o.

Sintaxă
func (c *T) Helper()

Ce face testing.T.Helper

Când muți verificări repetate într-o funcție proprie (de exemplu verificaPret(t, got, vrem)), mesajele de eroare arată implicit linia din acea funcție, aceeași pentru toate apelurile. Nu știi care apel a eșuat.

t.Helper(), apelat la începutul funcției ajutătoare, îi spune lui Go s-o sară când stabilește fișierul și linia mesajului. Eroarea va arăta linia din test de unde a fost apelată funcția.

Ce returnează

Nimic.

Exemple

Exemplul 1: Fără Helper: aceeași linie pentru toate erorile

// fișierul pret.go
package magazin

func PretFinal(net float64, cantitate int) float64 {
    return net * float64(cantitate) * 1.19 // greșit: TVA este 21%
}

// fișierul pret_test.go
package magazin

import "testing"

func verificaPret(t *testing.T, got, vrem float64) {
    if got != vrem {
        t.Errorf("preț %.2f, aștept %.2f", got, vrem)
    }
}

func TestPretFinal(t *testing.T) {
    verificaPret(t, PretFinal(100, 1), 121)
    verificaPret(t, PretFinal(10, 0), 0)
    verificaPret(t, PretFinal(50, 2), 121)
}

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

$ go test
--- FAIL: TestPretFinal (0.00s)
    pret_test.go:7: preț 119.00, aștept 121.00
    pret_test.go:7: preț 119.00, aștept 121.00
FAIL
exit status 1
FAIL	magazin	0.319s

Exemplul 2: Cu Helper: linia din test

Singura diferență este t.Helper(). Acum mesajele arată liniile din TestPretFinal (13 și 15 în fișier) de unde au fost apelate verificările care au eșuat.

// fișierul pret_test.go
package magazin

import "testing"

func verificaPret(t *testing.T, got, vrem float64) {
    t.Helper()
    if got != vrem {
        t.Errorf("preț %.2f, aștept %.2f", got, vrem)
    }
}

func TestPretFinal(t *testing.T) {
    verificaPret(t, PretFinal(100, 1), 121)
    verificaPret(t, PretFinal(10, 0), 0)
    verificaPret(t, PretFinal(50, 2), 121)
}

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

$ go test
--- FAIL: TestPretFinal (0.00s)
    pret_test.go:13: preț 119.00, aștept 121.00
    pret_test.go:15: preț 119.00, aștept 121.00
FAIL
exit status 1
FAIL	magazin	0.301s

Greșeli frecvente

  • Apelezi t.Helper() în funcția de test însăși. Nu are efect util; se pune în funcțiile ajutătoare.

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.Run: Rulează o funcție ca subtest, cu nume propriu; ideal pentru testele bazate pe un tabel de cazuri.
  • testing.T.Cleanup: Înregistrează o funcție de curățenie care rulează după ce testul (și subtestele lui) s-au terminat.