Treci la conținutul principal

Un singur test, multe cazuri

Majoritatea funcțiilor au nevoie de aceeași verificare pentru multe intrări: valori normale, valori negative, zero, cazuri-limită. Dacă copiezi testul de cinci ori, ai cinci locuri de întreținut.

Modul Go este testul bazat pe tabel: pui cazurile de test într-un slice de structuri — fiecare caz conține un nume, intrările și rezultatul așteptat — și le parcurgi cu o singură buclă.

Adăugarea unui caz nou devine o singură linie nouă în tabel. Acesta este cel mai des întâlnit tipar de test din codul Go real.


Tabelul

Tabelul este un slice de structuri anonime, definit chiar în interiorul testului. Fiecare element este un caz de test: un nume (pentru mesajul de eșec), intrările și rezultatul așteptat.

Bucla apelează funcția o dată pentru fiecare caz și raportează fiecare nepotrivire cu t.Errorf — astfel apar toate cazurile greșite, nu doar primul.

Patru cazuri într-un singur tabel

Patru cazuri, o buclă, o verificare. Toate trec aici. Ca să testezi o a cincea situație, ai adăuga o linie în tabel — bucla rămâne neatinsă.

Prompt
Scrie un test Go bazat pe tabel pentru o funcție Add: un slice de structuri anonime cu un nume de caz, două intrări int și rezultatul așteptat, care acoperă one plus one, positive and negative, both negative și zeros. Parcurge tabelul cu o buclă și raportează nepotrivirile cu t.Errorf, incluzând numele cazului. Arată ieșirea go test -v.
Ieșire: program Go și rezultatul capturat
Four cases in one table

Subteste cu t.Run

t.Run(name, func(t *testing.T) { … }) transformă fiecare caz din tabel într-un subtest separat. Numele cazurilor apar acum în ieșirea go test -v, de exemplu TestAdd/both_negative (spațiile devin liniuțe de subliniere).

Fiecare subtest trece sau eșuează pe cont propriu, ceea ce face ca un caz stricat să fie ușor de observat într-un tabel lung.

Fiecare caz primește un nume

Același tabel, împachetat în t.Run. Ieșirea detaliată listează acum toate cele patru cazuri separat — vezi exact care cazuri au rulat și au trecut.

Prompt
Scrie același test Go bazat pe tabel pentru Add, dar rulează fiecare caz ca subtest cu t.Run, folosind numele cazului, astfel încât fiecare caz să apară separat în ieșirea detaliată. Arată ieșirea go test -v cu toate liniile de subtest.
Ieșire: program Go și rezultatul capturat

Rularea unui singur caz

Subtestele pot fi selectate din linia de comandă cu -run, folosind TestName/subtest_name:

go test -v -run "TestAdd/both_negative"

Rulează doar subtestul care se potrivește. Este perfect când repari un caz stricat: rulezi din nou doar acel caz până când trece, apoi rulezi din nou totul.

Filtrare cu -run

Același fișier ca mai sus, rulat cu -run "TestAdd/both_negative". Se execută doar unul dintre cele patru cazuri — celelalte nici măcar nu sunt pornite.

Prompt
Folosind testul Go bazat pe tabel pentru Add cu subteste t.Run, arată ieșirea rulării unui singur caz cu go test -v -run "TestAdd/both_negative" — trebuie să apară doar acel subtest.
Ieșire: program Go și rezultatul capturat