Heim >Backend-Entwicklung >Golang >Wie teste ich Gos „Flag'-Paketargument-Parsing in Unit-Tests ordnungsgemäß?

Wie teste ich Gos „Flag'-Paketargument-Parsing in Unit-Tests ordnungsgemäß?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-18 10:26:11402Durchsuche

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

So testen Sie die Argumentanalyse in Go

Betrachten Sie den folgenden Go-Code, der Befehlszeilenargumente mithilfe des Flag-Pakets analysiert:

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
}

Um diese Funktion zu testen, können wir wie gezeigt ein Argument an den kompilierten Code übergeben unten:

./args -user=bla

Dies sollte zu der Ausgabe führen:

Your username is "bla"

Wenn wir jedoch versuchen, dieses Verhalten mit dem folgenden Test zu testen:

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)
    }
}

Wir erhalten eine Fehlermeldung:

FAIL
coverage: 87.5% of statements
FAIL    tool    0.008s

Der Grund für diesen Fehler ist, dass durch einfaches Festlegen von os.Args auf ein neues Slice das Argument nicht an übergeben wird Funktion. Um dieses Problem zu lösen, müssen wir sicherstellen, dass der allererste Wert in os.Args eine (Pfad zur) ausführbare Datei selbst ist, wie in diesem überarbeiteten Test gezeigt:

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)
    }
}

Indem wir die Wiederherstellung von os.Args verschieben In seinen ursprünglichen Zustand können wir sicherstellen, dass der Test andere Tests nicht beeinträchtigt, die möglicherweise die tatsächlichen Argumente untersuchen, die beim Aufrufen des Go-Tests übergeben wurden.

Das obige ist der detaillierte Inhalt vonWie teste ich Gos „Flag'-Paketargument-Parsing in Unit-Tests ordnungsgemäß?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn