Heim  >  Artikel  >  Backend-Entwicklung  >  So testen Sie verschachtelte Eingaben in Go

So testen Sie verschachtelte Eingaben in Go

王林
王林nach vorne
2024-02-14 12:00:11988Durchsuche

如何在 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!

Frageninhalt

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:

  • Wird zuerst verwendet, um grundlegende Informationen wie den Benutzernamen zu erhalten
  • Die zweite wird verwendet, um zusätzliche Informationen zu erhalten, die von der ersten Eingabe abhängen
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

Umgehungslösung

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 nameage ,也许我们可以假设一个具体类型,例如 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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen