Maison  >  Article  >  développement back-end  >  Comment tester les scénarios « os.Exit » dans Go sans planter votre suite de tests ?

Comment tester les scénarios « os.Exit » dans Go sans planter votre suite de tests ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-13 12:17:02532parcourir

 How to Test `os.Exit` Scenarios in Go Without Crashing Your Test Suite?

Test des scénarios os.exit dans Go

Dans Go, la fonction os.Exit arrête l'exécution du programme et quitte le système d'exploitation. Mais comment tester des scénarios impliquant os.Exit dans une suite de tests sans affecter les autres tests ?

Considérez le code suivant :

func doomed() {
  os.Exit(1)
}

Pour tester que l'appel voué à l'échec entraîne une sortie, nous Je ne peux pas simplement l'appeler dans le test, car cela mettrait également fin au programme d'exécution du test. Explorons plutôt l'approche démontrée par Andrew Gerrand.

La méthode de Gerrand consiste à exécuter le test dans un processus distinct. Cela nous permet d'encapsuler l'appel os.Exit dans le processus séparé, garantissant qu'il n'a pas d'impact sur le lanceur de test principal.

Voici comment cela fonctionne :

// main_test.go
package main

import (
    "os"
    "os/exec"
    "testing"
)

func TestCrasher(t *testing.T) {
    if os.Getenv("BE_CRASHER") == "1" {
        Crasher()
        return
    }
    cmd := exec.Command(os.Args[0], "-test.run=TestCrasher")
    cmd.Env = append(os.Environ(), "BE_CRASHER=1")
    err := cmd.Run()
    if e, ok := err.(*exec.ExitError); ok && !e.Success() {
        return
    }
    t.Fatalf("process ran with err %v, want exit status 1", err)
}

Ce test invoque go testez à nouveau dans un processus distinct, ciblant uniquement le test TestCrasher. Il définit une variable d'environnement (BE_CRASHER) que le sous-processus vérifie. S'il est défini, le sous-processus appelle Crasher et se termine immédiatement pour éviter une récursion infinie.

Pendant ce temps, le processus de test d'origine peut alors valider le code de sortie du sous-processus, garantissant qu'il se termine comme prévu.

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