Maison > développement back-end > Golang > Comment tester les fonctions qui appellent os.Exit() dans Go ?

Comment tester les fonctions qui appellent os.Exit() dans Go ?

Linda Hamilton
Libérer: 2024-11-18 01:41:02
original
544 Les gens l'ont consulté

How to Test Functions That Call os.Exit() in Go?

Test des scénarios os.Exit dans Go

Lors de l'écriture de tests impliquant l'appel de fonctions qui quittent le programme à l'aide de os.Exit(), il devient nécessaire d’isoler leur impact sur le reste de la suite de tests. Pour relever ce défi, nous pouvons tirer parti de l'approche suivante inspirée d'une présentation d'Andrew Gerrand, un membre principal de l'équipe Go.

Étant donné une fonction qui termine le programme via os.Exit() :

package main

import (
    "fmt"
    "os"
)

func Crasher() {
    fmt.Println("Going down in flames!")
    os.Exit(1)
}
Copier après la connexion

Créez un scénario de test correspondant :

package main

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

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

    // Construct a command to re-run the test binary, limiting its execution to TestCrasher.
    cmd := exec.Command(os.Args[0], "-test.run=TestCrasher")
    // Set additional environment variables.
    cmd.Env = append(os.Environ(), "BE_CRASHER=1")

    // Execute the command.
    err := cmd.Run()
    // Verify the exit status of the command.
    if e, ok := err.(*exec.ExitError); ok && !e.Success() {
        return
    }

    // Report failure if the command ran with an unexpected exit code.
    t.Fatalf("process ran with err %v, want exit status 1", err)
}
Copier après la connexion

Ce scénario de test ré-appelle go test dans un processus séparé, isolant l'exécution de TestCrasher du reste de la suite. Il définit également une variable d'environnement (BE_CRASHER=1) que le processus invoqué vérifie et, si elle est présente, appelle la fonction testée. Ainsi, nous évitons les boucles infinies et veillons à ce que le bon code de sortie soit validé.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal