Go har indbygget testing via testing-pakken og go test-kommandoen — ingen ekstern framework er nødvendig. Tests ligger i _test.go-filer, og Go lægger stærk vægt på table-driven tests, benchmarks og god tooling som førsteklasses features.
Go har indbygget testing via testing-pakken og go test-kommandoen — ingen ekstern framework er nødvendig. Tests ligger i _test.go-filer, og Go lægger stærk vægt på table-driven tests, benchmarks og god tooling som førsteklasses features.
// 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 starter med Test, tager *testing.T og rapporterer fejl via t.Errorf/t.Fatalf. Der er ingen assertion-nøgleord — du tjekker betingelser med almindeligt if og rapporterer fejl (Go foretrækker denne eksplicitte 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 er det dominerende Go-idiom — definer et udsnit af tilfælde, loop gennem dem med t.Run subtests. Dette gør det trivielt at tilføje tilfælde og giver klar, individuel bestået/ikke-bestået-rapportering per tilfælde.
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
-race-flaget er særligt vigtigt — det detekterer data races i concurrent kode, et nøgleredskab givet Go's concurrent fokus.
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
Testing er en førsteklasses, indbygget del af Go — testing-pakken og go test kræver ingen ekstern framework, hvilket afspejler Go's vægt på testing som en kernepraksis.
At forstå konventionerne er væsentlig daglig viden: _test.go-filen og TestXxx(t *testing.T)-strukturen, den eksplicitte (assertion-løse) fejlrapporteringsstil, og især det table-driven test-mønster, der dominerer idiomatisk Go (kompakt der dækker mange tilfælde med klar pr.-tilfælde-rapportering via subtests).
Ligeså vigtig er Go's indbyggede benchmarks (performance som en testbar bekymring) og den kraftfulde tooling — coverage-analyse og især -race-detectoren, som finder data races i concurrent kode (afgørende givet Go's concurrent-tungt brug).
At vide, hvordan man skriver effektive, idiomatiske Go-tests, bruger race detectoren, og udnytter httptest/interfaces til at teste rigtige komponenter er et kendetegn på professionel Go-udvikling og et hyppigt emne, der afspejler kodekvalities-flydende.