Es gibt eine presentation von Andrew Gerrand (eines der Kernmitglieder des Go-Teams), wo er zeigt, wie es geht.
eine Funktion (in main.go
)
package main
import (
"fmt"
"os"
)
func Crasher() {
fmt.Println("Going down in flames!")
os.Exit(1)
}
hier Bedenkt man, wie man es (durch main_test.go
) prüfen würde:
package main
import (
"os"
"os/exec"
"testing"
)
func TestCrasher(t *testing.T) {
if os.Getenv("BE_CRASHER") == "1" {
Crasher()
return
}
cmd := exec.Command(os.Args[0], "-test.run=TestCrasher")
cmd.Env = append(os.Environ(), "BE_CRASHER=1")
err := cmd.Run()
if e, ok := err.(*exec.ExitError); ok && !e.Success() {
return
}
t.Fatalf("process ran with err %v, want exit status 1", err)
}
der Code Was tut, ist go test
wieder in einem separaten Prozess aufrufen durch exec.Command
, Begrenzung der Ausführung auf den TestCrasher
Test (über den -test.run=TestCrasher
Schalter). Es gibt auch ein Flag über eine Umgebungsvariable (BE_CRASHER=1
) weiter, die der zweite Aufruf überprüft und, falls gesetzt, das zu testende System aufruft, um unmittelbar danach zurückzukehren, um zu verhindern, dass es in eine Endlosschleife läuft. Daher werden wir in unsere ursprüngliche Call-Site zurückversetzt und können nun den tatsächlichen Exit-Code validieren.
Quelle: Slide 23 der Präsentation von Andrew. Die zweite Folie enthält auch einen Link zu der presentation's video. Er spricht über subprocess Tests bei 47:09
Natürlich ist das keine direkte Antwort auf die Frage, und deshalb schreibe ich es nicht als eine, aber generell: Vermeiden Sie es, Code wie diesen zu schreiben. Wenn du am Ende der Welt nur "Exit" ("main"), [wie dieses Muster] (http://stackoverflow.com/a/18969976/455009) verlässt, dann wirst du nicht daran festhalten, solche zu schreiben schmerzhafte Tests als die (gut) akzeptierte Lösung hier.Ich erkenne voll und ganz an, dass Sie vielleicht den Code von jemand anderem getestet haben, den Sie nicht einfach umgestalten könnten, aber ich hoffe nur, dass der Rat für zukünftige Leser hilfreich ist ... – ches
Wenn Sie diesem Muster folgen und Gomega verwenden, hat es [ziemlich cool 'Gexec'-Paket] (http://onsi.github.io/gomega/#gexec-testing-external-processes), das zum Testen der Ergebnisse von ausführbaren Dateien in einer Black-Box-Art geeignet ist. – ches