テストケースどうしよう?
「年調給与額」から「給与所得控除後の給与等の金額」を算出するメソッドを書いている。
計算式は下表のとおりである。円未満は切り捨てることになっている。
年調給与額が下表の範囲外になることはないものとする。
メソッド自体は簡単に書けそうである。(C#ぽい何か)
decimal Hoge(decimal A){
if(A<=550999) return 0;
if(A<=1618999) return A-550000;
if(A<=1619999) return Math.Floor(A*0.6+97600);
・・・
}
みたいな感じ。
で、このメソッドのテストを書くにあたって境界値のケースを用意した。
A=1 (expected=0)
A=550999 (expected=0)
A=551000 (expected=1000)
A=1618999 (expected=1068999)
A=1619000 (expected=1069000)
A=1619999 (expected=1069599)
A=1620000 (expected=1070000)
・・・
うん、動く。この程度で失敗する心配はない。
ここでうっかりメソッド本体を書き換えてみる
decimal Hoge(decimal A){
if(A<=550999) return 0;
if(A<=1618990) return A-550000;
if(A<=1619999) return Math.Floor(A*0.6+97600);
・・・
}
一つ書き換えただけである。
これで1618999のケースが失敗するはz・・・あれ成功した?
それもそのはず
(正計算式)1618999-550000=1068999
(誤計算式)1618999*0.6+97600=1068999.4→円未満切り捨て→1068999
と、同じ値を返してしまうのである。
前後の計算式を取り違えた場合に失敗になるようなケースを追加しないといけない。
1618998だとどうだろ?
(正計算式)1618998-550000=1068998
(誤計算式)1618998*0.6+97600=1068998.8→円未満切り捨て→1068998
だめだ同じ値。
1618997だとどうだろ?
(正計算式)1618997-550000=1068997
(誤計算式)1618997*0.6+97600=1068998.2→円未満切り捨て→1068998
よし、ここだ。
A=1618997 (expected=1068997)
のケースを追加。
テストケースを探すのもしんどい。