Eine Einführung in das Testen in Go

Das Testen ist in jeder Software von großer Bedeutung. In der Lage zu sein, die Korrektheit Ihres Codes sicherzustellen und sicherzustellen, dass alle Änderungen, die Sie vornehmen, nichts anderes in verschiedenen Teilen Ihrer Codebasis beeinträchtigen, ist äußerst wichtig.

Indem Sie sich die Zeit nehmen, Ihre Go-Programme angemessen zu testen, erlauben Sie sich, schneller mit einem größeren Gefühl der Zuversicht zu entwickeln, dass das, was Sie entwickeln, weiterhin funktioniert, wenn Sie es für die Produktion freigeben.

Am Ende dieses Tutorials haben Sie ein gutes Verständnis für das Testen grundlegender Funktionen und Methoden in Go mit dem Standardpaket "testing".

Sie haben Erfahrung beim Schreiben von tabellengesteuerten Tests und werden auch sehen, wie Sie mithilfe der verschiedenen verfügbaren Flags ausführlichere Ausgaben aus Ihren Tests generieren können.

Video-Tutorial

Dieses Tutorial kann im Videoformat gefunden werden, wenn Sie es vorziehen:

Einführung

In diesem Tutorial werden wir uns ansehen, wie Sie mit dem Befehl go test Tests für Ihren Go-Code entwickeln und ausführen können.

Go-Testdateien

Wenn Sie bereits go-Projekte gesehen haben, haben Sie möglicherweise bemerkt, dass die meisten, wenn nicht alle Dateien im Projekt, ein FILE_test.go -Gegenstück in demselben Verzeichnis enthalten.

Dies ist kein Zufall. Dies sind die Dateien, die alle Komponententests für das Projekt enthalten und den gesamten Code in ihren Gegenstücken testen.

Beispiel für Projektstruktur
myproject/- calc.go- calc_test.go- main.go- main_test.go

Eine einfache Testdatei

Stellen Sie sich vor, wir hätten ein sehr einfaches Go-Programm, das aus einer Datei bestand und eine calculate() -Funktion enthielt. Diese calculate() -Funktion nimmt einfach 1number auf und fügt 2 hinzu. Schön und einfach, uns zum Laufen zu bringen:

main.gehen Sie

Wenn wir dies testen möchten, können wir eine main_test.go -Datei im selben Verzeichnis erstellen und den folgenden Test schreiben:

main_test .gehen
package mainimport ( "testing")func TestCalculate(t *testing.T) { if Calculate(2) != 4 { t.Error("Expected 2 + 2 to equal 4") }}

Ausführen unserer Tests

Nachdem wir unseren ersten Go-Test erstellt haben, ist es an der Zeit, dies auszuführen und zu prüfen, ob sich ourcode so verhält, wie wir es erwarten. Wir können unsere Tests ausführen, indem wir ausführen:

$ go test

Dies sollte dann etwas Ähnliches wie das Folgende ausgeben:

$ go test
PASSok _/Users/elliot/Documents/Projects/tutorials/golang/go-testing-tutorial 0.007s

Tabellengesteuertes Testen

Nun, da wir froh sind, dass eine Berechnung funktioniert, sollten wir versuchen, das Vertrauen zu verbessern, indem wir unserem Code ein paar zusätzliche Testfälle hinzufügen. Wenn wir regelmäßig eine Reihe von Testfällen aufbauen wollen, die immer getestet werden, können wir eine array von Tests wie folgt durchschneiden:

Hier deklarieren wir eine Struktur, die sowohl eine Eingabe als auch den erwarteten Wert enthält. Durchlaufen Sie dann die Liste der Tests mit unserem Aufruf for _, test := range tests und überprüfen Sie, ob unsere Funktion unabhängig von der Eingabe immer die erwarteten Ergebnisse zurückgibt.

Wenn wir jetzt unsere Testsuite ausführen, sollten wir die gleiche Ausgabe wie zuvor sehen:

$ zum Test
PASSok _/Users/elliot/Documents/Projects/tutorials/golang/go-testing-tutorial 0.007s

Ausführliche Testausgabe

Manchmal möchten Sie vielleicht genau sehen, welche Tests ausgeführt werden und wie lange sie gedauert haben. Zum Glück ist dies verfügbar, wenn Sie das Flag -v verwenden, wenn Sie Ihre Tests wie folgt ausführen:

$ go test -v

Sie können sehen, dass sowohl unser normaler Test als auch unser Tabellentest ausgeführt und bestanden wurden und weniger als 0.00s ausgeführt wurden.

Überprüfen der Testabdeckung

Die Testabdeckung ist eine Metrik, die ich manchmal von Unternehmen missbraucht habe. Diese Unternehmen legen Ziele für alle ihre Systeme fest, z. B. „Die Codebasis muss zu mindestens 75% durch Tests abgedeckt sein“.

Aber diese Art von Zielen kann zu schlechtem Verhalten führen und Entwicklungsteams „spielen“das System, um zu versuchen, diese Ziele zu treffen. Ich habe Leute in einigen Teams gesehen, die Tage damit verbracht haben, Komponententests zu schreiben, die grundlegende Getter und Setter in Sprachen wie Java testen.

Testen ist enorm wichtig, aber Sie müssen pragmatisch sein, wie Sie Ihre Systeme testen, damit die Tests, die Sie schreiben, Ihnen den größten Nutzen bringen.

Die Tage, die Sie mit dem Schreiben von Tests verbracht haben, um unwichtige Teile Ihrer Codebasis abzudecken, hätten besser damit verbracht werden können, Testfälle rund um die kritischen Geschäftslogiken in Ihren Systemen zu schreiben und sicherzustellen, dass mehr Randfälle abgedeckt werden.

Mit dem Flag -cover

Nachdem der wichtige Teil aus dem Weg geräumt wurde, sehen wir uns an, wie Sie die Testabdeckung Ihres Systems mit dem Befehl go test überprüfen können:

Führen Sie im selben Verzeichnis wie Ihre Dateien main.go und main_test.go Folgendes aus:

$ go test -cover
PASScoverage: 66.7% of statementsok github.com/TutorialEdge/an-intro-to-testing-in-go 0.006s

Sie werden sehen, dass Sie 66.7% Ihres gesamten Go-Codes durch Testfälle abgedeckt haben.

Visualisierung der Abdeckung

Dieser 66.7% -Wert kann uns zwar sagen, wie viel von unserem Code wir getestet haben, zeigt uns jedoch nicht genau, welche Codepfade wir haben oder nicht getestet haben.

Hier kommen der go test und der go tool cover ins Spiel, um uns bei der Lösung dieses speziellen Problems zu helfen.

Mit dem go test -Tool können wir eine coverprofile generieren, die dann mit dem go tool cover -Befehl in eine HTML-Visualisierung umgewandelt werden kann:

$ go test -coverprofile=coverage.out
PASScoverage: 66.7% of statementsok github.com/TutorialEdge/an-intro-to-testing-in-go 0.008s

Sie können dann diese generierte coverage.out -Datei verwenden, um eine HTML-Seite zu generieren, die genau zeigt, welche Zeilen so behandelt wurden:

$ go tool cover -html=coverage.out

Dies öffnet eine Seite in Ihrem Browser der Wahl, die ein bisschen so aussehen wird:

Wie Sie sehen können, ist der größte Teil des Codes in unserer Calculate -Funktion das Testen undfeatures Green Abdeckung. Während die print-Anweisung in Ihrer main -Funktion Red ist, da dies nicht durch Tests abgedeckt wurde.

Hoffentlich fanden Sie dieses Tutorial nützlich! Wenn Sie weitere Unterstützung benötigen, können Sie mich dies bitte im Kommentarbereich unten mitteilen.