Golang-Tests im Unterverzeichnis


120

Ich möchte in Go ein Paket mit Tests und Beispielen für das Paket als Unterverzeichnisse erstellen, um den Arbeitsbereich sauberer zu halten. Ist das möglich und wenn ja wie?

In der gesamten Dokumentation wird der Testcode immer an der gleichen Stelle wie der andere Code platziert. Ist dies in irgendeiner Weise besser oder nur eine Konvention?


5
Hinweis: go test ./...Führt Tests für den aktuellen Ordner und alle Unterordner aus. Siehe meine Antwort unten
VonC


ich habe das gleiche gedacht. Probleme beim Ausführen von Tests in einem separaten Verzeichnis, da der Direktor auf derselben Ebene Unterverzeichnisse hat.
filthy_wizard

Antworten:


200

Beachten Sie, dass Sie "rekursiv" ausführen könnengo test : Sie müssen alle Pakete auflisten, die Sie testen möchten .

Wenn Sie sich im Stammordner Ihres Go-Projekts befinden, geben Sie Folgendes ein:

go test ./...

Die ' ./...' Notation wird im Abschnitt " Beschreibung der Paketlisten " des " Befehlsgo " beschrieben:

Ein Importpfad ist ein Muster, wenn er einen oder mehrere ...Platzhalter enthält, von denen jeder mit einer beliebigen Zeichenfolge übereinstimmen kann, einschließlich der leeren Zeichenfolge und der Zeichenfolgen mit Schrägstrichen.

Ein solches Muster wird auf alle in den GOPATHBäumen gefundenen Paketverzeichnisse mit Namen erweitert, die mit den Mustern übereinstimmen.

Als Sonderfall auch x/...Übereinstimmungen xsowie xdie Unterverzeichnisse.
Zum Beispiel net/...dehnt sich netin den Unterverzeichnissen und Pakete.


Wenn Sie Ihre _test.goDateien in einem Unterordner aufbewahren, kann der go test ./...Befehl ' ' sie abholen.
Aber:

  • Sie müssen Ihren exportierten Variablen und Funktionen (die in Ihren Tests verwendet werden) den Namen Ihres Pakets voranstellen, damit die Testdatei auf den exportierten Paketinhalt zugreifen kann.
  • Sie würden nicht auf nicht exportierte Inhalte zugreifen.

Trotzdem würde ich es immer noch vorziehen, die _test.goDatei direkt neben der Hauptquelldatei zu behalten : Sie ist leichter zu finden.


4
Einige könnten argumentieren, dass der Nichtzugriff auf private Inhalte normale Black-Box-Tests sind und besser. Wenn Sie öffentliche Symbole qualifizieren müssen, können Sie immer _ "..." importieren.
ddevienne

15

Platzieren Sie Ihre Tests neben Ihrem Code im selben Verzeichnis in einer Datei mit dem Namen file_test.go"file" ist der Name der Quellcodedatei, die Sie testen. Dies ist eine Konvention, und ich habe festgestellt, dass sie meiner eigenen Erfahrung nach am besten ist.

Wenn das go testTool für Sie nicht ausreichend automatisiert ist, können Sie sich GoConvey ansehen , das über eine Web-Benutzeroberfläche verfügt , die sowohl herkömmliche Go-Tests als auch GoConvey-Tests (die auf dem Verhalten basieren und sich selbst dokumentieren) automatisch aktualisiert und ausführt als herkömmliche Go-Tests).


2
GoConvey ist großartig (und ich warte mit großer Vorfreude auf die neue Benutzeroberfläche). Ich verwende es in meinem aktuellen Projekt (z. B. unter github.com/VonC/asciidocgo/blob/master/abstractNode_test.go ). Allerdings go testkönnen auch für Unterordner arbeiten. Siehe meine Antwort unten
VonC

Du hast Recht. In der Tat ist es wahrscheinlich relevanter als meine Antwort auf diese Frage.
Matt

9

BEARBEITET

Aufbauend auf VonCs Antwort,

Diese Antwort ist gültig in go1.11. Noch nicht in oberen goVersionen getestet .

Für diejenigen unter Ihnen, die ihre Tests beispielsweise in einem Unterordner aufbewahren testund dann ausführen möchten

go test ./...

Es wird versucht, Tests in jedem Ordner auszuführen , auch in solchen, die keinen Test enthalten. Daher wird ?im nachfolgenden Bericht ein Ordner für Nicht-Testordner angezeigt.

Laufen

go test ./.../test

Stattdessen werden nur Ihre testOrdner als Ziel ausgewählt, sodass ein sauberer Bericht nur für Ihre Testordner erstellt wird.

VORSICHT

Beachten Sie bitte, dass die Verwendung von Testunterordnern die Berechnung von Abdeckungsberichten verhindert. Die Phylosophie von go besteht darin, Testdateien in den Paketordnern zu belassen.


1
Guter Tipp, zusätzlich zu meiner fünf Jahre alten Antwort. Upvoted
VonC

liebe anna, bitte erkläre was nicht funktioniert und was ist deine version von go? Was versuchst du zu machen? Danach wurde mir klar, dass diese Methode keine Codeabdeckung berechnen darf, was schade ist. Ist es das was du meinst?
avi.elkharrat

1
go test ./.../testreturn go: warning: "./.../test" matched no packages// zielt nicht nur auf Testordner ab. go version go1.13 darwin / amd64
anna

1
@Madeo, dies wäre sinnvoll, da Golang die Trennung von Tests und Code nicht fördert. Die Anomalie bestand darin, dies in früheren Versionen zuzulassen.
avi.elkharrat

1
@ avi.elkharrat und tatsächlich habe ich beschlossen, diesen Ansatz nicht mehr zu verwenden, obwohl ich meine Tests gerne in einem separaten Paket / Ordner aufbewahren wollte = (
Madeo

-4

Normalerweise teste ich nicht, aber Sie können Ihre Datei in Verzeichnissen gruppieren und importieren wie verwenden

import "./models"if ist eine Ebene out
import "../modelswenn ist eine Ebene out und eine Ebene in

Zum Beispiel für:
./models/todo.go
./test/todo_test.go

In dem Test todo.goaus todo_test.go, den Import in dem todo_test.gosein wird

import "../models"


Diese Methode zum Importieren des Codes funktioniert nur für exponierte Funktionen. Es scheint sich nicht so zu verhalten, als wären sie im selben Paket, obwohl Sie sie explizit im selben Paket abgelegt haben. Diese Lösung löst das Problem beim Testen von Einheiten also nicht wirklich.
Der anmutige Pinguin
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.