Go : exécution simultanée de tests pour plusieurs packages : résolution de conflits
Lors du test de plusieurs packages dans un sous-répertoire, l'exécution de tests individuels avec go test réussit . Cependant, les tentatives d'exécution simultanée de tous les tests à l'aide de go test ./... entraînent des échecs. Le problème provient de conflits potentiels lors de l'accès à des ressources communes, telles que des bases de données partagées.
Les variables globales utilisées dans des fichiers de test individuels peuvent créer des conflits si plusieurs tests fonctionnent simultanément sur la même base de données. Pour éviter cela, envisagez d'utiliser l'indicateur -parallel 1. Cela impose l'exécution séquentielle des tests au sein de chaque package.
Malgré l'utilisation de -parallel 1, les tests peuvent toujours échouer en raison de conflits. Cela suggère que les tests de différents packages s'exécutent simultanément. Pour éliminer toute possibilité de parallélisme entre les packages, une solution de contournement consiste à exécuter manuellement les tests à l'aide d'un script bash ou d'un alias. La séquence de commandes suivante permet d'y parvenir :
find . -name '*.go' -printf '%h\n' | sort -u | xargs -n1 -P1 go test
Cette commande répertorie les sous-répertoires uniques contenant des fichiers *.go et exécute le test go sur chaque sous-répertoire de manière séquentielle.
Comme alternative, le script shell suivant ou l'alias peut être utilisé :
function gotest(){ find -name '*.go' -printf '%h\n' | sort -u | xargs -n1 -P1 go test; }
En exécutant gotest ., tous les tests du répertoire courant peuvent être exécutés séquentiellement.
Bien que ce ne soit pas aussi simple que go test ./..., ceci Cette solution de contournement garantit que les tests sont exécutés de manière séquentielle sur tous les packages, résolvant ainsi tout problème de conflit résultant de l'exécution de tests en parallèle.
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!