Heim >Backend-Entwicklung >Golang >Wie kann man die Argumentübergabe in Golang-Funktionen effektiv testen?

Wie kann man die Argumentübergabe in Golang-Funktionen effektiv testen?

Susan Sarandon
Susan SarandonOriginal
2024-12-08 17:52:10405Durchsuche

How to Effectively Test Argument Passing in Golang Functions?

Testen der Übergabe von Argumenten in Golang

In Golang ist die Übergabe von Argumenten an eine Funktion eine gängige Methode zur Bereitstellung von Eingaben. Das Testen der Korrektheit der Argumentübergabe ist entscheidend, um die Zuverlässigkeit Ihres Codes sicherzustellen.

Die Herausforderung

Bedenken Sie den folgenden Codeausschnitt:

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
}

Wenn das Argument -user=bla an dieses Programm übergeben wird, wird korrekterweise „Ihr Benutzername ist ‚bla‘“ ausgegeben. Die Herausforderung besteht darin, einen Test zu erstellen, der dieses Verhalten überprüft, ohne den Code jedes Mal manuell erstellen und ausführen zu müssen.

Der Versuch

Man könnte os.Args verwenden um das Argument in einem Test bereitzustellen:

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

Bei der Ausführung dieses Tests jedoch das Ergebnis ist:

Your username is "root".
Your username is "root".
--- FAIL: TestArgs (0.00s)
    args_test.go:15: Test failed, expected: 'bla', got:  'root'
FAIL
coverage: 87.5% of statements
FAIL    tool    0.008s

Die Lösung

Das Problem ist, dass os.Args eine globale Variable ist, sodass der Anfangswert von ["args"] durch überschrieben wird den Test und wirkt sich auf andere Teile des Programms aus. Um dieses Problem zu beheben, können wir den ursprünglichen Wert beibehalten und ihn nach dem Test wiederherstellen:

oldArgs := os.Args
defer func() { os.Args = oldArgs }()
os.Args = []string{"cmd", "-user=bla"}

// ...

Das obige ist der detaillierte Inhalt vonWie kann man die Argumentübergabe in Golang-Funktionen effektiv testen?. 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