この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
テストデータで決定する数値は無作為に決定していると、予期せぬ矛盾が発生する事がある。
その注意点を記述する。
■ 問題点
例えば商品のテストデータを作成する場合を考える。
商品の値段は当然自然数である。
これは税抜価格であっても税込価格であっても当てはまるが、1点異なる部分がある。
税抜価格は単純に決定された値であり、この値を導いている値はないのに対して、税込価格は税抜価格から導かれて決定する。
つまり税込価格は税抜価格の関数になっている。
この関数をfとした場合、f(x)は
f(x) = floor(1.08x)
と表現できる。このfはN→Nの写像になっており、下記の様にF(y)を定義すると、Fはfの逆関数になる
F(y) = ceil(y/1.08)
テストデータとして、税込価格を決定する場合、ランダムに自然数が発生する様なプログラムでは、例えば1700という値になる可能性がある。これを関数Fによって
F(1700) = 1575
と税抜価格を算出したとすると、実際のf(1575)は1701の為、誤差が発生する。
■ 原因
この誤差はfの逆関数が存在する事と矛盾する様に見えるが、そうではなく、この写像fがN→Nにおいて全射でない点が問題である。
このfの定義域はN全体であるが、値域はN全体ではなく、1700というのが値域外の数値である事が原因である。
(つまり f(x) = 1700 を満足するxは存在しない)
■ 結論
テストデータを作成する際は、それを導いている値があるかないかを意識する必要がある。
導いている値がある場合、その関数の写像において全射であるかを考え、
全射でない場合は、値域外の数値にならない様、データを工夫する必要がある。