Maison  >  Article  >  développement back-end  >  Comment exécuter des tests simultanés sur plusieurs packages dans Go sans conflit de base de données ?

Comment exécuter des tests simultanés sur plusieurs packages dans Go sans conflit de base de données ?

DDD
DDDoriginal
2024-11-04 00:03:30664parcourir

How to Run Concurrent Tests Across Multiple Packages in Go Without Database Contention?

Go : résoudre la concurrence des tests sur plusieurs packages

Exécuter des tests pour plusieurs packages dans un sous-répertoire à l'aide de go test peut s'avérer difficile lorsque les tests reposent sur des variables globales et des serveurs de base de données locaux . Pendant que go test ./... exécute les tests, il échoue en raison d'un conflit potentiel dans la base de données.

Comprendre le problème

Le problème se pose car go test . /... exécute des tests pour différents packages en parallèle. Lorsque chaque fichier de test contient des variables globales avec des pointeurs de base de données et que les tests reposent sur des opérations de base de données, ce parallélisme peut entraîner des échecs de test causés par un conflit de données.

Corrections potentielles

1. Exécution de tests en série

Pour forcer des tests séquentiels sur tous les packages, envisagez d'utiliser l'indicateur non documenté -p 1 lors de l'exécution de go test. Cet indicateur force tous les packages à être construits et testés séquentiellement.

<code class="bash">go test -p 1 ./...</code>

2. Utilisation d'un script Shell

Si -p 1 ne convient pas, envisagez d'utiliser un script shell qui émule le comportement go test ./... mais force des tests séquentiels. Ceci peut être réalisé en répertoriant les sous-répertoires avec les fichiers *.go, en supprimant les doublons et en exécutant le test go sur chaque sous-répertoire un par un.

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

3. Tests prenant en compte les bases de données

Une autre approche consiste à modifier le code de test pour qu'il soit plus sensible à la concurrence. Cela peut impliquer l'utilisation de bases de données au niveau du package et le report de l'initialisation et du démontage de la base de données au début et à la fin de chaque test, respectivement. Il est crucial de garantir que les opérations de la base de données sont synchrones et que chaque test dispose de son propre ensemble de ressources de base de données.

Exemple :

Vous trouverez ci-dessous un exemple de la manière de garantir que la base de données isolement dans chaque test :

<code class="go">import (
    "database/sql"
    "testing"
)

type DBWrapper struct {
    *sql.DB
}

func (db DBWrapper) TearDown(t *testing.T) {
    if err := db.Close(); err != nil {
        t.Errorf("Failed to close database: %v", err)
    }
}

func TestDatabase(t *testing.T) {
    defer DBWrapper{sql.Open(...)}.TearDown(t)

    // Conduct test operations using the isolated DBWrapper
}</code>

En utilisant ces techniques, il est possible d'exécuter des tests pour plusieurs packages impliquant des opérations de base de données sans rencontrer d'échecs liés aux conflits.

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