Testen in Go (Golang): Frameworks und Werkzeuge – vollständiger Leitfaden

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 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:



  1. Interface definieren:


package main

type UserService interface { GetUser(id int) (string, error)}


  1. Mock generieren:


mockgen -source=user.go -destination=mock_user.go -package=main


  1. 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,

Empfehlungen