Maison  >  Article  >  développement back-end  >  Comment tester les applications Go qui lisent depuis Stdin ?

Comment tester les applications Go qui lisent depuis Stdin ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-26 13:27:30744parcourir

How to Test Go Applications That Read from Stdin?

Test des applications Go avec entrée Stdin

Dans Go, tester des applications qui lisent à partir de stdin peut être difficile. Considérons une application simple qui fait écho à l'entrée stdin sur stdout. Bien que cela puisse paraître simple, l'écriture d'un scénario de test qui vérifie le résultat peut poser des difficultés.

Tentative échouée

Une première approche consisterait à simuler stdin et stdout à l'aide de tuyaux. et écrivez manuellement dans le tube stdin. Cependant, cela peut entraîner des conditions de concurrence critique et des échecs inattendus.

Solution : extraire la logique et tester la fonction indépendante

Au lieu d'effectuer toutes les opérations dans la fonction principale à l'aide de stdin et stdout, créez une fonction distincte qui accepte io.Reader et io.Writer comme paramètres. Cette approche permet à la fonction principale d'appeler la fonction tandis que la fonction de test la teste directement.

Code refactorisé

<code class="go">package main

import (
    "bufio"
    "fmt"
    "io"
)

// Echo takes an io.Reader and an io.Writer and echoes input to output.
func Echo(r io.Reader, w io.Writer) {
    reader := bufio.NewReader(r)
    for {
        fmt.Print("> ")
        bytes, _, _ := reader.ReadLine()
        if bytes == nil {
            break
        }
        fmt.Fprintln(w, string(bytes))
    }
}

func main() {
    Echo(os.Stdin, os.Stdout)
}</code>

Cas de test mis à jour

<code class="go">package main

import (
    "bufio"
    "bytes"
    "io"
    "os"
    "testing"
)

func TestEcho(t *testing.T) {
    input := "abc\n"
    reader := bytes.NewBufferString(input)
    writer := &bytes.Buffer{}

    Echo(reader, writer)

    actual := writer.String()
    if actual != input {
        t.Errorf("Wanted: %v, Got: %v", input, actual)
    }
}</code>

Ce scénario de test simule la fonction principale en appelant directement la fonction Echo avec un tampon pour l'entrée stdin et un tampon pour capturer la sortie. La sortie capturée est ensuite comparée à l'entrée attendue, garantissant que la fonction fait correctement écho à l'entrée.

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:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn