Go har inbyggd testning via testing-paketet och kommandot go test — ingen extern ramverk behövs. Tester ligger i _test.go-filer, och Go betonar starkt table-driven tests, benchmarks och bra verktyg som första klassens funktioner.
Go har inbyggd testning via testing-paketet och kommandot go test — ingen extern ramverk behövs. Tester ligger i _test.go-filer, och Go betonar starkt table-driven tests, benchmarks och bra verktyg som första klassens funktioner.
// 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)
En testfunktion börjar med Test, tar *testing.T och rapporterar fel via t.Errorf/t.Fatalf. Det finns inga assertion-nyckelord — du kontrollerar villkor med vanlig if och rapporterar fel (Go förespråkar denna explicita 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)
}
})
}
}
Table-driven tests är det dominanta Go-idiom — definiera en slice av fall, loopa över dem med t.Run subtester. Detta gör det trivialt att lägga till fall och ger tydlig, individuell framgångs-/misslyckad rapportering per fall.
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
Flaggan -race är särskilt viktig — den detekterar datakapningar i concurrent kod, ett nyckkelverktyg givet Gos fokus på concurrency.
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
Testning är en första klassens, inbyggd del av Go — testing-paketet och go test kräver ingen extern ramverk, vilket reflekterar Gos betoning på testning som en kärnpraxis.
Att förstå konventionerna är väsentlig daglig kunskap: _test.go-filen och TestXxx(t *testing.T)-strukturen, den explicita (assertion-lös) felrapporteringsstilen, och särskilt det table-driven test-mönster som dominerar idiomatisk Go (täcker kompakt många fall med tydlig per-fall-rapportering via subtester).
Lika viktigt är Gos inbyggda benchmarks (prestanda som ett testablt problem) och det kraftfulla verktygen — täckningsanalys och särskilt -race-detektorn, som hittar datakapningar i concurrent kod (vital givet Gos concurrency-tunga användning).
Att veta hur man skriver effektiva, idiomatiska Go-tester, använder race-detektorn och utnyttjar httptest/interfaces för att testa riktiga komponenter är en kännetecken för professionell Go-utveckling och ett ofta återkommande ämne som reflekterar kodkvalitets-flytande.
Ett bibliotek med IT-intervjufrågor och detaljerade svar — från Junior till Senior.
Donera