Maison  >  Article  >  développement back-end  >  Problème lors du test interactif de l'invite cli, le scanner n'attend pas la saisie de l'utilisateur

Problème lors du test interactif de l'invite cli, le scanner n'attend pas la saisie de l'utilisateur

WBOY
WBOYavant
2024-02-13 21:18:181168parcourir

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

L'éditeur php Yuzai a découvert que lors de tests interactifs, des problèmes survenaient parfois. L'un des problèmes courants est que lors de l'interaction à l'aide de l'interface de ligne de commande (CLI), le scanner peut ne pas attendre la saisie de l'utilisateur. Cela signifie que lorsque l'utilisateur est invité à entrer une entrée, le programme continue son exécution immédiatement sans attendre la réponse de l'utilisateur. Cela peut entraîner une erreur du programme ou ne pas s'exécuter correctement. La solution à ce problème consiste à utiliser des techniques ou des méthodes appropriées pour garantir que le scanner attend la saisie de l'utilisateur afin de garantir des tests d'interaction fluides.

Contenu de la question

J'essaie d'écrire un test pour valider une invite cli, simulant une entrée utilisateur en réponse à une sortie de programme.

Comment faire attendre scanner.scan la suite des écritures ?

Ce que j'ai jusqu'à présent :

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

Le résultat attendu est : 0123

Le résultat réel est : 0

J'ai essayé la version 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)
    }

Résultat : Erreur fatale : toutes les goroutines dorment - impasse !

Solution de contournement

Lors de l'utilisation de tuyaux, l'écriture et la lecture sont synchrones. Sans lecture correspondante, l'écriture ne peut pas se terminer. Déplacez la première écriture vers une goroutine. Et fermez l’extrémité d’écriture du tuyau pour que le scanner arrête la numérisation.

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer