Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Masalah semasa menguji gesaan cli secara interaktif, pengimbas tidak menunggu input pengguna

Masalah semasa menguji gesaan cli secara interaktif, pengimbas tidak menunggu input pengguna

WBOY
WBOYke hadapan
2024-02-13 21:18:181114semak imbas

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

editor php Yuzai mendapati semasa menjalankan ujian interaktif, kadangkala masalah akan dihadapi. Salah satu masalah biasa ialah apabila berinteraksi menggunakan antara muka baris arahan (CLI), pengimbas mungkin tidak menunggu input pengguna. Ini bermakna apabila pengguna digesa untuk input, program meneruskan pelaksanaan serta-merta tanpa menunggu respons pengguna. Ini boleh menyebabkan program ralat atau tidak dilaksanakan dengan betul. Penyelesaian kepada masalah ini adalah dengan menggunakan teknik atau kaedah yang sesuai untuk memastikan pengimbas menunggu input pengguna untuk memastikan ujian interaksi lancar.

Kandungan soalan

Saya cuba menulis ujian untuk mengesahkan gesaan cli, mensimulasikan input pengguna sebagai tindak balas kepada beberapa output program.

Bagaimana untuk membuat scanner.scan menunggu penulisan yang lain?

Apa yang saya ada setakat ini:

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

Hasil yang diharapkan ialah: 0123

Hasil sebenar ialah: 0

Saya mencuba versi io.pipe

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

Keputusan: Ralat maut: semua goroutine sedang tidur - kebuntuan!

Penyelesaian

Apabila menggunakan paip, menulis dan membaca adalah serentak. Tanpa bacaan yang sepadan, penulisan tidak dapat diselesaikan. Alihkan tulisan pertama ke goroutine. Dan tutup hujung tulis paip supaya pengimbas berhenti mengimbas.

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

Atas ialah kandungan terperinci Masalah semasa menguji gesaan cli secara interaktif, pengimbas tidak menunggu input pengguna. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam