Testen in Go (Golang): Frameworks und Werkzeuge
Go (Golang) wurde von Anfang an mit den Anforderungen der modernen Entwicklung konzipiert, daher gibt es in der Standardbibliothek bereits das leistungsstarke Paket testing. Für komplexe Projekte sind jedoch oft zusätzliche Werkzeuge erforderlich: Mocks, Assertions, BDD-Stil und die Überprüfung auf Goroutine-Leaks. In diesem Artikel werden wir die wichtigsten Frameworks und Bibliotheken für das Testen in Go durchgehen, Codebeispiele zeigen und erklären, wann was verwendet werden sollte.
1. Integriertes Paket testing
Das Standardpaket testing ist die Grundlage von allem. Tests werden in Dateien mit dem Suffix _test.go geschrieben, und die Funktionen müssen die Signatur func TestXxx(t *testing.T) haben. Beispiel:
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) }}Tests ausführen: go test ./.... Für Benchmarks wird testing.B verwendet, für Beispiele ExampleXxx.
2. Bibliothek testify
Testify ist die beliebteste Drittanbieter-Bibliothek für das Testen in Go. Sie bietet praktische Assertions, Mocks und Hilfsfunktionen.
Installation:
go get github.com/stretchr/testifyBeispiel mit Assertions:
package main
import ( "testing" "github.com/stretchr/testify/assert")
func TestSumWithTestify(t *testing.T) { result := Sum(2, 3) assert.Equal(t, 5, result, "Sum should be 5") assert.NotEqual(t, 0, result) assert.True(t, result > 0)}Testify enthält auch das Paket mock zum Erstellen von Mocks. Beispiel:
package main
import ( "testing" "github.com/stretchr/testify/mock")
// DataService — Schnittstelle, die wir mocken werdentype DataService interface { GetData(id int) string}
// MockDataService — Mock-Strukturtype MockDataService struct { mock.Mock}
func (m *MockDataService) GetData(id int) string { args := m.Called(id) return args.String(0)}
func TestGetData(t *testing.T) { mockService := new(MockDataService) mockService.On("GetData", 1).Return("result1")
result := mockService.GetData(1) assert.Equal(t, "result1", result) mockService.AssertExpectations(t)}3. gomock — Generierung von Mocks
Gomock von Google ist ein Framework zur Generierung von Mocks auf Basis von Schnittstellen. Es funktioniert über das Dienstprogramm mockgen.
Installation:
go install github.com/golang/mock/mockgen@v1.6.0Anwendungsbeispiel:
//go:generate mockgen -source=service.go -destination=mock_service.go -package=main
type Service interface { Process(data string) error}
// Im Test:func TestProcess(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish()
mockService := NewMockService(ctrl) mockService.EXPECT().Process("test").Return(nil)
err := mockService.Process("test") assert.NoError(t, err)}Gomock eignet sich gut für große Projekte mit vielen Schnittstellen – die Codegenerierung spart Zeit.
4. ginkgo — BDD-Stil
Ginkgo ist ein Framework für Behaviour-Driven Development (BDD). Es ermöglicht das Schreiben von Tests im Stil von "Describe", "Context" und "It".
Installation:
go get github.com/onsi/ginkgo/v2go get github.com/onsi/gomegaBeispiel:
package main
import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" "testing")
func TestCalculator( Auch in der Bibliothek
Arbeiten mit Bildern in C# (.NET): Vollständiger Leitfaden
Bildverarbeitung in Kotlin: resize und crop mit der ImageMagick-Bibliothek
Testen in C++: Überblick über Frameworks und Tools (Google Test, Catch2, doctest)
tsx für TypeScript: Vollständige Anleitung mit Beispielen