2016-05-16 9 views
2

stdinから行を読み込んで単純にstdoutに返す単純なアプリケーションがあるとします。例:stdinに書き込むGoテストを書くにはどうすればよいですか?

package main 

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

func main() { 
    reader := bufio.NewReader(os.Stdin) 
    for { 
     fmt.Print("> ") 
     bytes, _, err := reader.ReadLine() 
     if err == io.EOF { 
      os.Exit(0) 
     } 
     fmt.Println(string(bytes)) 
    } 
} 

stdinに書き込んだ出力を入力と比較するテストケースを作成したいとします。例えば:私は明らかにここに間違った何かをやっている

=== RUN TestInput 
--- FAIL: TestInput (3.32s) 
    echo_test.go:25: Wanted: abc 
     , Got: --- FAIL: TestInput (3.32s) 
FAIL 
exit status 1 

package main 

import (
    "bufio" 
    "io" 
    "os" 
    "os/exec" 
    "testing" 
) 

func TestInput(t *testing.T) { 
    subproc := exec.Command(os.Args[0]) 
    stdin, _ := subproc.StdinPipe() 
    stdout, _ := subproc.StdoutPipe() 
    defer stdin.Close() 

    input := "abc\n" 

    subproc.Start() 
    io.WriteString(stdin, input) 
    reader := bufio.NewReader(stdout) 
    bytes, _, _ := reader.ReadLine() 
    output := string(bytes) 
    if input != output { 
     t.Errorf("Wanted: %v, Got: %v", input, output) 
    } 
    subproc.Wait() 
} 

go test -vを実行すると、次の私に与えます。このタイプのコードをテストするにはどうすればよいですか?代わりにstdinstdoutmainですべてを行うことの

答えて

2

ここでは、stdinに書き込み、stdoutから読み込む例を示します。出力には最初に ">"が含まれているため、動作しないことに注意してください。それでも、ニーズに合わせて変更することができます。

func TestInput(t *testing.T) { 
    subproc := exec.Command("yourCmd") 
    input := "abc\n" 
    subproc.Stdin = strings.NewReader(input) 
    output, _ := subproc.Output() 

    if input != string(output) { 
     t.Errorf("Wanted: %v, Got: %v", input, string(output)) 
    } 
    subproc.Wait() 
} 
+0

出力から ">"を削除し、TestInput関数を使用しました。 --- FAILを === RUN TestInput :私はこのような何かを見て約100繰り返し失敗のシリーズを取得TestInput(5.17s) \t echo_test.go:36:募集:ABC \t \t、ガット: --- FAIL:TestInput(5.15s) \t \t \t echo_test.go:36:募集:ABC \t \t \t \t、ガット:--- FAIL:TestInput(5.13s) \t \t \t \t \t echo_test.go :36:募集:abc ...など。 –

+0

">"を削除するとうまく動作します。実行するための適切なコマンドを提供しましたか? –

+0

コマンドをos.Args [0]に変更しました。 –

3

、あなたはio.Readerやパラメータなどio.Writerを取り、あなたはそれがやりたいものは何でもない関数を定義することができます。 mainはその関数を呼び出すことができ、テスト関数はその関数を直接テストできます。

+0

はい、私はこれについて考えており、これは私がしなければならないことを期待しています。私はちょうどメインのstdin/stdoutに直接アクセスする方法があるかどうか疑問に思った。 –

関連する問題