第17回で,プロダクトコードの重複の話をしました。そこでは,DRY(Don't rpeart yourself)原則,コードの「重複は悪」という話をしました。
では,テストコードの重複はどうでしょうか? 今回はその点について議論してみたいと思います。
テスト対象,納品対象のコードは,コードの重複や機能の重複というのは,あってはならない,というか理想的には1行も重複がないという状態で書かれるべきですが,ではテストコードはどうなのかという話です。
テストコードの中の重複をどんどん排除してくと,たとえばテストのヘルパクラスをたくさん作ったりとか,テストクラスの継承がどんどん深くなるといった結果になり,そのテストが実際にどのように動いているのかを調べるために,いろんなテスト用クラスを行ったり来たりしなければならないというような状況が出てきてしまいます。
そのような状況に直面したときに,テストコードの重複は善か悪かというような議論が出てきます。
2つの指針
「テストコードの重複」は,一番最後のトピックとしてちょうどいいかなと思っています。そして意見は以下の二つ
「テストコードには重複があってもいい,テストコードはその部分だけ見ればある程度何をやってるかわかるコード,重複があってもいいから何をやってるかわかるノッペリとした書かれ方がいい」
という考え方と,
「テストコードもコードはコード,テストコードにもプロダクトコードと同様にDRY原則が満たされなければならない」
という意見に,だいたいやはり2種類に分かれるんですね。
故・石井勝(masarl)さんの考え
故・石井勝さんという方は,テストコードは重複があってもいいと,おっしゃっています(注1)。テストは,そのテストコードのブロックだけ見れば,ある程度なにやってるかわかるという単純な書かれ方がよいという考え方です。
私自身もmasarlさんの考え方に沿っています。重複がいくつかあってもいいという考え方ですので,テストのメンテナンスをするときに何ヵ所かを同時にいじるという状況になってしまうことがあり得るんですけども,それでもテストは単純な書かれ方のほうがいいという考えです。
- 注1) http://www.morijp.com/masarl/homepage3.nifty.com/masarl/article/junit/programming-style
-guide.html
達人プログラマーDave ThomasとAndy Huntの考え
一方,『達人プログラマー』(注2)という本で有名なDave ThomasとAndy Huntは,『達人プログラマー』(アスキー刊のほう)の中で「テストコードも実コードである」ということを書いています。テストコードも実コードと同じ厳しい基準であたり,テストコードにも重複はあってはならないという意見です。
- 注2)
- 『達人プログラマー ― システム開発の職人から名匠への道』(Andrew Hunt/David Thomas(著),村上 雅章(訳),ピアソン・エデュケーション),『達人プログラマー ― ソフトウェア開発に不可欠な基礎知識 バージョン管理/ユニットテスト/自動化』(David Thomas/Andrew Hunt/Mike Clark(著),長瀬 嘉秀(監訳),テクノロジックアート(訳),アスキー)

