Skip to content

Comment exécuter des tests de golang de manière séquentielle ?

Solution:

Vous ne pouvez pas / ne devez pas vous fier à l’ordre d’exécution des tests. L’ordre dans lequel les tests sont exécutés n’est pas défini, et avec l’utilisation des indicateurs de test, il est possible d’exclure les tests de l’exécution, vous n’avez donc aucune garantie qu’ils s’exécuteront.

Par exemple, la commande suivante n’exécutera que les tests dont le nom contient un 'W' lettre:

go test -run W

Notez également que si certaines fonctions de test se déclarent éligibles pour une exécution parallèle à l’aide de la T.Parallel() méthode, l’outil go réorganisera les tests pour exécuter d’abord des tests non parallèles, puis exécutera des tests parallèles en parallèle dans certaines circonstances (contrôlés par des indicateurs de test comme -p). Vous pouvez en voir des exemples dans cette réponse : les tests sont-ils exécutés en parallèle dans Go ou un par un ?

Les tests doivent être indépendant de chacun d’eux. Si une fonction de test a des prérequis, cela ne peut pas être fait/implémenté dans une autre fonction de test.

Options pour effectuer des tâches supplémentaires avant l’exécution d’une fonction de test :

  • Vous pouvez le mettre dans la fonction de test elle-même
  • Vous pouvez le mettre dans un paquet init() fonction, dans le _test.go fichier lui-même. Cela s’exécutera une fois avant le début de l’exécution des fonctions de test.
  • Vous pouvez choisir de mettre en œuvre un TestMain() fonction qui sera appelée en premier et dans laquelle vous pouvez effectuer une configuration supplémentaire avant d’appeler M.Run() pour déclencher l’exécution des fonctions de test.
  • Vous pouvez mélanger les options ci-dessus.

Dans votre cas en paquet init() ou TestMain() vous devez vérifier si votre base de données est initialisée (des enregistrements de test sont insérés), et sinon, insérez les enregistrements de test.

Notez qu’à partir de Go 1.7, vous pouvez utiliser des sous-tests dans lesquels vous définissez l’ordre d’exécution des sous-tests. Pour plus de détails, voir l’article de blog : Utilisation des sous-tests et des sous-tests, et la documentation du package du testing emballer.

Mis à part les bibliothèques tierces telles que Convey et Ginkgo, avec Plain Golang 1.7, vous pouvez exécuter des tests de manière séquentielle. Vous pouvez lire plus ici

func TestFoo(t *testing.T) {
    // <setup code>
    t.Run("A=1", func(t *testing.T) { ... })
    t.Run("A=2", func(t *testing.T) { ... })
    t.Run("B=1", func(t *testing.T) { ... })
    // <tear-down code>
}

Et vous pouvez les exécuter conditionnellement avec :

go test -run ''      # Run all tests.
go test -run Foo     # Run top-level tests matching "Foo", such as "TestFooBar".
go test -run Foo/A=  # For top-level tests matching "Foo", run subtests matching "A=".
go test -run /A=1    # For all top-level tests, run subtests matching "A=1".

Alors disons que vous avez un user package à partir d’une API REST que vous souhaitez tester. Vous devez tester le gestionnaire de création afin de pouvoir tester le gestionnaire de connexion. Habituellement, je l’aurais sur le user_test.go

type UserTests struct { Test *testing.T}
func TestRunner(t *testing.T) {

    t.Run("A=create", func(t *testing.T) {
        test:= UserTests{Test: t}
        test.TestCreateRegularUser()
        test.TestCreateConfirmedUser()
        test.TestCreateMasterUser()
        test.TestCreateUserTwice()
    })
    t.Run("A=login", func(t *testing.T) {
        test:= UserTests{Test: t}
        test.TestLoginRegularUser()
        test.TestLoginConfirmedUser()
        test.TestLoginMasterUser()
    })

}

Ensuite, je peux ajouter des méthodes au type UserTest qui ne seront pas exécutées par le go test commande dans n’importe quel _test.go déposer

func (t *UserTests) TestCreateRegularUser() {
    registerRegularUser := util.TableTest{
        Method:      "POST",
        Path:        "/iot/users",
        Status:      http.StatusOK,
        Name:        "registerRegularUser",
        Description: "register Regular User has to return 200",
        Body: SerializeUser(RegularUser),
    }
    response := util.SpinSingleTableTests(t.Test, registerRegularUser)
    util.LogIfVerbose(color.BgCyan, "IOT/USERS/TEST", response)
}

Pour ceux qui, comme moi, rencontrent des problèmes à cause de plusieurs tests simultanés exécutés simultanément. J’ai trouvé un moyen de limiter le nombre maximum de tests exécutés en parallèle :

go test -p 1

Avec cela, votre test s’exécutera séquentiellement un par un.

La source


Tags : / /

Articles Similaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.