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
Freigeben: 2024-12-18 10:26:11
Original
400 Leute haben es durchsucht

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
}
Nach dem Login kopieren

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

./args -user=bla
Nach dem Login kopieren

Dies sollte zu der Ausgabe führen:

Your username is "bla"
Nach dem Login kopieren

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)
    }
}
Nach dem Login kopieren

Wir erhalten eine Fehlermeldung:

FAIL
coverage: 87.5% of statements
FAIL    tool    0.008s
Nach dem Login kopieren

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)
    }
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage