« 三角形問題で必要なテストケース数 | Main | 三角形問題のテストの考え方いろいろ »

09 June 2011

三角形問題ではKent Beckにも見落としがあった!

みなさんは三角形問題に対していくつのテストケースがつくれたでしょうか?
Myersの当時の調査では「高度な経験をもつ専門プログラマの平均点数は14点満点でたった7.8点」だったそうです。みなさんも、Hammingが言うところの三角形問題の「隠れた前提(hidden assumption)」を見落として「よくできる学生でも(3,4,7)の組が不等辺三角形と呼ぶべきでないことを見い出して驚く(Gruenberger)」のと同じ状況になりませんでしたか?

もしそうだったとしてもがっかりすることはありません。
実はKent Beckですらこの見落としがあったのです。

前回の「三角形問題で必要なテストケース数」で、Kent Beckが「テスト駆動開発入門」の中で6個で十分と書いていることを紹介しましたが、この部分の記述は2001年12月のUSENETニュースグループcomp.lang.rubyで議論されたものがベースになっています。
この議論の中でBeckは最初に5個のテストケースを示したのですが、抜けがあるとの指摘を受けて1個追加して6個となったのです。

◆最初のメールで示した5個
1. 不等辺三角形(1,2,3)
2. 正三角形(2,2,2)
3. 二等辺三角形(1,2,2)
4. 入力値がnil(空)
5. 文字列(a,b,c)

どうでしょう。
おかしなところに気がつきましたか?

◆修正版のメールで示したもの
1. が(2,3,4)に修正されました  ※ 1. の(1,2,3)は三角形にならないですね。
6. に、三角形ではない(1,2,3)  が追加されました

◆「テスト駆動開発入門」では
4. nil(空)が負の値(-1,2,2)に変更されています  ※ 変更理由は分かりません

ところで、ここで書きたかったのはBeckでも見落としがあるということではなく、このcomp.lang.rubyの一連の議論のメールを読むと、三角形問題を題材にしてTDDにおけるテスト(unit tet)の考え方、それに対するテスト専門家などからの反論が分かり、非常に勉強になりそうだということです。ちなみに、この一連の議論の発言者の中には、Kent Beck以外にRon Jeffries、Robert C. Martin (Uncle Bob)というAgile Manifestoに名を連ねている人たち、及び"Testing Object-Oriented Systems: Models, Patterns, and Tools"の著者のRobert Binderがいます。
私自身は英語力やプログラミング知識の不足のため十分に理解できないので、興味のある人は是非読んでみて教えてください。勉強会の題材にするのもよいかもしれません。

取り敢えず、Beckの提示したテストケースに関する発言が読めるリンクを以下に書いておきます。
なお、Beckはいきなり5個のテストケースを示した訳ではなく、TDDのプロセスに沿って説明しています。すなわち、まず一つテストを書き、それがOKとなる実装を書く、その後にテストを追加して、それがOKとなるように新たな機能を実装に追加するという流れです。([ruby-talk:28069]を参照)

2001年10月26日 <Extreme Programming(XP)のYahoo! Groups>
  Binderのテスト書籍に関する質問があり、その返信の中でBeckは三角形問題のテストは5個で十分と発言。
Re: [XP] Test Suites
http://groups.yahoo.com/group/extremeprogramming/message/37242
The biggest problem is that it doesn't balance the cost and benefits of tests. He has a triangle example which he writes (I think) 29 tests for. The test-first version can be done confidently with 5 tests.
   (注)Binderが29個のテストを書いているというのはBeckの勘違い。

2001年12月7日 [ruby-talk:27796] Myersの三角形問題でどんなテストを書くか?
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/27796

2001年12月8日 XPのYahoo! GroupsのBeckの発言を紹介
http://groups.google.com/group/comp.object/msg/5d38c7804ace023e?hl=en

2001年12月8日 [ruby-talk:27813]  Beckの意図は何だろう?
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/27813

2001年12月8日 [ruby-talk:28069]  Kent Beck 5個のテストを提示
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/28069

2001年12月11日 [ruby-talk:28123] テストもれの指摘
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/28123

2001年12月11日 [ruby-talk:28183] Kent Beckが指摘に返信
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/28183

2001年12月12日 [ruby-talk:28294] Kent Beckが修正、追加を提示
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/28294

|

« 三角形問題で必要なテストケース数 | Main | 三角形問題のテストの考え方いろいろ »