Wie führe ich Testfälle in einer bestimmten Datei aus?

205

Meine Pakettestfälle sind auf mehrere Dateien verteilt. Wenn ich sie ausführe go test <package_name>, werden alle Testfälle im Paket ausgeführt.

Es ist jedoch nicht erforderlich, alle auszuführen. Gibt es eine Möglichkeit, eine go testauszuführende Datei anzugeben , sodass nur in der Datei definierte Testfälle ausgeführt werden?


quelle

Antworten:

326

Es gibt zwei Möglichkeiten. Am einfachsten ist es, das -runFlag zu verwenden und ein Muster anzugeben, das den Namen der Tests entspricht, die Sie ausführen möchten.

Beispiel:

$ go test -run NameOfTest

Weitere Informationen finden Sie in den Dokumenten .

Die andere Möglichkeit besteht darin, die spezifische Datei zu benennen, die die Tests enthält, die Sie ausführen möchten:

$ go test foo_test.go

Aber da ist ein Fang. Dies funktioniert gut, wenn:

  • foo.goist in package foo.
  • foo_test.goist in package foo_testund importiert 'foo'.

Wenn foo_test.gound foo.godasselbe Paket sind (ein häufiger Fall), müssen Sie alle anderen zum Erstellen erforderlichen Dateien benennen foo_test. In diesem Beispiel wäre es:

$ go test foo_test.go foo.go

Ich würde empfehlen, das -runMuster zu verwenden. Oder führen Sie nach Möglichkeit immer alle Pakettests durch.

zzzz
quelle
1
Würde es Ihnen etwas ausmachen, den ersten (einfachen) Weg mit -runbitte auszuarbeiten ? Ich kann keine manuelle Referenz zu diesem finden.
1
Sie können auch Informationen darüber mitgo help testflag
Jeffrey Martinez
Wenn ich den Befehl benutze, ist go test utils.go utils_test.godie Ausgabe ok command-line-arguments 0.002s. Der Test wird nicht ausgeführt. Der Grund, warum ich diesen Testmodus verwenden möchte, ist, dass das Paket viele Dateien enthält und diese außer Utils noch nicht kompiliert werden. Daher möchte ich Utils finalisieren, bevor ich an anderen Dateien arbeite. Wie kann ich das machen ?
chmike
Wenn Sie sehen möchten, was beim Testen protokolliert wird, sollten Sie das -v(ausführliche) Flag erwähnen . Aus den Dokumenten-v Verbose output: log all tests as they are run. Also print all text from Log and Logf calls even if the test succeeds.
Robstarbuck
121

Die Antwort von @ zzzz ist größtenteils vollständig. Um jedoch zu verhindern, dass andere die referenzierte Dokumentation durchforsten müssen, können Sie einen einzelnen Test in einem Paket wie folgt ausführen:

go test packageName -run TestName

Beachten Sie, dass Sie den Namen des Tests übergeben möchten, nicht den Dateinamen, in dem der Test vorhanden ist.

Das -runFlag akzeptiert tatsächlich einen regulären Ausdruck, sodass Sie den Testlauf auf eine Klasse von Tests beschränken können. Aus den Dokumenten:

-run regexp
    Run only those tests and examples matching the regular
    expression.
TomDotTom
quelle
28
Erwähnenswert ist, dass der Paketname der vollständige Paketname ist, z. B. "github.com/you/stuff/a/b/c"
Garbagecollector
1.9.3 akzeptiert auch den relativen Pfad des Pakets.
2
Ich weiß nicht warum, aber aus irgendeinem Grund sollte ich "./" vor dem Paketnamen angeben
Roozbeh Zabihollahi
12

Wenn ich einen einzelnen Test durchführe, mache ich normalerweise:

go test -run TestSomethingReallyCool ./folder1/folder2/ -v -count 1

-count 1stellt außerdem sicher, dass der Test jedes Mal ausgeführt wird, anstatt zwischengespeichert zu werden. Nützlich, wenn Sie gegen Rennbedingungen testen und einen Test haben, der nur manchmal fehlschlägt. In Go-Versionen, in denen keine Module verwendet werden, kann dasselbe durch Festlegen erreicht werden GOCACHE=off, dies interagiert jedoch schlecht mit Go-Modulen.

Francesco Casula
quelle
6

Im IntelliJ IDEA Go-Lang-Plugin (und ich nehme an, in Jetbrains Gogland) können Sie die Testart einfach auf Datei unter Ausführen> Konfigurationen bearbeiten einstellen

Screenshot erstellen go test on go Datei

Robert King
quelle
2
In Gogland können Sie einfach mit der rechten Maustaste auf die Testdatei klicken und "run foo_test.go" auswählen. Das Paket wird mit den Tests erstellt und anschließend eine Regex mit den Namen aller Tests in dieser Testdatei an das Flag -run übergeben. Eine wirklich nützliche Funktion.
Eloff
4
alias testcases="sed -n 's/func.*\(Test.*\)(.*/\1/p' | xargs | sed 's/ /|/g'"

go test -v -run $(cat coordinator_test.go | testcases)
user2865442
quelle
2
go test -v ./<package_name> -run Test

Verhindert das Zwischenspeichern von Testergebnissen.

go test -count=1 ./<package_name> -run Test
Dele
quelle
0
go test -v -timeout 30s <path_to_package> -run ^(TestFuncRegEx)
  • Der TestFunc muss sich in einer goTestdatei in diesem Paket befinden
  • Wir können einen regulären Ausdruck bereitstellen, der mit einer Reihe von Testfällen übereinstimmt, oder nur die genaue Testfallfunktion, um einen einzelnen Testfall auszuführen. Zum Beispiel-run TestCaseFunc
Abhishek Srivastava
quelle