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
Freigeben: 2024-11-04 05:53:29
Original
720 Leute haben es durchsucht

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

Funktionsalias (gotest):

<code class="bash">function gotest(){   find  -name '*.go' -printf '%h\n' | sort -u | xargs -n1 -P1 go test; }</code>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage