testing.T.Parallel în Go

Anunță că testul poate rula în paralel cu alte teste paralele, ca suita să se termine mai repede.

Sintaxă
func (t *T) Parallel()

Ce face testing.T.Parallel

Implicit testele unui pachet rulează unul după altul. t.Parallel(), apelat la începutul unui test sau subtest, îl pune în așteptare (PAUSE) până se termină testele obișnuite; apoi testele paralele rulează împreună (CONT). Numărul maxim simultan este dat de opțiunea -parallel (implicit numărul de procesoare).

Merită pentru teste care așteaptă (rețea, disc, time.Sleep) sau sunt independente și lente. Testele paralele nu au voie să modifice date comune fără sincronizare și nu pot folosi t.Setenv sau t.Chdir.

Ce returnează

Nimic.

Exemple

Exemplul 1: Subteste paralele

Fiecare subtest așteaptă 300 ms; rulând în paralel, testul durează aproximativ 0,3 s în loc de 0,9 s.

// fișierul curs_test.go
package magazin

import (
    "testing"
    "time"
)

func cursValutar(moneda string) float64 {
    time.Sleep(300 * time.Millisecond) // simulăm o cerere lentă
    return map[string]float64{"EUR": 4.97, "USD": 4.58, "GBP": 5.81}[moneda]
}

func TestCursValutar(t *testing.T) {
    for _, moneda := range []string{"EUR", "USD", "GBP"} {
        t.Run(moneda, func(t *testing.T) {
            t.Parallel()
            if cursValutar(moneda) <= 0 {
                t.Errorf("curs lipsă pentru %s", moneda)
            }
        })
    }
}

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

$ go test -v
=== RUN   TestCursValutar
=== RUN   TestCursValutar/EUR
=== PAUSE TestCursValutar/EUR
=== RUN   TestCursValutar/USD
=== PAUSE TestCursValutar/USD
=== RUN   TestCursValutar/GBP
=== PAUSE TestCursValutar/GBP
=== CONT  TestCursValutar/EUR
=== CONT  TestCursValutar/GBP
=== CONT  TestCursValutar/USD
--- PASS: TestCursValutar (0.00s)
    --- PASS: TestCursValutar/USD (0.30s)
    --- PASS: TestCursValutar/GBP (0.30s)
    --- PASS: TestCursValutar/EUR (0.30s)
PASS
ok  	magazin	0.593s

Greșeli frecvente

  • Testele paralele scriu în aceeași variabilă globală sau în același fișier. Rezultatul depinde de ordinea întâmplătoare; rulează cu go test -race ca să găsești problema.
  • Folosești t.Setenv într-un test paralel: testul se oprește cu panică.

Comenzi înrudite

  • 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.
  • testing.T: Tipul primit de fiecare funcție de test; prin el raportezi erori, scrii mesaje și controlezi testul.