Testen in Go (Golang): Frameworks und Werkzeuge
Testen ist ein wesentlicher Bestandteil der Entwicklung zuverlässiger Software. Die Sprache Go (Golang) wurde von Anfang an mit Blick auf die Anforderungen des Testens entwickelt: In der Standardbibliothek ist das leistungsstarke Paket testing enthalten, und darum herum hat sich ein reichhaltiges Ökosystem zusätzlicher Werkzeuge entwickelt. In diesem Artikel werden wir die wichtigsten Frameworks und Werkzeuge zum Testen in Go im Detail besprechen, einschließlich des Schreibens von Unit-Tests, der Verwendung von Mocks, des BDD-Ansatzes und von Benchmarks.
1. Das Standardpaket testing
Der Kern des Testens in Go ist das Paket testing. Es bietet einen minimalistischen, aber sehr effektiven Satz von Funktionen. Tests werden in Dateien mit dem Suffix _test.go geschrieben und sind gewöhnliche Funktionen mit der Signatur func TestXxx(t *testing.T).
Beispiel eines einfachen Tests für eine Additionsfunktion:
package main
import "testing"
func Add(a, b int) int { return a + b}
func TestAdd(t *testing.T) { result := Add(2, 3) expected := 5 if result != expected { t.Errorf("Add(2, 3) = %d; want %d", result, expected) }}Die Tests werden mit folgendem Befehl ausgeführt:
go test ./...Das Paket testing unterstützt außerdem:
- Tabellentests – zum Überprüfen mehrerer Eingabedaten.
- Subtests (mit
t.Run) – zur Gruppierung und parallelen Ausführung. - Benchmarks – Funktionen der Form
func BenchmarkXxx(b *testing.B). - Beispiele – Funktionen
func ExampleXxx(), die auch als Dokumentation dienen.
2. Testify – Erweiterung der Testmöglichkeiten
Testify ist eine der beliebtesten Drittanbieter-Bibliotheken zum Testen in Go. Sie erweitert das Standardpaket testing und bietet:
- assert – praktische Funktionen zum Überprüfen von Bedingungen mit verständlichen Fehlermeldungen.
- require – dasselbe wie assert, bricht aber die Testausführung bei einem Fehler ab.
- suite – die Möglichkeit, Tests als Suite zu strukturieren (Struktur mit Methoden).
- mock – ein einfaches Framework zum Erstellen von Mock-Objekten.
Beispiel für die Verwendung von assert und suite:
package main
import ( "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/suite")
type MySuite struct { suite.Suite Value int}
func (s *MySuite) SetupTest() { s.Value = 10}
func (s *MySuite) TestValue() { assert.Equal(s.T(), 10, s.Value, "Value should be 10")}
func TestMySuite(t *testing.T) { suite.Run(t, new(MySuite))}Testify macht den Testcode lesbarer und reduziert die Menge an Boilerplate-Code.
3. GoMock – Generierung von Mocks
GoMock ist ein Framework zum Erstellen von Mock-Objekten auf Basis von Interfaces. Es besteht aus zwei Teilen:
- mockgen – ein Dienstprogramm zum Generieren von Mock-Code.
- gomock – ein Paket zur Verwendung von Mocks in Tests.
Beispiel für die Verwendung von GoMock:
- Interface definieren:
package main
type UserService interface { GetUser(id int) (string, error)}- Mock generieren:
mockgen -source=user.go -destination=mock_user.go -package=main- Im Test verwenden:
func TestGetUserName(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish()
mockService := NewMockUserService(ctrl) mockService.EXPECT().GetUser(1).Return("Alice", nil)
name, Auch in der Bibliothek
Datenbankmigrationen in C++: Überblick über Tools und Bibliotheken
E-Mail-Versand mit TypeScript: Bibliotheken und Codebeispiele
JWT-Token in Java: Vollständiger Leitfaden zur Arbeit mit JSON Web Tokens
Datenvalidierung in Java: Überblick über Bibliotheken und Ansätze