Testen in Go (Golang): Frameworks und Tools
Go (Golang) ist eine der wenigen Sprachen, bei denen das Testen auf der Ebene der Standardbibliothek integriert ist. Dank des integrierten Pakets testing und leistungsstarker Drittanbieter-Tools können Entwickler zuverlässige und leistungsfähige Anwendungen erstellen. In diesem Artikel werden wir die wichtigsten Frameworks und Hilfsprogramme zum Testen von Go-Code behandeln: von einfachen Unit-Tests über Mocks bis hin zur Überprüfung von Goroutine-Leaks.
Integriertes Paket testing
Das Paket testing ist die Grundlage des gesamten Testens in Go. Tests werden in Dateien mit dem Suffix _test.go geschrieben. Testfunktionen müssen die Signatur func TestXxx(t *testing.T) haben. Gestartet werden sie mit dem Befehl go test.
package main
import ( "testing")
func Sum(a, b int) int { return a + b}
func TestSum(t *testing.T) { result := Sum(2, 3) expected := 5 if result != expected { t.Errorf("Sum(2,3) = %d; want %d", result, expected) }}Für tabellarische Tests wird ein Slice von Strukturen verwendet:
func TestSumTable(t *testing.T) { tests := []struct { a, b, expected int }{ {1, 2, 3}, {0, 0, 0}, {-1, 1, 0}, } for _, tt := range tests { result := Sum(tt.a, tt.b) if result != tt.expected { t.Errorf("Sum(%d,%d) = %d; want %d", tt.a, tt.b, result, tt.expected) } }}Ebenfalls unterstützt werden:
- Benchmarks — Funktionen
func BenchmarkXxx(b *testing.B), gestartet mitgo test -bench=. - Beispiele — Funktionen
func ExampleXxx()zur Generierung von Dokumentation und Überprüfung der Ausgabe. - Subtests —
t.Run("name", func(t *testing.T) {...})zur Gruppierung und parallelen Ausführung.
Testify — Erweiterung der Möglichkeiten
Testify ist das beliebteste Framework zum Testen in Go. Es fügt praktische Asserts, Mocks und eine Reihe von Hilfsprogrammen hinzu.
Die wichtigsten Pakete von Testify:
assert— Überprüfungen mit verständlichen Fehlermeldungen.require— wie assert, bricht den Test jedoch bei einem Fehler ab.mock— Erstellung und Überprüfung von Mock-Objekten.suite— Gruppierung von Tests in Klassen (TDD-Stil).
import ( "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock")
// Beispiel für die Verwendung von assertfunc TestSumWithTestify(t *testing.T) { assert.Equal(t, 5, Sum(2, 3)) assert.NotEqual(t, 0, Sum(-1, 1))}
// Beispiel für einen Mock mit testify/mocktype Calculator interface { Add(a, b int) int}
type MockCalculator struct { mock.Mock}
func (m *MockCalculator) Add(a, b int) int { args := m.Called(a, b) return args.Int(0)}
func TestWithMock(t *testing.T) { mockCalc := new(MockCalculator) mockCalc.On("Add", 2, 3).Return(5)
result := mockCalc.Add(2, 3) assert.Equal(t, 5, result) mockCalc.AssertExpectations(t)}Gomock — Generierung von Mocks aus Interfaces
Gomock (ein Fork des Originals von Google) ist ein Tool zur automatischen Generierung von Mocks auf Basis von Interfaces. Es wird zusammen mit dem Hilfsprogramm mockgen verwendet.
Installation und grundlegendes Beispiel:
// Installationgo install go.uber.org/mock/mockgen@latest
// Generierung eines Mocks für ein Interface// mockgen -source=calculator.go -destination=mock_calculator.go -package=main
// Verwendung im Testfunc TestWithGomock(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish()
mockCalc := NewMockCalculator(ctrl) mock Auch in der Bibliothek
HTML-Parsing in C# (.NET): Bibliotheken HtmlAgilityPack und AngleSharp
AutoMapper für C# (.NET): Vollständiger Leitfaden mit Beispielen
CameraX für Kotlin: Komplettes Tutorial mit Beispielen
Juniper: Elegante GraphQL-Bibliothek in Rust für moderne Webanwendungen
E-Mail-Versand in C++: Bibliotheken und Implementierung