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
Libérer: 2024-12-18 10:26:11
original
398 Les gens l'ont consulté

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
}
Copier après la connexion

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

./args -user=bla
Copier après la connexion

Cela devrait donner le résultat :

Your username is "bla"
Copier après la connexion

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)
    }
}
Copier après la connexion

Nous recevons une erreur :

FAIL
coverage: 87.5% of statements
FAIL    tool    0.008s
Copier après la connexion

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)
    }
}
Copier après la connexion

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!

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