© BadBrother/Shutterstock.com
Entwickler Magazin
Testen und Benchmarks in Go

Auf die Plätze, fertig, go!

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.

Andreas Schröpfer


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.

Listing 1func 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. In Listing 2 ist das Beispiel aus der Dokumentation der Standard-Library zu sehen.

Listing 2func TestFoo(t *testing.T) { // t.Run("A=1", func(t *testing.T) { ... }) t.Run("A=2", func(t *testing.T) { ... }) t.Run("B=1", func(t *testing.T) { ... }) // }

Um mehrere Testfälle abbilden zu können, haben sich sogenannte tabellarische Tests durchgesetzt. Hierfür wird eine anonyme Struktur definiert, welche die Inputwerte und die erwarteten Werte beinhaltet. Die einzelnen Testfälle werden dann innerhalb einer Schleife als Subtests abgearbeitet. Listing 3 zeigt die Testschleife, Listing 4 den Output.

Listing 3func TestAdd(t *testing.T) { type args struct { a string } tests := []struct { name string inputA int inputB int ...

Entwickler Magazin
Testen und Benchmarks in Go

Auf die Plätze, fertig, go!

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.

Andreas Schröpfer


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.

Listing 1func 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. In Listing 2 ist das Beispiel aus der Dokumentation der Standard-Library zu sehen.

Listing 2func TestFoo(t *testing.T) { // t.Run("A=1", func(t *testing.T) { ... }) t.Run("A=2", func(t *testing.T) { ... }) t.Run("B=1", func(t *testing.T) { ... }) // }

Um mehrere Testfälle abbilden zu können, haben sich sogenannte tabellarische Tests durchgesetzt. Hierfür wird eine anonyme Struktur definiert, welche die Inputwerte und die erwarteten Werte beinhaltet. Die einzelnen Testfälle werden dann innerhalb einer Schleife als Subtests abgearbeitet. Listing 3 zeigt die Testschleife, Listing 4 den Output.

Listing 3func TestAdd(t *testing.T) { type args struct { a string } tests := []struct { name string inputA int inputB int ...

Neugierig geworden?


   
Loading...

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang