Maison >développement back-end >Golang >Comment tester correctement l'analyse des arguments du package « flag » de Go dans les tests unitaires ?

Comment tester correctement l'analyse des arguments du package « flag » de Go dans les tests unitaires ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-18 10:26:11407parcourir

How to Properly Test Go's `flag` Package Argument Parsing in Unit Tests?

Comment tester l'analyse des arguments dans Go

Considérez le code Go suivant, qui analyse les arguments de ligne de commande à l'aide du package flag :

package main

import (
    "flag"
    "fmt"
)

func main() {
    passArguments()
}

func passArguments() string {
    username := flag.String("user", "root", "Username for this server")
    flag.Parse()
    fmt.Printf("Your username is %q.", *username)

    usernameToString := *username
    return usernameToString
}

Pour tester cette fonction, nous pouvons passer un argument au code compilé, comme indiqué ci-dessous :

./args -user=bla

Cela devrait donner le résultat :

Your username is "bla"

Cependant, si nous essayons de tester ce comportement avec le test suivant :

package main

import (
    "os"
    "testing"
)

func TestArgs(t *testing.T) {
    expected := "bla"
    os.Args = []string{"-user=bla"}

    actual := passArguments()

    if actual != expected {
        t.Errorf("Test failed, expected: '%s', got:  '%s'", expected, actual)
    }
}

Nous recevons une erreur :

FAIL
coverage: 87.5% of statements
FAIL    tool    0.008s

La raison de cet échec est que le simple fait de définir os.Args sur une nouvelle tranche ne transmet pas l'argument à la fonction. Pour résoudre ce problème, nous devons nous assurer que la toute première valeur de os.Args est un (chemin vers) l'exécutable lui-même, comme le démontre ce test révisé :

func TestArgs(t *testing.T) {
    expected := "bla"
    oldArgs := os.Args
    defer func() { os.Args = oldArgs }()
    os.Args = []string{"cmd", "-user=bla"}

    actual := passArguments()

    if actual != expected {
        t.Errorf("Test failed, expected: '%s', got:  '%s'", expected, actual)
    }
}

En différant la restauration de os.Args à son état d'origine, nous pouvons garantir que le test n'interfère pas avec d'autres tests susceptibles d'examiner les vrais arguments transmis lors de l'évocation de go test.

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