Heim  >  Artikel  >  Backend-Entwicklung  >  Problem beim interaktiven Testen der CLI-Eingabeaufforderung: Der Scanner wartet nicht auf Benutzereingaben

Problem beim interaktiven Testen der CLI-Eingabeaufforderung: Der Scanner wartet nicht auf Benutzereingaben

WBOY
WBOYnach vorne
2024-02-13 21:18:181168Durchsuche

交互测试 cli 提示时出现问题,扫描仪不等待用户输入

php-Redakteur Yuzai stellte fest, dass bei der Durchführung interaktiver Tests manchmal Probleme auftreten. Eines der häufigsten Probleme besteht darin, dass der Scanner bei der Interaktion über die Befehlszeilenschnittstelle (CLI) möglicherweise nicht auf Benutzereingaben wartet. Das heißt, wenn der Benutzer zur Eingabe aufgefordert wird, setzt das Programm die Ausführung sofort fort, ohne auf die Antwort des Benutzers zu warten. Dies kann dazu führen, dass das Programm einen Fehler macht oder nicht korrekt ausgeführt wird. Die Lösung dieses Problems besteht darin, mithilfe geeigneter Techniken oder Methoden sicherzustellen, dass der Scanner auf Benutzereingaben wartet, um einen reibungslosen Interaktionstest sicherzustellen.

Frageninhalt

Ich versuche, einen Test zu schreiben, um eine CLI-Eingabeaufforderung zu validieren und Benutzereingaben als Reaktion auf eine Programmausgabe zu simulieren.

Wie lässt man scanner.scan auf den Rest der Schreibvorgänge warten?

Was ich bisher habe:

    b := &bytes.buffer{}
    fmt.fprint(b, "0")
    go func() {
        time.sleep(1 * time.second)
        for i := 1; i < 4; i++ {
            fmt.fprint(b, i)
            time.sleep(1 * time.second)
        }
    }()

    scanner := bufio.newscanner(b)
    for scanner.scan() {
        log.print(scanner.text())
    }
    if err := scanner.err(); err != nil {
        log.println("problem while scanning:", err)
    }

Das erwartete Ergebnis ist: 0123

Das tatsächliche Ergebnis ist: 0

Ich habe die io.pipe-Version ausprobiert

r, w := io.Pipe()
    fmt.Fprint(w, "0")
    go func() {
        time.Sleep(1 * time.Second)
        for i := 1; i < 4; i++ {
            fmt.Fprint(w, i)
            time.Sleep(1 * time.Second)
        }
    }()

    scanner := bufio.NewScanner(r)
    for scanner.Scan() {
        log.Print(scanner.Text())
    }
    if err := scanner.Err(); err != nil {
        log.Println("problem while scanning:", err)
    }

Ergebnis: Schwerwiegender Fehler: Alle Goroutinen schlafen – Deadlock!

Workaround

Bei der Verwendung von Pipes erfolgen Schreiben und Lesen synchron. Ohne einen passenden Lesevorgang kann der Schreibvorgang nicht abgeschlossen werden. Verschieben Sie den ersten Schreibvorgang in eine Goroutine. Und schließen Sie das Schreibende des Rohrs, damit der Scanner den Scanvorgang stoppt.

    r, w := io.Pipe()
    go func() {
        defer w.Close()

        fmt.Fprint(w, "0")

        time.Sleep(1 * time.Second)
        for i := 1; i < 4; i++ {
            fmt.Fprint(w, i)
            time.Sleep(1 * time.Second)
        }
    }()

    scanner := bufio.NewScanner(r)
    for scanner.Scan() {
        log.Print(scanner.Text())
    }
    if err := scanner.Err(); err != nil {
        log.Println("problem while scanning:", err)
    }

Das obige ist der detaillierte Inhalt vonProblem beim interaktiven Testen der CLI-Eingabeaufforderung: Der Scanner wartet nicht auf Benutzereingaben. 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