テストケースの具体的な代表値には2以外の一意の素数を使おう

はじめに

本記事は、ソフトウェアテストの小ネタ Advent Calendar 2022の19日目の記事です*1

本記事では、テストケース*2で具体的な代表値を使うときに気をつけている「2以外の一意の素数を使う」という方針について書きます。なお、この方針は私の個人的経験及び主観に基づいたものです。「必ずしもこのやり方が正しい」と主張したい訳ではないことをご了承ください。

記事では、この方針をさらに「2を使わない」「一意の数を使う」「素数を使う」の3つに分割して説明します。

目次

テストケースの具体的な代表値に2を使うのを避ける

とある大手で塾講師のバイトをしていた頃、塾で作成しているテキストに以下のような記述がありました。

.

例題)半径2cmの円の円周を求めなさい

解説)円周は直径×円周率で求められます。よって、

2×2×π=4π

答え)4πcm

この記述は「分かっている人の説明」であり、知らない人に対しては混乱を与える説明だと思います*3。「2×2」というのが、「半径×半径」なのか「半径の2倍」なのかが分かりづらいからです。

このように、「2」を用いてしまうと、「倍の値を使う」といったロジックを組んでいる場合に区別がつきづらくなってしまいます。そのため、「2」を使うのは避けるようにしています。

もちろん、必ず2を避ければ何でも良いという話ではありません。例えば、扱っているドメインで頻繁に「ポイント3倍キャンペーン」を行なっている場合は、「3」という値も避けた方が良いでしょう。つまり、特別な意味合いが含まれることが多い数字は避けた方が良いと思っています。

テストケースの具体的な代表値は一意の数を用いる

上に書いた「ドメインで頻繁に使われる数値を避ける」と似たような話です。

例えば、「商品Aを5個と商品Bを5個と商品Cを5個」と指定したとしましょう。合計の個数は「15個」が期待値であるにもかかわらず「10個」となった場合、どの商品が悪さしたのか分かりづらくなります。

私の場合「商品Aを3個と商品Bを5個と商品Cを7個」などと指定します。結果、合計の個数が「15個」が期待値であるにもかかわらず「12個」となった場合、「商品Aが加算されなかったのかな?」と推測できます。

テストケースの具体的な代表値に素数を用いる

テストケースの具体的な代表値には素数を選ぶことが多いです。

なぜかというと、例えば「10と入力する」と記述した場合、「単純に10を入力したかった」からなのか、「5の2倍の値を入力したかった」からなのか分かりづらいからです。

あくまでも「数値をそのまま用いる」ということを際立たせるために、できるだけ素数を選ぶようにしています。

注意:今回の考えはあくまでも代表値の場合の話です

ここまで話している内容は、同値分割法における代表値についての話です。それらとは別に、境界値分析における境界値は別途設定すべきだと思っています。

例えば、以下の画像のように、年月日の「月」についての入力値としては、「1」や「12」を選ぶかもしれません。

第4回 ブラックボックステスト - gihyo.jp から引用

「1」や「12」は代表値ではなく、境界値としての特別な数値を意味するからです。

一方、本記事でここまで語っていた内容は、境界値ではなく、同値分割法における代表値についてです。

年月日の「月」についての入力値について言えば、

といった選び方をするかもしれませんね*4

おわりに

今回は、具体的な代表値を選ぶ際に気にしていることを言語化してみました。

本記事を読んで、「いや、必ずしもそうではないだろ」というような意見があるかもしれません。その際は、どういう場合に今回のような選び方をしないのか言語化してみてください。もしかしたら、そのケースは隠れた条件を持っているかもしれません。もし可能であれば、是非意見を共有してくださると嬉しいです。

補足:厳密な素数を選ぶわけではない

ここからは補足です。気になった人は読んでください。

本文中で「できるだけ素数を選ぶ」という表現をしましたが、必ずしも厳密に素数を選んでいるわけではありません。

例えば、硬貨を用いた(電子マネーではない)バスの運賃に関するテストを考えた場合、素数であることを考慮して「691円」を選ぶことはせず、「700円」を選ぶでしょう。理由は3点あります。

1. 「691」という数字が素数であるか判断が難しいため

「7」「13」ならば、素数であるということが分かりやすいですが、「691」という数字が素数であるかは判断しづらいです。

「691って素数なのかな?」と考えるのに時間がかかってしまっては意味がありません。「何かの倍数という考慮を排除したい」という目的達成のために素数を使おうとしているのに、何かの倍数かどうかの判断が難しい数字を選ぶべきではありません。

2. 「691」という数字に特別な意味があるように見えるため

テストケースの値に「691」と明記してしまうと、「この691というのは何か特別な数値で、これを選んだ理由があるのではないか?」と勘繰ってしまう人が現れる可能性があります。

3. 「691」という数字がドメインにそぐわない数字であるため

電子マネーではない)バスの運賃というのは10円区切りであることが多いです。そんな中、1の位が0でない数字を選ぶのはドメインにそぐわない選び方だと思っています。

以上の理由より、今回の場合は「691円」という値は使わず「700円」といった値を使うと思います。ちなみに、その際も「600円」ではなく「700円」という値を使うことが多いです。「700円=7(素数)×100円」だからです。

*1:小ネタなのに文字数多めでごめんなさい。

*2:特にローレベルテストケース

*3:個人的には、よくこんな混乱を招きそうな例題を、大手塾のテキストで記述するなーと思ってました

*4:前提として、今回はどの月を選ぶにしても同じ条件であるとしています。例えば、「2月は28日(閏年の場合は29日)までしかないので…」という考慮をする必要がないという前提を置いています。