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

WBOY
Freigeben: 2024-02-13 21:18:18
nach vorne
1172 Leute haben es durchsucht

交互测试 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)
    }
Nach dem Login kopieren

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

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

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!

Quelle:stackoverflow.com
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage