Andreas Schröpfer Selbstständig

Go als moderne Sprache benötigt keine externen Programme für das Testen. Die Tests werden einfach als typischer Go-Code implementiert.

Ziel dieses Artikels ist es, die eingebaute Testfunktionalität von Go vorzustellen. Gemeinsam mit build und install ist die Anweisung test eine der wichtigsten Funktionalitäten des Go Toolings. Neben den Tests können dort auch einfach Benchmarks erzeugt werden, was unheimlich hilfreich bei der Laufzeitoptimierung von Programmen ist. Anschließend betrachten wir, wie das Testen in Visual Studio Code integriert wurde und welche weiteren Tools dem Go-Tester das Leben erleichtern.

Einen wichtigen Teil von Go stellt das integrierte Testtool dar. Die Macher der Programmiersprache haben diese Funktionalität direkt in Go integriert, sodass für Tests keine zusätzlichen Pakete oder Programme notwendig sind. Die Tests werden mit dem Befehl go test ausgeführt. Dabei ist es möglich, jeden Test einzeln oder alle Tests eines Projekts gleichzeitig auszuführen.

Für die Bezeichnung der Testfiles wird der zu testenden Datei _test angehängt. Für server.go würde man server_test.go anlegen. Diese Logik ist nicht neu und hat zur Folge, dass bei einer Sortierung nach dem Dateinamen die Tests immer bei den dazugehörigen Dateien stehen. Da Go sehr schnell kompiliert, ist die Ausführung der Tests entsprechend fix.

Für die Tests gibt es in der Standard-Library das Paket testing. Das Paket bietet, wie die Sprache Go, nur ein paar wichtige Funktionalitäten ohne viel Schnickschnack. Die Funktionen für Tests müssen immer die Form TestXxx(*testing.T) aufweisen. Innerhalb der Funktion werden die Tests mit einfachen if-Abfragen geprüft. Sollten die Werte ungleich der erwarteten Werte sein, so wird über t.Error() ein Fehler ausgegeben. Ein ganz einfacher Test in Go würde dabei aussehen wie in Listing 1. Das Listing zeigt die Einfachheit der Tests in Go. Die Sprachdesigner haben sich bewusst dafür entschieden, Tests nicht wesentlich von anderem Programmcode zu unterscheiden: Testcode ist auch Go-Code.

func TestFoo(t *testing.T) {
  got := foo("bar")
  want := "bar"
  if got != want {
  t.Errorf("foo() = %v, want %v", got, want)
  }
}

Wenn man innerhalb einer Testfunktion mehrere Tests durchführen möchte, so werden Subtests verwendet. Hierfür wird in der Funktion t.Run() ein String als Testname hinzugefügt.

Den vollständigen Artikel lesen Sie in der Ausgabe:

Entwickler Magazin 3.18 - "Automatization Now!"

Alle Infos zum Heft
579835512Testen und Benchmarks in Go
X
- Gib Deinen Standort ein -
- or -