テスト駆動開発のテストは、テストか?-TDD から BDD へ
アジャイル開発の中の1つのプラクティスであるTDD(Test Driven Development、テスト駆動開発)に使われるユニット・テスト、というものの役割について、よくテスト界の人との意見の相違がある。テストとしての完全性、や、品質保証についての考え方から見ると、テストとは呼べないのでは?ということ。
最近、アメリカテスト界の有名人であり、アジャイルコミュニティへの貢献も大きい、Brain Marick(www.testing.com/cgi-bin/blog) 氏とメールで話す機会があった。
アメリカでのコンセンサスは、TDDのテストはテストとしては二義的であり、一義的には、「設計ツール」だ
これは、以前「テストの役割=進捗管理+設計戦略」
blogs.itmedia.co.jp/hiranabe/2005/08/sd4__c05e.html で
紹介した、t-wadaさんの「テストという言葉について」にも書かれている。
それであれば、
「テスト」の語彙を使わずに、「設計」の語彙をより積極的に使ってはどうだろう
という試みがある。BDD(Behavior Driven Development、ビヘイビア駆動開発)だ。 Dan North がJUnit を改良して、jBehaveというツールを開発している(http://jbehave.codehaus.org/)。ここでは、テストの語彙群が振る舞い(もしくは仕様)の語彙群で置き換えられている。これは、非常に単純な置き換えに見えるかもしれないが、大きな飛躍への可能性でもある。
具体的には、test/assert という名前セットから、より仕様としての振る舞いを連想させる、should/Veiry という名前を使う。
例えば、空スタックのテストであれば、
public void testEmpty() {
Stack stack = new Stack();
assertTrue(stack.isEmpty());
}
ではなく、
public void shouldBeEmpty() {
Stack stack = new Stack();
Verify.that(stack.isEmpty());
}
当然だが、製品コード(Stack)よりも先に、この仕様コードを書き、それを満たすように製品コードを書く。さあ、どうだろう。より「仕様」が見えない?(※ このコードがすごいのは、仕様として「すらすら」読めること!Verifyクラスのstatic メソッドである that() というメソッドネーミングは絶妙だと思う)
「テストを使って仕様を設計する、そしてそれをテストと呼ばずにビヘイビアとよぶ」。これが新しいコンセプトだ。
「新しい名前」は、時として飛躍へのカギを持つことがある。
ちなみに、Ruby界隈にも、rSpec という同様の動きがある。http://rspec.rubyforge.org/
この翻訳をかくたにさんがやっている。http://kakutani.com/20051013.html#p02
※ぼくはAgile Development Conference 2004(レポートがhttp://www.objectclub.jp/community/adc/index2004 にあります)で、Dan NorthがjBehaveのデモを、廊下でやっていたのをみました。自分のPCで聴衆にみせてました。また、Alistair Cockburn の自宅に遊びに行った際も、この名前群の置換の重要性について、Ward Cunningham にとくとくと説いていましたっけ。