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 » ?
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) :
Option 2 (basée sur 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!