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

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

Susan Sarandon
Susan Sarandonoriginal
2024-11-12 17:08:02738parcourir

How to Test `os.Exit` Scenarios in Go Without Disrupting the Test Suite?

Scénarios de sortie des tests unitaires dans Go

Couvrir divers scénarios de test est crucial pour un développement logiciel robuste. Dans Go, tester les fonctions qui appellent os.Exit présente un défi unique. Comment pouvons-nous tester des scénarios de sortie sans interférer avec l'ensemble de la suite de tests ?

Considérons la fonction suivante, vouée à l'échec :

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

Pour tester efficacement que l'invocation de cette fonction déclenche une sortie, vous allez devez utiliser une stratégie qui confine l'appel os.Exit dans le test et l'empêche d'affecter d'autres tests.

Test os.Exit

Andrew Gerrand, membre principal de l'équipe Go, propose une approche ingénieuse de ce problème dans sa présentation. Implémentons cette solution :

main.go (Programme avec fonction à tester)

package main

import (
    "fmt"
    "os"
)

func Crasher() {
    fmt.Println("Going down in flames!")
    os.Exit(1)
}

main_test.go (Test pour Crasher fonction)

package main

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

func TestCrasher(t *testing.T) {
    // Check if "BE_CRASHER" environment variable is set.
    if os.Getenv("BE_CRASHER") == "1" {
        Crasher()
        return
    }

    // Invoke the test again with "BE_CRASHER=1" to trigger the Crasher call.
    cmd := exec.Command(os.Args[0], "-test.run=TestCrasher")
    cmd.Env = append(os.Environ(), "BE_CRASHER=1")
    err := cmd.Run()

    // Validate exit code.
    if e, ok := err.(*exec.ExitError); ok && !e.Success() {
        return
    }
    t.Fatalf("process ran with err %v, want exit status 1", err)
}

Exécution :

Cette solution fonctionne en :

  • Invoquer à nouveau go test dans un processus distinct via exec.Command, limitant l'exécution au test TestCrasher.
  • Passer un flag via une variable d'environnement (BE_CRASHER=1) pour contrôler le comportement de la deuxième invocation.
  • Vérifier l'indicateur et, s'il est défini, appeler Crasher et quitter immédiatement.
  • Valider le code de sortie pour s'assurer que le test réussi comme prévu.

Grâce à cette approche, vous pouvez tester en toute confiance des scénarios de sortie dans Go sans perturber le reste de votre test suite.

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