Heim > Artikel > Backend-Entwicklung > So testen Sie verschachtelte Eingaben in Go
php-Editor Youzi stellt Ihnen vor, wie Sie verschachtelte Eingaben in Go testen. Beim Schreiben von Go-Code stoßen Sie häufig auf Situationen, in denen Sie verschachtelte Eingaben verarbeiten müssen, beispielsweise verschachtelte JSON-Daten oder mehrdimensionale Arrays. Wie diese verschachtelten Eingaben effektiv getestet werden können, ist eine zentrale Frage. Dieser Artikel zeigt Ihnen einige praktische Methoden und Techniken, die Ihnen helfen, verschachtelte Eingaben in Go einfach zu testen und die Korrektheit und Stabilität Ihres Codes sicherzustellen. Unabhängig davon, ob Sie Anfänger oder erfahrener Entwickler sind, werden diese Tipps beim Schreiben und Testen von Go-Code sehr hilfreich sein. Finden wir es gemeinsam heraus!
Ich habe die Funktion, mit os.stdin
Benutzereingaben einzuholen
func (i input) getinput(stdin io.reader) (string, error) { reader := bufio.newreader(stdin) data, err := reader.readstring('\n') if err != nil { return "", fmt.errorf("get input error: %w", err) } return strings.replaceall(data, "\n", ""), nil }
In meinem Programm benötige ich zwei Eingaben:
name,err := getinput(os.stdin) if err != nil { // error handling..... } switch name { case "test": //do something... age, err := getinput(os.stdin) if err != nil { // error handling..... } fmt.println(age) case "another": // here another input }
Ist es möglich, für diese Situation einen Unit-Test zu schreiben? Um eine Benutzereingabe zu testen, habe ich dieses Code-Snippet verwendet und es funktioniert:
var stdin bytes.Buffer stdin.Write([]byte(fmt.Sprintf("%s\n", tt.input))) GetInput(stdin)
Aber es funktioniert nicht mit 2 verschachtelten Eingaben
Vielleicht erwägen Sie die Verwendung einer Funktion, die einen bestimmten Ergebnistyp zurückgibt, und packen Sie sie in ein separates Paket.
Da ich gesehen habe, dass name
和 age
,也许我们可以假设一个具体类型,例如 person
zur Klarstellung erwähnt wurde.
Es ist wichtig zu beachten, dass wir den tatsächlichen Leser als Parameter einschließen möchten, anstatt einen fest codierten Verweis auf os.stdin
zu haben. Dadurch wird die Simulation verschachtelter Eingaben überhaupt erst möglich.
In diesem Fall könnte die Signatur der Methode so aussehen:
func nestedinput(input io.reader) (*person, error)
Der entsprechende Typ kann sein:
type person struct { name string age int }
Wenn Sie nun Ihre Codeschnipsel zu einer kompletten Go-Datei zusammengeführt haben, in einem separaten Verzeichnis mit dem Namen input.go
, könnte das so aussehen:
package input import ( "bufio" "fmt" "io" "strconv" "strings" ) func getinput(reader *bufio.reader) (string, error) { data, err := reader.readstring('\n') if err != nil { return "", fmt.errorf("get input error: %w", err) } return strings.replaceall(data, "\n", ""), nil } type person struct { name string age int } func nestedinput(input io.reader) (*person, error) { reader := bufio.newreader(input) name, err := getinput(reader) if err != nil { return nil, err } switch name { case "q": return nil, nil default: agestr, err := getinput(reader) if err != nil { return nil, err } age, err := strconv.atoi(agestr) if err != nil { return nil, err } return &person{name: name, age: age}, nil } }
q
的输入返回 nil、nil
und kann zum Beenden von Eingaben verwendet werden, beispielsweise wenn die Abfrage in einer Schleife erfolgt.
Einheitentests
Einheitentests
func test_nestedinput(t *testing.t)
Die Datei mit dem Namen input_test.go
sollte nun die Eingabedaten bereitstellen.
Da nestedinput
函数现在需要 io.reader
als Parameter verwendet wird, können wir einfach die erforderliche Eingabe generieren, z. B.
input := strings.newreader("george\n26\n")
Der Test könnte also so aussehen:
package input import ( "strings" "testing" ) func Test_nestedInput(t *testing.T) { input := strings.NewReader("George\n26\n") person, err := NestedInput(input) if err != nil { t.Error("nested input failed") } if person == nil { t.Errorf("expected person, but got nil") return } if person.Name != "George" { t.Errorf("wrong name %s, expected 'George'", person.Name) } if person.Age != 26 { t.Errorf("wrong age %d, expected 26", person.Age) } }
Natürlich kann der Test um weitere Details erweitert werden. Wie Sie sehen, simuliert dies jedoch eine verschachtelte Eingabe.
Das obige ist der detaillierte Inhalt vonSo testen Sie verschachtelte Eingaben in Go. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!