Beim Arbeiten mit mehreren Paketen, die in einem Unterverzeichnis im Verzeichnis src/ gespeichert sind, werden Tests für jedes Paket einzeln ausgeführt Die Verwendung von go test ist in der Regel erfolgreich. Beim Versuch, alle Tests gemeinsam mit go test ./... auszuführen, treten jedoch Probleme auf.
Die Tests werden zwar ausgeführt, scheitern aber letztendlich aufgrund von Konflikten zwischen den Tests, wenn sie mit lokalen Datenbankservern ausgeführt werden. Trotz der Einstellung von -parallel 1 zur Verhinderung von Datenbankkonflikten schlagen die Tests immer noch fehl. Dies deutet auf ein Problem mit der Testsequenzierung hin.
Jede Testdatei enthält zwei globale Variablen:
<code class="go">var session *mgo.Session var db *mgo.Database</code>
Zusätzlich werden die folgenden Setup- und Teardown-Funktionen verwendet:
<code class="go">func setUp() { s, err := cfg.GetDBSession() if err != nil { panic(err) } session = s db = cfg.GetDB(session) db.DropDatabase() } func tearDown() { db.DropDatabase() session.Close() }</code>
Jeder Test beginnt mit setUp() und endet mit TearDown(). cfg ist wie folgt definiert:
<code class="go">package cfg import ( "labix.org/v2/mgo" ) func GetDBSession() (*mgo.Session, error) { session, err := mgo.Dial("localhost") return session, err } func GetDB(session *mgo.Session) *mgo.Database { return session.DB("test_db") }</code>
Beim Ändern von cfg zur Verwendung einer Zufallsdatenbank wurden die Tests erfolgreich bestanden. Diese Beobachtung impliziert, dass Tests von mehreren Paketen einigermaßen gleichzeitig ausgeführt werden.
Mögliche Lösung:
Option 1 (Undokumentiert):
Option 2 (Shell-basiert):
Bash-Befehl:
<code class="bash">find . -name '*.go' -printf '%h\n' | sort -u | xargs -n1 -P1 go test</code>
Funktionsalias (gotest):
<code class="bash">function gotest(){ find -name '*.go' -printf '%h\n' | sort -u | xargs -n1 -P1 go test; }</code>
Durch den Aufruf von gotest. können alle Tests im aktuellen Verzeichnis nacheinander ausgeführt werden.
Das obige ist der detaillierte Inhalt vonWarum schlagen Tests fehl, wenn sie in Go über mehrere Pakete hinweg ausgeführt werden, obwohl „-parallel 1' verwendet wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!