関連記事
GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ
概要
以下、自分用のメモです。忘れないうちにメモメモ。。。
以下の書籍で知ったのですが、testing/iotest
というパッケージの存在を知りました。こんなのあったんですね。
このパッケージの中には、カスタムな io.Reader や io.Writer を作成してテストする際に便利な関数などが用意されています。
今回は、iotest.TestReader
関数について。
iotest.TestReader
関数は、カスタムなio.Readerを作成してテストする際にとても有用です。ちゃんと動くかどうかをテストしてくれます。
サンプル
package testreader import ( "io" "strings" "testing" "testing/iotest" ) type ( // UppercaseReader は、読み込んだ文字を大文字に変換するカスタム io.Reader です。 // ASCIIのみ対応しており、それ以外の文字コードの場合はそのままとなります。 UppercaseReader struct { r io.Reader t *testing.T } ) func (me *UppercaseReader) Read(p []byte) (n int, err error) { if me == nil { return } n, err = me.r.Read(p) me.t.Logf("len(p)==%2d\tn==%2d\terr==%v", len(p), n, err) for i := 0; i < n; i++ { if p[i] >= 'a' && p[i] <= 'z' { p[i] -= 'a' - 'A' } } return } func TestUppercaseReader(t *testing.T) { var ( input = "hello" expected = "HELLO" reader = UppercaseReader{r: strings.NewReader(input), t: t} err error ) // // iotest.TestReader() は、指定された io.Reader の実装が正しく動作するかを // テストしてくれる。カスタムな io.Reader を作成した際の動作テストに利用出来る。 // (バッファである p の値を nil で読んだときの挙動など) // // 第二引数に指定するのは、期待値となる。 // // - https://pkg.go.dev/testing/iotest@go1.22.6#TestReader // err = iotest.TestReader(&reader, []byte(expected)) if err != nil { t.Fatal(err) } }
実行すると以下のようになります。
$ task task: [default] go test -v . === RUN TestUppercaseReader testreader_test.go:23: len(p)== 0 n== 0 err==<nil> testreader_test.go:23: len(p)== 1 n== 1 err==<nil> testreader_test.go:23: len(p)== 2 n== 2 err==<nil> testreader_test.go:23: len(p)== 3 n== 2 err==<nil> testreader_test.go:23: len(p)== 1 n== 0 err==EOF testreader_test.go:23: len(p)==10 n== 0 err==EOF --- PASS: TestUppercaseReader (0.00s) PASS ok github.com/devlights/try-golang/examples/singleapp/iotest/testreader 0.002s
ちゃんと、いろいろな形で呼び出してくれてますね。
参考情報
Goのおすすめ書籍
過去の記事については、以下のページからご参照下さい。
サンプルコードは、以下の場所で公開しています。