« 自動で単体テスト、ステートメントカバレッジ、そしてテストケースレビュー | トップページ | どんな単体テストをしますか?その2 »

どんな単体テストをしますか?

自動で単体テスト、ステートメントカバレッジ、そしてテストケースレビューで、適当な関数を作って、適当な単体テストの条件を作ってみた。この中で「指定日が元旦から何日目かを返答する関数(daycount)」についてもう少しきちんとテストしてみようかと。

==

  • ブラックボックステストの観点
  • ブラックボックステストなので、基本的には「指定日が元旦からの日数」が正しく計算できるか、という仕様からテストケース・テスト条件を洗い出す。でもまずは関数インターフェースを眺めてみる。

    int daycount( int year, int month, int day );

    引数は、
    1. year(西暦)
    2. month(月)
    3. day(日)
    の3つ。西暦はここでは「1900年~2100年」という範囲に限定する、という(かくれ)仕様。は「1月~12月」、は「1日~31日」である。これは自明な仕様とでもいうのだろうか。ただし、不明確な仕様として「その月に存在しない日を指定した場合の動作」を確認しなくてはならない。ここでの仕様は「エラー」である。(9月の場合、31日を指定するとエラーとなる、など)

    最近の僕の場合、ここで大分類として


    1. 引数エラーケース

    2. 内部エラーケース

    3. 正常ケース


    というように考えている。

    引数エラーケースは、3引数の引数を原因結果グラフ・デシジョンテーブルで考えることが多い。
    Daycount1
    西暦のエラー値は、「-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日、晦日)くらいでいいのかな。

    まとめてみると、、、

    Daycount2
    Daycount3

    あってるかなあ。

ホワイトボックステストの観点、グレーボックステストの観点は、また今度書きたい。忘れなかったら。

|

« 自動で単体テスト、ステートメントカバレッジ、そしてテストケースレビュー | トップページ | どんな単体テストをしますか?その2 »

コメント

私なら、上記に加えて、

<うるう年のチェック>
・普通の、うるう年の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

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/155415/6392937

この記事へのトラックバック一覧です: どんな単体テストをしますか?:

« 自動で単体テスト、ステートメントカバレッジ、そしてテストケースレビュー | トップページ | どんな単体テストをしますか?その2 »