ネタ元 → 数学的帰納法で完全なテストを行えるか?
- 引数にkを与えたときちゃんと動く。
- kのとき動くならk+1でもちゃんと動く。
この二つが満足されるなら 引数 >= k ないかなる引数を食わせてもちゃんと動く。
僕らがやってるテストは結局のところこのドミノ倒しと似たよな
ことやってんですわ。たとえば:
// 絶対値を返す
int abs(int x) {
if ( x > 0 ) return x;
else return -x;
}
これをテストするとなると、
x > 0 たとえば 1 のとき 1を返すなら2, 3, 4... についてはやらんでもいい。
if の条件がひっくり返ることがない(x=1のときと同じパスをたどる)から。
そしてもひとつ、
x <= 0 のとき、たとえば 0 のとき 0 を返すなら-1, -2, -3... についてはやらんでもいい。
理由は同じ。
全件テストだとものっすごい数になるはずのテストケースをわずか
2個で済ますことができるのは、
ドミノ倒しの成り立つ境界点(はじっこのピース)を狙うからよね。
関数に入ってから出るまでに辿るパスをすべて通るような入力
の組み合わせとそのときに期待される結果の組さえあれば完全
にテストしたことになりますわ(外乱のない静的な実行なら)。
とはいえたとえばifが10個あったらパスは最大1024通り、
1024組のテストケースを食わせにゃなりません。
これじゃたまらんのでコードを(実行せずに)解析して、
ムダなテストケースを除外していく。
そんなのが巷で売ってるテスト・ツールの機能のひとつ、と。