Testen in Go (Golang): Frameworks und Tools

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

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 mit go 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

Empfehlungen