Software engineering from east direction

六本木一丁目で働くソフトウェアエンジニアのブログ

GoLandでgoldenファイルを用いたユニットテストを書く #golang

TL;DR

  • GoLandでgoldenファイルを任意のファイルタイプで認識できるようにする
  • それによって、goldenファイル作成時にGoLandの補完能力を失わないようにする

goldenファイルとは

Go言語でのユニットテスト作成時、JSONHTMLといった用に別ファイルをテストの引数や期待値に必要とするケースがあります。これに対して、.golden拡張子をつけたファイルとして別定義する手段があります。これは、Goの標準ライブラリのテストコード内でも使用されている方法です。

たとえば、TestDiff()というテスト関数内で次のようにJSON文字列を必要するケースを想像してください。

func TestDiff(t *testing.T) {

    want := `
{
  "string": "A",
  "integer": 1
}
`
    // 以降のテストコード
}

そのままテスト関数内に定義してしまうとそのテスト関数の見通しが悪くなってしまうかもしれません。これに対して、goldenファイルを使用する場合は、testdata ディレクトリ配下に.golden拡張子をつけたファイルを配置して使用します。

testdataディレクトリを配置すると、そのディレクトリはパッケージとしてみなされないため、テスト時のみに必要なファイルとしてプロジェクトに配置することができます。

https://golang.org/cmd/go/#hdr-Test_packages

The go tool will ignore a directory named "testdata", making it available to hold ancillary data needed by the tests.

今回はJSON形式のファイルなので、want.json.goldenという名前でJSONファイルを保存します。

{
  "string": "A",
  "integer": 1
}

このように配置することで先程直接JSON文字列を書いていたテストコードは次のようになります。

func TestDiff(t *testing.T) {

    want := getStringByFile(t, "testdata/want.json.golden")

    // 以降のテストコード
}

func getStringByFile(t *testing.T, path string) string {
    t.Helper()

    bs, err := ioutil.ReadFile(path)
    if err != nil {
        t.Fatalf("ioutil.ReadAll(%s) got unexpected error %#v", path, err)
    }
    return string(bs)
}

GoLandでのgoldenファイルに対する設定をする

goldenファイルを用いたテストはこのような比較的に大きくなりがちなファイル形式の際に重宝しているのですが、golden拡張子だとPlain Textとしてのファイルタイプ認識になることにフラストレーションを感じました。そのため筆者は、goldenファイルの命名とGoLandのFile Typesの設定を合わせることで任意のファイルタイプを認識できるように設定しています。

具体的には、*.json.goldenであれば、JSONファイルとして認識するというような設定をしています。実際に、設定方法を見ていきましょう。

まず、GoLandの設定画面を開きましょう。Macであれば、Command + , というショートカットで開きます。そこで、Editor/File Typesの画面へ遷移します。

f:id:khigashigashi:20190427143822p:plain
Editor > File Typesの設定画面

この画面では、ファイル名に対してどのファイルタイプで認識するか設定できます。*.json.goldenJSONファイルだと認識させたいので、JSONの設定に行きます。

f:id:khigashigashi:20190427145750p:plain
File Types: JSON

この拡張子パターンに、*.json.goldenを追加します。

f:id:khigashigashi:20190427145857p:plain
*.json.goldenを追加

この設定によって、JSON形式の文字列を格納するためのgoldenファイルを認識できるようになりました。その他のファイルタイプについても同様です。

まとめ

goldenファイルを使用することでテストの可読性の向上が見込めますが、エディターの力を借りることでテスト作成コストも下げることができます。GoLandを使用している方はひとつ試してみていただけると幸いです。