いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-464 (iotestパッケージのメモ)(01-TestReader)

関連記事

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のおすすめ書籍


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。