どんな単体テストをしますか?
自動で単体テスト、ステートメントカバレッジ、そしてテストケースレビューで、適当な関数を作って、適当な単体テストの条件を作ってみた。この中で「指定日が元旦から何日目かを返答する関数(daycount)」についてもう少しきちんとテストしてみようかと。
==
- ブラックボックステストの観点
- year(西暦)
- month(月)
- day(日)
- 引数エラーケース
- 内部エラーケース
- 正常ケース
ブラックボックステストなので、基本的には「指定日が元旦からの日数」が正しく計算できるか、という仕様からテストケース・テスト条件を洗い出す。でもまずは関数インターフェースを眺めてみる。
int daycount( int year, int month, int day );
引数は、
の3つ。西暦はここでは「1900年~2100年」という範囲に限定する、という(かくれ)仕様。月は「1月~12月」、日は「1日~31日」である。これは自明な仕様とでもいうのだろうか。ただし、不明確な仕様として「その月に存在しない日を指定した場合の動作」を確認しなくてはならない。ここでの仕様は「エラー」である。(9月の場合、31日を指定するとエラーとなる、など)
最近の僕の場合、ここで大分類として
というように考えている。
引数エラーケースは、3引数の引数を原因結果グラフ・デシジョンテーブルで考えることが多い。

西暦のエラー値は、「-1」「0」「1899」「2101」あたりが妥当かな。int型の最小値、最大値は、別にいらないだろう。月のエラー値は、「-1」「0」「13」あたりかな。日のエラー値は「-1」「0」「32」としましょうか。
そして、3つともエラー値ではない場合は、さらに「内部エラーケース」「正常ケース」で考えてみる。
内部エラーケースは、月と日の不整合だろう。大の月(1月、3月、5月、7月、8月、10月、12月)は31日まであるので、引数エラーケース以外での不整合はなさそう。小の月(4月、6月、9月、11月)は30日なので、日が31日の場合に不整合が発生する。2月はややこしいが、西暦がうるう年ではない場合は、29日、30日、31日が不整合となるパターン。うるう年の場合は、30日、31日が不整合となるパターン。
正常ケースは、どうする?(1月、6月、12月)と(1日、15日、晦日)くらいでいいのかな。
まとめてみると、、、


あってるかなあ。
ホワイトボックステストの観点、グレーボックステストの観点は、また今度書きたい。忘れなかったら。
| 固定リンク
この記事へのコメントは終了しました。

コメント
私なら、上記に加えて、
<うるう年のチェック>
・普通の、うるう年の2月29日が正しく判定されること(2008年2月29日)
・100で割り切れるが400で割り切れない年がうるう年でないこと、(1900年2月29日)
・400で割り切れるうるう年の2月29日が正しく判定されること(2000年2月29日)
<境界値のチェック(内部表現が分からないので)>
・正常境界値(1900年1月1日、2100年12月31日)
・異常境界値(1899年12月31日、2101年1月1日)
をします。
投稿: あきやま | 2007年5月15日 (火) 08:05
>あきやまさん
コメントありがとうございます。
・うるう年チェックについて
→ご指摘の通り考慮されていませんでした。昨日としては
「元旦からの日数カウント」なので、2008年、1900年、2000年
における3月1日の日数をチェックすればよさそうですかね。
・境界値チェック
→引数の境界値は意識していましたが、全体的な範囲として
考えると、ご指摘の日付での確認はしておきたいところです。
投稿: softest | 2007年5月15日 (火) 09:29
> 3月1日の日数をチェックすればよさそうですかね。
3月1日のチェックではなく、先のコメントに書いたとおり、閏日の「2008年2月29日」と、「2000年2月29日」と、閏日エラーとなる「1900年2月29日」のチェックをすべきです。
3月1日をチェックすることで、その代わりになると分かるのは、プログラムの中身をある程度考えているからだと思います。
ブラックボックステストで大切なのは、
・同値分割
・境界値分析
・特異値の分析
ですよね。
境界値として3月1日をテストすることに反対しませんが、閏日という特異値を外して良いことにはならないと思います。
投稿: あきやま | 2007年5月15日 (火) 10:45
>あきやまさん
3月1日での検証が各閏日の検証と同等だというのは、実装者だからでした。
ブラックボックステストという点で言えば、2000年3月1日の検証は
2000年2月28日の検証と同じ単なる「境界値」の条件になってしまいました。
投稿: softest | 2007年5月15日 (火) 12:04