Heim >Backend-Entwicklung >Golang >Warum schlagen Tests fehl, wenn sie in Go über mehrere Pakete hinweg ausgeführt werden, obwohl „-parallel 1' verwendet wird?

Warum schlagen Tests fehl, wenn sie in Go über mehrere Pakete hinweg ausgeführt werden, obwohl „-parallel 1' verwendet wird?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-04 05:53:29733Durchsuche

Why Do Tests Fail When Running Across Multiple Packages in Go Despite Using `-parallel 1`?

Parallelitätsprobleme treten auf, wenn Tests über mehrere Pakete hinweg in Go ausgeführt werden

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):

  • Verwenden Sie die undokumentierte Flagge go test -p 1, die alle Pakete nacheinander erstellt und testet.

Option 2 (Shell-basiert):

  • Emulieren Sie die Funktionalität von go test ./... und erzwingen Sie gleichzeitig sequentielle Tests mithilfe einer Shell.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn