Maison > développement back-end > Golang > le corps du texte

Pourquoi les tests échouent-ils lors de l'exécution sur plusieurs packages dans Go malgré l'utilisation de « -parallel 1 » ?

Mary-Kate Olsen
Libérer: 2024-11-04 05:53:29
original
619 Les gens l'ont consulté

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

Des problèmes de concurrence surviennent lors de l'exécution de tests sur plusieurs packages dans Go

Lorsque vous travaillez avec plusieurs packages stockés dans un sous-répertoire du répertoire src/, exécutez des tests pour chaque package individuellement l'utilisation de go test réussit généralement. Cependant, lorsque vous tentez d'exécuter tous les tests collectivement à l'aide de go test ./..., des problèmes surviennent.

Les tests s'exécutent, mais échouent finalement lorsqu'ils fonctionnent sur des serveurs de base de données locaux en raison de conflits entre les tests. Malgré la définition de -parallel 1 pour éviter les conflits de base de données, les tests échouent toujours. Cela suggère un problème avec le séquençage des tests.

Chaque fichier de test contient deux variables globales :

<code class="go">var session *mgo.Session
var db *mgo.Database</code>
Copier après la connexion

De plus, il utilise les fonctions de configuration et de démontage suivantes :

<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>
Copier après la connexion

Chaque test commence par setUp() et se termine par tearDown(). cfg est défini comme suit :

<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>
Copier après la connexion

Lors de la modification de cfg pour utiliser une base de données aléatoire, les tests ont réussi. Cette observation implique que les tests de plusieurs packages s'exécutent quelque peu simultanément.

Solution possible :

Option 1 (non documentée) :

  • Utilisez le drapeau non documenté go test -p 1, qui construit et teste tous les packages de manière séquentielle.

Option 2 (basée sur Shell) :

  • Émulez la fonctionnalité de go test ./... tout en appliquant des tests séquentiels à l'aide d'un shell.

Commande Bash :

<code class="bash">find . -name '*.go' -printf '%h\n' | sort -u | xargs -n1 -P1 go test</code>
Copier après la connexion

Alias ​​de fonction (gotest) :

<code class="bash">function gotest(){   find  -name '*.go' -printf '%h\n' | sort -u | xargs -n1 -P1 go test; }</code>
Copier après la connexion

En appelant gotest ., tous les tests du répertoire courant peuvent être exécutés séquentiellement.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!