💎 Lehrpfad 4: Cloud Microservices & Testing

Go 15: Automatisiertes Testing, Table-Driven Tests & Benchmarks

Schreibe hochgradig wartbare und performante Go-Tests: Nutze das Table-Driven Test Pattern, Subtests mit t.Run() und exakte Micro-Benchmarks mit b *testing.B.

📂 Dateien dieser Lerneinheit:
📄 aufgabe.go (Startercode) 🧪 test_aufgabe.go (Tests) 💡 musterloesung.go (Lösung) 📖 README.md

📊 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, "-")
    }
}
$ go test -bench=. -benchmem
BenchmarkFastJoin-8   18542100    62.4 ns/op    48 B/op   1 allocs/op
PASS
ok   exercise/testing   1.234s
🏢 Didaktische Analogie: Der TÜV-Prüfstand für Hochleistungsmotoren

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

💡 Clean Code Tipp: Error-Prüfungen in Table-Tests

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.

💻 In Web-IDE öffnen → ← Zurück zu Go 14 Weiter zum Master-Abschlussprojekt →