96-テストは正確に、具体的に
「プログラマが知るべき97のこと」の96個目のエピソードは、ユニットテストに関する話です。
先にも書いたとおり、ユニットテストにおいては、実装コードの「偶然の仕様」への合致を確認するのではなく、コードの動きが本来の要求に合っているかを確認することが大切です。だからと言って、それを言い訳にテストが曖昧なものになるようでは困ります。テストはあくまで正確で厳密なものでなくてはなりません。
このエピソードの著者であり、きのこ本の編者でもあるケブリン・へニー氏のソースコード・ユニットテストに対する思想は、「17-コードに書けないことのみをコメントにする」「77-偶然の仕様ではなく本物の仕様のためのテストを書く」の2つと合わせてプログラマがどのようにプログラムと向き合っていけば良いのかについて大きなヒントを与えてくれます。ソフトウェアは形のないものですから、プログラマがプロとしてそのプログラムに責任を持つ為、我々は最大限の努力をする必要があります。それは、他のエピソードでも書かれていますが、コードが将来に渡ってメンテナンスされる事を意識した設計やコメント、そして適切なユニットテストなのです。プログラマは動くソフトウェアをリリースする事は当たり前であり、いかにそのコードが将来に渡って有益に出来るかについて考えなければならないのです。
「ユニットテストは正確で厳密でなくてはならない」という事は、当たり前のようにも思えます。しかし、その事は非常に難しい事です。だからこそ、様々な手段を使って少しでも正確に厳密に出来るように努力するべきです。例えば、ペアプログラミングやレビューは、自分のコードを他人が見る機会を与えます。なるべく早い段階で問題に気付く方が精神的にもリソース的にも効果がありますので、ペアプログラミングは有効です。また、書き方を少し変えるだけでも、ずっと正確に書くことができますし、ユニットテストを読む人がテストの問題に気付きやすくなります。XUnit Patternにも書いてあることですが、4-Phases Test(Setup- Excercise - Verify - TearDown)の手順を守ることや、1つのテストで1つの事を検証するようにする(Single Condtion Test)などユニットテストに関する「書き方」は多くあります。我々はそのようなノウハウを学習し、少しでも効果的なユニットテストを書く必要があります。
また、テストは具体的である事は非常に強力なメソッドです。実装が複雑であればあるほど、テストがシンプルで具体的であることはメンテナンス性を高め、品質を担保することができます。自分はXHTMLのテンプレートエンジンPirkaをオープンソースで公開していますが、このプロジェクトではテンプレートの読み込みとレンダリングについて、具体的なユニットテストを実施しています。このディレクトリには、テンプレートファイルとその期待結果(expected)が置かれており、次のようなテストコードが実行されます。
/** * ConditionとAttrの複合タグテスト * @throws ParseException * @throws PirkaLoadException * @throws TemplateNotFoundException */ public void render_CompositeConditionAndAttr() throws ParseException, PirkaLoadException, TemplateNotFoundException { String templateName = "CompositeConditionAndAttr"; Template tmpl = loader.load(getTemplateFileName(templateName)); viewModel.put("is_login", true); viewModel.put("msg_class", "msg"); String actual = tmpl.generate(viewModel).render(); assertRenderEquals(templateName, actual); }
各メソッドで何が行われているかは予想しかできませんが、テンプレート毎にこのようなテストを記述することで、テストの可読性が高くなるよう工夫しました。このコードはおそらく3年前くらいに書いたはずですが、現在でも拡張時に有効活用されています。むしろ、書いた頃よりも時間が経った今の方がより有益になっています。
勿論、ユニットテストだけが重要なのではなくソフトウェア開発全体をみれば重要なプラクティスは多数あるでしょう。しかし、プログラマがプログラマである為には、プログラムを書くことができるだけではなく、書いたコードに責任を持つため、正確で具体的なユニットテストを書けることを目標としなければなりません。

- 作者: 和田卓人,Kevlin Henney,夏目大
- 出版社/メーカー: オライリージャパン
- 発売日: 2010/12/18
- メディア: 単行本(ソフトカバー)
- 購入: 58人 クリック: 2,107回
- この商品を含むブログ (350件) を見る