Ce este un test unitar
Un test unitar este un mic program care verifică o singură bucată din codul tău — de obicei o singură funcție. Rulezi testele după fiecare modificare; dacă o modificare strică ceva, un test îți spune imediat, înainte să afle utilizatorii tăi.
Go îți oferă din start tot ce ai nevoie: pachetul testing și comanda go test fac parte din uneltele limbajului. Nicio bibliotecă suplimentară de instalat, nicio configurare — doar un fișier alături de codul tău.
Testele fac și modificările sigure: cu teste bune poți rescrie o funcție și afli în câteva secunde dacă se comportă în continuare la fel.
Fișiere de test și funcții de test
Două reguli de denumire fac dintr-un test un test:
1. Numele fișierului se termină în _test.go — pentru calc.go scrii calc_test.go. Astfel de fișiere sunt compilate doar de go test, niciodată în build-ul tău obișnuit.
2. Funcția se numește TestXxx — începe cu Test, urmează o literă mare și primește un singur argument: t *testing.T.
În interiorul testului apelezi funcția, compari ce ai obținut (got) cu ce te aștepți (want) și raportezi o eșuare prin t atunci când diferă. Dacă nu se raportează nicio eșuare, testul trece.
Un prim test care trece
TestAdd apelează Add(2, 3) și compară rezultatul cu 5. Se potrivesc, așa că nu se raportează nimic și testul trece: go test afișează PASS.
Ieșire: program Go și rezultatul capturat
package calc
import "testing"
func Add(a, b int) int {
return a + b
}
func TestAdd(t *testing.T) {
got := Add(2, 3)
want := 5
if got != want {
t.Errorf("Add(2, 3) = %d; așteptat %d", got, want)
}
}
Un test care eșuează
Acest Add are o eroare — înmulțește. Testul o prinde: t.Errorf afișează mesajul cu valorile got și want, iar rularea se încheie cu FAIL.
Ieșire: program Go și rezultatul capturat
package calc
import "testing"
// Add are o eroare: înmulțește în loc să adune.
func Add(a, b int) int {
return a * b
}
func TestAdd(t *testing.T) {
got := Add(2, 3)
want := 5
if got != want {
t.Errorf("Add(2, 3) = %d; așteptat %d", got, want)
}
}
Rularea testelor
go test rulează toate testele din folderul curent. Este tăcut când totul merge bine — o singură linie ok — și vorbește doar când ceva eșuează.
go test -v (verbose) listează fiecare test după nume, cu linii === RUN și --- PASS. Folosește-l ca să vezi ce a rulat de fapt. Pentru un proiect întreg, go test ./... rulează testele din fiecare folder.
Două teste, ieșire detaliată
Fișierul are două funcții de test, câte una pentru fiecare funcție testată. Cu -v, fiecare apare separat în ieșire — poți vedea că ambele au rulat și ambele au trecut.
Ieșire: program Go și rezultatul capturat
package calc
import "testing"
func Double(n int) int {
return n * 2
}
func Half(n int) int {
return n / 2
}
func TestDouble(t *testing.T) {
if Double(4) != 8 {
t.Error("Double(4) ar trebui să fie 8")
}
}
func TestHalf(t *testing.T) {
if Half(8) != 4 {
t.Error("Half(8) ar trebui să fie 4")
}
}