Golangで標準入力を使用する関数のテスト

Golang
この記事は約3分で読めます。

Golangの関数内で標準入力の値を受け取る関数に単体テストを行う方法をまとめました。

fmt.Scanで標準入力の値を受け取る関数

fmt.Scanを使用して標準入力から値を受け取る関数は、そのままだと単体テストができません。
下記のinputStdin関数は、関数内で標準入力の内容を受け取り
標準入力の内容をそのまま返す関数です。

inputStdinに単体テストを行うとエラーになります。

 

fmt.Scanの確認

fmt.Scanのコードを確認してみると、os.Stdinを第一引数に渡してFscanを呼び出しています。

 

Fscanのコードを確認してみると、第一引数にio.Readerインターフェースの要件を満たす
型を渡すことができます。
引数rのio.Readerにos.Stdin以外の引数を渡すとテストできそうです。

 

fmt.Fscanに書き換えて単体テスト

fmt.Scanだとos.Stdinから値を読み込んでしまうため、代わりにfmt.Fscanを使用し
任意のio.Readerから値を取得できるようにします。

 

引数にio.Readerインターフェースの要件を満たすものを渡します。

引数のinがnilのときはos.Stdinを入力に使用します。

fmt.Scanの代わりにfmt.Fscanを使用し、第一引数にinを渡します。
第二引数に値を書き込みたい変数を渡します。

 

inputStdin2に単体テストを行ってみます。

 

bytes.NewBufferStringを利用してBuffer構造体を作成します。
Buffer構造体はio.Readerのインターフェース要件を満たしているため、inputStdin2の引数に渡すことができます。

テストを行うとokと表示されます。

参考URL

fmtで学ぶ標準入力・出力|Goから学ぶI/O
How to write tests against user input in Go
How would I test against user input from fmt.Scan/Scanf/Scanln?For example how could I test that the function input will accept "4 5\n" and "1 2 3 4\n" from STD...

コメント