GoLandでgoldenファイルを用いたユニットテストを書く #golang
TL;DR
- GoLandでgoldenファイルを任意のファイルタイプで認識できるようにする
- それによって、goldenファイル作成時にGoLandの補完能力を失わないようにする
goldenファイルとは
Go言語でのユニットテスト作成時、JSON
やHTML
といった用に別ファイルをテストの引数や期待値に必要とするケースがあります。これに対して、.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の画面へ遷移します。
この画面では、ファイル名に対してどのファイルタイプで認識するか設定できます。*.json.golden
をJSON
ファイルだと認識させたいので、JSON
の設定に行きます。
この拡張子パターンに、*.json.golden
を追加します。
この設定によって、JSON
形式の文字列を格納するためのgoldenファイルを認識できるようになりました。その他のファイルタイプについても同様です。
まとめ
goldenファイルを使用することでテストの可読性の向上が見込めますが、エディターの力を借りることでテスト作成コストも下げることができます。GoLandを使用している方はひとつ試してみていただけると幸いです。