3 votes

Go test terminal output

Les tutoriels de test Go que j'ai consultés utilisent la valeur de retour pour le test.

J'aimerais écrire un test qui vérifie la sortie du terminal.

Voici un exemple de ce que je souhaite réaliser :

main.go

package main

import (
    "fmt"
    "os"
    "strings"
)

func main() {
    arguments := os.Args   

    fmt.Println(strings.ToUpper(arguments[1]))
}

Le test avec lequel j'ai joué

main_test.go

package main

import (
    "log"
    "os/exec"
    "testing"
)

type checkResult struct {
    inp      string
    expected string
}

var testCases = []checkResult{
    {"Go <3", "GO <3"},
}

func TestMain(t *testing.T) {
    for _, test := range testCases {
        output, err := exec.Command("go run main.go ", test.inp).Output()
        if err != nil {
            log.Fatal(err)
        }
        if string(output) != (test.expected) {
            t.Fatal("Expected result is wrong")
        }
    }
}

1voto

Tomáš Mencner Points 11

Si vous modifiez légèrement la conception de votre CLI, il sera plus facile à tester. Créez une variable globale de type io.Writter et utiliser fmt.Fprintf pour écrire votre sortie dans os.Stdout .

main.go

package main

import (
    "fmt"
    "io"
    "os"
    "strings"
)

var out io.Writer = os.Stdout

func main() {
    arguments := os.Args

    fmt.Fprintf(out, "%s\n", strings.ToUpper(arguments[1]))
}

Désormais, il n'y a plus de problème pour définir la variable out pour rediriger la sortie et os.Args aux arguments de la CLI dans le scénario de test.

main_test.go

package main

import (
    "bytes"
    "os"
    "testing"
)

func TestOutput(t *testing.T) {
    testData := []struct {
        Args   []string
        Output string
    }{
        {
            Args:   []string{"./macli", "hello"},
            Output: "HELLO\n",
        },
        {
            Args:   []string{"", "Go <3"},
            Output: "GO <3\n",
        },
    }
    for _, test := range testData {
        // Init test
        os.Args = test.Args
        out = bytes.NewBuffer(nil)
        // Run test
        main()
        // Evaluate output
        if actual := out.(*bytes.Buffer).String(); actual != test.Output {
            t.Errorf("expected '%s', but got '%s'", test.Output, actual)
        }
    }
}

Pour une description plus détaillée, voir artículo

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X