どんな単体テストをしますか?その2
新年度に入ってから、電車事故が多い気がする。
==
どんな単体テストをしますか?では、ブラックボックステストの観点でテストケース・テスト条件を洗い出してみた。
今度はホワイトボックステストの観点で考えてみよう。
元の記事はこちら(自動で単体テスト、ステートメントカバレッジ、そしてテストケースレビュー)なので、ご参考までに。
- ホワイトボックステストの観点
まずはコード。西暦、月、日を指定することで元旦からの日数を計算する関数。
30:int
31:daycount(
32: int year,
33: int month,
34: int day )
35:{
36: int i = 0;
37: int count = 0;
38: int mday = 0;
39:
40: if( year < 1900 || year > 2100
41: || month <= 0 || month >= 13
42: || day <= 0 || day >= 32 ){
43: return(-1);
44: }
45:
46: count = 0;
47: for(i = 1; i < month + 1; i++){
48: switch(i){
49: case 4: case 6: case 9: case 11:
50: mday = 30; break;
51: case 1: case 3: case 5: case 7: case 8: case 10: case 12:
52: mday = 31; break;
53: case 2:
54: if( (year % 4 == 0) && (year % 100 != 0 || year % 400 == 0) ){
55: mday = 29;
56: }
57: else{
58: mday = 28;
59: }
60: break;
61: default:
62: return(-1);
63: }
64:
65: if( i == month ){
66: if( day > mday ){
67: return(-1);
68: }
69: else{
70: count += day;
71: }
72: }
73: else{
74: count += mday;
75: }
76: }
77:
78: return(count);
79: }
ホワイトボックステストではカバレッジを基準にすることが多い。ステートメントカバレッジ、ブランチカバレッジ、コンディションカバレッジなどなど。組織やプロジェクトチーム内でどのカバレッジレベルを採用するかが決まっている場合はそれに従うのもいい。でも、最低限ステートメントカバレッジは抑えたい。テスト(実施)カバレッジについてはここを参照。(俗称として、「C0」「C1」「C2」などと呼ばれることがある。)とりあえず、ステートメントカバレッジを基準にしてみるか。
まずは、最初の「引数チェック」の箇所。これはif文を分岐として2種類が考えられる。

次に月に関するfor文内の処理。ここで少し複雑だが、switch文やif文で複数のブランチが考えられるが、テスト設計者の主観によっては、全ての月の条件(1月~12月)と、うるう年条件(平年、うるう年、100年後との平年、400年後とのうるう年)も網羅すべきだと考える場合もある。

これらを組み合わせて、全ての命令文・手続きを実行するようなテストケース・テスト条件表を作成すると、こんな感じになるだろうか。

結構、テストケースが少ない。これだけじゃテストしたという自信はないな。ホワイトボックステストってもしかしたら、コード構成によっては威力を発揮できないこともあるのかしら?
| 固定リンク
この記事へのコメントは終了しました。

コメント
> ホワイトボックステストってもしかしたら、コード構成によっては威力を発揮できないこともあるのかしら?
というよりも、カバレッジで言えば、ステートメントカバレッジだけでは不足で、ブランチカバレッジまではホワイトボックステストで計測した方がよいということだと思います。
その他にもブラックボックステストでは検出が不可能と考えた方が良い欠陥(バグ)がありますので、ホワイトボックステストは重要です。
投稿: あきやま | 2007年5月15日 (火) 14:25
>あきやまさん
ホワイトボックステストではなく、ステートメントカバレッジを基準にした
ため、物足りない感じがしたのですね。
ブランチ・コンディションと、レベルを変えてもう一度テストケースを
考えてみようかな。
投稿: softest | 2007年5月15日 (火) 15:55
プログラムの単体試験をホワイトボックステストで行おうと考えています。試験項目を作成するにあたって、質問があります。
・全ての分岐を通れば、それでよいのでしょうか。
・全ての分岐を通って、且つそれぞれの分岐でいくつかの値をチェックする必要があるのでしょうか。(変数などに入るべき値が入っているかどうか)
以上、上記のサンプルなどを使って具体的に試験項目をどうかけば良いか、お願いします。
投稿: okky | 2008年6月13日 (金) 16:40
>okkyさん
コメントありがとうございます。
規模によって変わるかもしれませんが、単体試験は命令文や分岐の網羅性を
意識したテスト設計が必要だと思います。僕が実際に単体試験を進めるときは
ボトムアップが多いので、単体試験をホワイトボックステストよりで検証し、
より上位との結合時にそれら全体のホワイトボックステスト+結合周辺での
ブラックボックステストを行ったりします。「正しい実装」と「正しい動作」
という観点、でしょうか。
途中の変数の状態を知る必要があるかは、基本的には動的テストで僕は
チェックはあまりしません。
今回のdaycount()で具体的に単体試験を設計すると。。。
ちょっとエントリ1本で書いてみますね。
#「この余白はあまりにも狭すぎる」、ではないですが
投稿: softest | 2008年6月16日 (月) 20:46