📊 1. Das Table-Driven Testing Pattern
In Go ist das Table-Driven Test Pattern der unangefochtene Standard. Anstatt Dutzende fast identische Testfunktionen zu schreiben, definieren wir eine Tabelle (Slice von anonymen Structs) mit Testfällen:
package mypkg_test
import "testing"
func TestAdd(t *testing.T) {
// 🎯 Test-Tabelle definieren:
tests := []struct {
name string
a, b int
expected int
}{
{"Positive Zahlen", 2, 3, 5},
{"Negative Zahlen", -1, -5, -6},
{"Null-Addition", 0, 10, 10},
}
for _, tt := range tests {
// Subtests mit t.Run für isolierte Testberichte:
t.Run(tt.name, func(t *testing.T) {
actual := Add(tt.a, tt.b)
if actual != tt.expected {
t.Errorf("Add(%d, %d) = %d; erwartet %d", tt.a, tt.b, actual, tt.expected)
}
})
}
}
⚡ 2. Performance-Messung mit Benchmarks
Go bringt ein natives Benchmark-Tooling mit. Eine Benchmark-Funktion hat die Signatur func BenchmarkXxx(b *testing.B). Die Schleife for i := 0; i < b.N; i++ wird von Go so lange iteriert, bis eine statistisch signifikante Messung feststeht:
func BenchmarkFastJoin(b *testing.B) {
input := []string{"cloud", "native", "microservice", "golang", "api"}
b.ReportAllocs() // Zeigt Speicherallokationen (B/op & allocs/op)
b.ResetTimer() // Ignoriert Setup-Zeit vor der Schleife
for i := 0; i < b.N; i++ {
_ = FastJoin(input, "-")
}
}
BenchmarkFastJoin-8 18542100 62.4 ns/op 48 B/op 1 allocs/op
PASS
ok exercise/testing 1.234s
Table-Driven Tests sind die standardisierte Checkliste: Reifendruck, Bremsen, Scheinwerfer – jeder Testfall wird der Reihe nach abgehakt.
Benchmarks (b.N) sind der Rollenprüfstand: Der Motor läuft auf Maximaldrehzahl, bis der Prüfcomputer exakt weiß, wie viel PS (ns/op) und wie viel Sprit (Bytes/op) verbraucht werden!
📑 3. Cheat-Sheet: Testing Flags & Befehle
| Befehl | Wirkung | Praxis-Nutzen |
|---|---|---|
go test -v ./... |
Ausführliche Testausgabe inkl. Einzelergebnisse | Standard im Entwickler-Alltag |
go test -cover |
Gibt Testabdeckung in Prozent aus (z.B. 92.4%) | CI/CD Quality Gate |
go test -race ./... |
Aktiviert Go Race Detector | Erkennt nebenläufige Datenkonflikte sofort |
go test -bench=. -benchmem |
Führt alle Benchmarks mit Memory-Profiling aus | Performance- und Allokationsoptimierung |
🎯 Aufgaben & Checkliste in aufgabe.go
Verwende ein Flag wantErr bool in deiner Test-Struktur, um sowohl positive Gut-Fälle als auch negative Fehler-Fälle in einer einzigen, sauberen Testschleife abzudecken.