テストケースどうしよう?

「年調給与額」から「給与所得控除後の給与等の金額」を算出するメソッドを書いている。

計算式は下表のとおりである。円未満は切り捨てることになっている。

年調給与額が下表の範囲外になることはないものとする。

f:id:turkey_pc:20200707172224p:plain

 

メソッド自体は簡単に書けそうである。(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)

のケースを追加。

 

テストケースを探すのもしんどい。