同僚のコードをレビューしていると、たまたま複雑なロジックを使っている箇所を修正していて、付随するテストもけっこう複雑だった。APIレイヤのテストなので、JSONのスタブを書いてその通りに帰ってくることを確認する、みたいな作業を何度もやらなければならない。
「JSON色付け係」と(半ば自虐を込めて)SNS上で揶揄されるように、Webアプリケーションのメインとなるコードは定型的な処理が大勢を占めるのであるが、そんな中にも時折複雑なロジックや処理が登場する。プログラミング言語が高度な抽象化機能を備えていれば、複雑な問題をより操作しやすい形に定式化することができるし、実際に自分たちのコードでもそれは行われている。
しかし、最も多様で(だからこそ抽象的な記述を要求する)柔軟さも求められる場面は、実はテストコードなのではないか。コーナーケースを埋めなければならなかったり、考えうる全ての値について考えなければならなかったり、2つのデータ構造を合体させなければならなかったり、内部的に時間を歪めたり、オブジェクトのプロパティを部分的にマッチングさせたり、宣言的な記述が必要になったり。
テストコードは脇にやられがちだ。プログラミング言語の高度な機能の使いどころを想像するとき、たいていメインのロジックのことを想像している自分に気付いた。 言語の高度な抽象化機能が最も活きる主戦場は、テストコードかもしれないと思ったのだ。実際、Scalacheckというプロパティベースドテストを行うためのフレームワークは、Scalaの関数型パワーを最大限発揮するように設計され、ありとあらゆるテストデータを自動生成できるようになっている。
プロダクトが大きくなればなるほど、テストの重要性は増していく。現代的なWeb開発においてテストはほぼ必須だ。メイインコードはおカネを産むという意味で重要なだけであって、むしろプロダクトの本体といえるものはテストかもしれない。であれば、動くメンテナブルなテストを高速に書ける必要がある。テストがメンテナブルであるには、強力な記述力が必要になってくる。