今回はテストケースをロジカルに導出していこうと思います。
特に前回やられたパターン(※便宜的に[2,9]パターンと呼ぶ)を導出できるかがポイントです。
※サンプルの範囲が[3,8]となっていたのに対し、それを包むようなパターン、すなわち[2,9]のパターンでInteliJの今井さんが主題者の井上さんからマサカリを投げられたことに由来する。
実は前回のエントリの図ではパターンが全然足りないのです(゚´Д`゚)゜。ウァァァン
それではどのようにパターンを出していくのか、参加者からもヒントをもらって考えた二つの方法を書いてみます。
方法1:パターンの考え方を2段階に実施
①2つの閉区間の位置
②1つ目の閉区間の大きさ
③2つ目の閉区間の大きさ
この3つを一気に考えるのはちょっと難しいので分かりやすいものから固定していきます。
この方法では②と③の関係のパターンを考えていきます。
ということで、以下のパターンを導出します。
ということで、まずは6パターンを出しましたね。
もし"点を範囲を同値に考える"ということであれば、PT4~PT6になります。
ここからさらに"①2つの閉区間の位置"について場合分けしていきます。
ここまで行くと、間違いなく"[2,9]パターン"は出せると思います。
ということで、全部で38パターン出すことができました。
もちろん"[2,9]パターン"も入ってますね。
PT4にはないパターンをPT5、PT6では濃いピンクの色であらわしました。
すなわち、パターンの数としては26パターンになります。
PT1(3)+PT2(5)+PT3(5)+PT4(7)+PT5(3)+PT6(3)
実は前回のエントリのパターンはPT6についてのパターンしか出してませんでした。Σ(゚Д゚;)
方法2:取りうる点を考えて、組み合わせを導出する。
これはテスト勉強会のときに参加者の人がやっていた考え方です。
少しロジカルに出すように考えてみました。
これはまず"②1つ目の閉区間の大きさ"について場合分けします。
すると点か範囲かの2つのパターンがでることになります。
それについて、2つめの閉区間の上端点、下端点の取りうる位置を設定し、全ての組み合わせを漏れなく取って行きます。
そして上端と下端の組み合わせを漏れなく出したものが以下の表になります。
<点のとき>
<範囲のとき>
最後に同じパターンの組み合わせを一緒にして、パターンを絞ります。
絞ったパターンは取り消し線で消しています。
これでも最終的に8+18で26パターンを導出することができますね。
最後に・・・ 本当にできるの??
テストという目的から考えてみると、なんとかパターンを網羅することはできそうです。
しかしTDDの黄金の回転を回しているときにできるものでしょうか?
今のところの自分の答えは『無理』です。
それではTDDのときはどうしたらいいのでしょうか?
ちょっと考えてみましたので、自分の意見を書いてみます。
※以下は実際に解いた人向けの解説になりますので、分からない人は自分で解いてみてください。
TDDでコードを書いているときは、基本的にはシンプルな考え方をしていきますので、最初は二つの範囲をイメージすると思います。そのときに使いたくなるメソッドは一つ前の例題で実装したContains()ですね。
このContains()が使えそう!と思ったときに、本当にそれでいいのか?と例外のパターンを考えるというのが王道な気がします。
『下端点と上端点が中に含まれない場合で重なる場合はあるか?』
この命題の場合は結構な人が気づくのではないでしょうか?
TDDの場合はこれくらいじゃないと黄金の回転が止まってしまう気がします。
もしくはContains()で実装して、[2,9]パターンを見逃したとしても、一息ついたときに自分で、もしくはテストコードのレビュー時にどういうケースがあるのかを考えてみるというのも実務的にはありかなと思っています。
仮に間違ったとしてもどこかで気づくことができれば修正、確認が容易というのがテストコードのいいところですね。
# というところで、本エントリを後押ししてくれた今井さんと井上さんに感謝します。
# どうもありがとうございました!もし何かありましたらまた連絡ください。
# もしここまで見たら、勝ち負けの判定もお願いします♪