Maison  >  Article  >  développement back-end  >  Pourquoi les tests échouent-ils lors de l'exécution sur plusieurs packages dans Go malgré l'utilisation de « -parallel 1 » ?

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

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-04 05:53:29620parcourir

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>

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>

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>

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>

Alias ​​de fonction (gotest) :

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

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!

Déclaration:
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