ソフトウェアの品質を学びまくる

ソフトウェアの品質、ソフトウェアテストなどについて学んだことを記録するブログです。

価格計算仕様のトラップとテスト技法

 Hideo Oideさんが、こんなつぶやきをしていました。

ドメイン分析でブツブツ言ってるのは、某ショップで(Amazonや楽天じゃない)、4000円以上お買い物すると送料無料(700円)、10%引きのクーポンが付与されてたって条件で、4100円分買うと、4100−410+700=4390円で、クーポン無かったら4100円っていう残念なのが有ったから。
これに対して4000円で検証してもクーポン適用しない方が安いって現象は起きるっちゃ起きるんで境界値テストの範疇っちゃ範疇なんですけど、クーポン適用と組み合わせるっていうのはドメイン分析しないと出ないのかな?という疑問。

 クーポン適用のせいでむしろ高くなるということですね。
 まず、これはどういうことが起きているのかを調べたうえで、この問題をどのように検出すべきかを考えてみます。

何が起きているのか

 以下、商品の価格をX、クーポン適用や送料も含めた総額をYとします。

クーポンなしの場合

  • X >= 4000 の区間: Y = X
  • X < 4000 の区間: Y = X + 700

クーポンありの場合

  • X >= 4444※ の区間: Y = 0.9 * X
  • X < 4444 の区間: Y = 0.9 * X + 700

※0.9 * X >= 4000 を、わかりやすさのために変換しています。

 これをグラフにしたのが、下の絵です。青がクーポンなし、赤がクーポンあり。

料金計算のグラフ化

 X軸の黄色い帯の区間は、クーポンなしよりクーポンありの方が高くなってしまうことがわかります。
 これは2つの要因で起こっています。

  1. クーポンありでもなしでも、総額の変化が価格に対して連続でなく、ある価格を閾値としていったん安くなる
  2. クーポンなしに比べて、クーポンありの方が傾きが小さい。このため、閾値はクーポンありの方がクーポンなしより高い

 このため、価格4,000円で閾値を迎えたクーポンなしの総額が、クーポンありより安くなります。この状態は、クーポンありの閾値である価格4,444円まで続きます。

どのように検出すべきか

 元ツイートではドメイン分析への言及があります。が、この例では変数が商品価格1つしかないので、ドメイン分析ではなく、境界値分析を使うことになるのかと思います。
 「総額が不連続に変わる」というと特別なことように感じますが、「年齢でバスの料金が決まる」というのと本質的には変わりません。今回の例では、XもYも「金額」である点が、特殊といえば特殊かもしれませんね。

 また、境界値分析で検証できるのは、「価格計算が仕様通りか」であって、「クーポンなしの方が安くなることはないか」ではないように思います。
 「クーポンなしの方が安くなることはないか」はむしろ、仕様のレビューで確認すべきことではないでしょうか。もしテストで検証するのであれば、上の数式に現れる4,000、4,444の前後で計算して、クーポンのありなしで比較するテストをするかもしれませんが、ちょっと変ですよね。

ドメインテストとは・・

 このツイートを見てドメインテストについてもう1回考えてみたいと思ったのですが、落ち着いて考えてみるとドメインテストとはあまり関係なさそうでした。
 スレッドの中で紹介されていたWACATEのスライドから始めてみようと思います!

www.slideshare.net