Go ima ugrađeno testiranje preko testing paketa i go test naredbe — nije potreban vanjski okvir. Testovi se nalaze u _test.go datotekama, a Go snažno naglašava testove vođene tabelom, benchmark-ove i dobar alat kao svojstva prvog reda.
Go ima ugrađeno testiranje preko testing paketa i go test naredbe — nije potreban vanjski okvir. Testovi se nalaze u _test.go datotekama, a Go snažno naglašava testove vođene tabelom, benchmark-ove i dobar alat kao svojstva prvog reda.
// math.go
func Add(a, b int) int { return a + b }
// math_test.go — same package, _test.go suffix
import "testing"
func TestAdd(t *testing.T) { // Test prefix + *testing.T parameter
result := Add(2, 3)
if result != 5 {
t.Errorf("Add(2,3) = %d; want 5", result) // report failure (continues)
// t.Fatalf stops the test immediately
}
}
// run with: go test (or `go test -v` for verbose, `go test ./...` for all packages)
Funkcija testa počinje sa Test, prima *testing.T, i bilježi greške preko t.Errorf/t.Fatalf. Nema ključnih reči za tvrdnje — uslove provjeravate običnim if i bilježite greške (Go favorizira ovaj eksplicitan stil).
func TestAdd(t *testing.T) {
tests := []struct { // a table of test CASES
name string
a, b int
expected int
}{
{"positives", 2, 3, 5},
{"with zero", 0, 5, 5},
{"negatives", -1, -1, -2},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { // a SUBTEST per case (named, isolated)
if got := Add(tt.a, tt.b); got != tt.expected {
t.Errorf("Add(%d,%d) = %d; want %d", tt.a, tt.b, got, tt.expected)
}
})
}
}
Testovi vođeni tabelom su dominantan Go idiom — definirajte slic slučajeva, petljajte kroz njih sa t.Run podtestovima. To čini dodavanje slučajeva trivijalno i daje jasnu, pojedinačnu prolaz/neuspjeh prijavu po slučaju.
func BenchmarkAdd(b *testing.B) {
for i := 0; i < b.N; i++ { // the framework chooses b.N for statistical accuracy
Add(2, 3)
}
}
// go test -bench=. → reports ns/op (and -benchmem for allocations)
go test -cover # coverage percentage
go test -coverprofile=c.out # then: go tool cover -html=c.out (visual report)
go test -race # the RACE DETECTOR — finds data races (crucial for concurrency)
go test -run TestAdd # run specific tests
Zastava -race je posebno važna — detektuje trkače podataka u konkurentnom kodu, ključan alat s obzirom na fokus Go-a na konkurentnost.
func TestMain(m *testing.M) { // package-level setup/teardown
setup()
code := m.Run()
teardown()
os.Exit(code)
}
// t.Helper() marks a function as a test helper (better failure line reporting)
// httptest package for testing HTTP handlers; interfaces for mocking dependencies
Testiranje je svojstvo prvog reda, ugrađeni dio Go-a — testing paket i go test ne zahtijevaju vanjski okvir, što odražava naglasak Go-a na testiranje kao temeljnu praksu.
Razumijevanje konvencija je bitno, svakodnevno znanje: _test.go datoteka i TestXxx(t *testing.T) struktura, eksplicitan (bez tvrdnji) stil izvještavanja o greškama, i posebno obrazac testa vođenog tabelom koji dominira idiomatskim Go-om (kompaktno pokrivajući mnoge slučajeve sa jasnom prijavljom po slučaju preko podtestova).
Jednako važni su Go-jevi ugrađeni benchmark-ovi (performanse kao testirana briga) i moćan alat — analiza pokrivanja i posebno detektor -race, koji pronalazi trkače podataka u konkurentnom kodu (bitan s obzirom na konkurentnost Go-a).
Znanje kako pisati učinkovite, idiomatske Go testove, koristiti detektor trkača, i leverirati httptest/interfejse za testiranje stvarnih komponenti je odlika profesionalnog Go razvoja i česta tema koja odražava fluentnost kvalitete koda.
Knjižnica IT pitanja za razgovore za posao s detaljnim odgovorima — od Juniora do Seniora.
Doniraj