テストの意義
テストの種類
- ソースコードに着目するテスト
- プログラムの仕様に着目するテスト
- パフォーマンスなど付加価値に着目するテスト
- テスト自体が正しい事をテストするためのテスト
ソフトウェアプログラムのソースコードに着目したテスト
一般にホワイトボックステストと呼ぶ。
単体テスト(Unit Test)
プログラム中のあるユニットごとにテストを行う手法。
一般的なのは、関数(メソッド)やクラスに対して、単体で動かせるテストコードを用意し、そのテストコードによって、個々の部品が正しく動作することを確認する。これによって、ケアレスミスはかなり減らせる。
しかし、実際問題、仕様の変更などに対して追従していく必要があり、テストコードにかける時間が増えてしまうため
テストコードを書くべきところは、限定した方が良い。
たとえば、絶対に変わらないと信じられる箇所。あるいは、世界的な規格として定まっていることに関する処理。
網羅テスト、カバレッジ
プログラムのテストによって、プログラムの動作をどれくらい網羅したテストをできるかを基準としたテスト。
単体テストで作成するテストコードの作り方を示した物であると同時に、どれくらい安心出来るかの尺度となる。
が、しかし、プログラムの命令や条件を全てもれなくカバーしたテストをしたとしても、当然ながら、作っていない部分までテストを機械的に行えるわけではない。
*命令網羅テスト、C0テスト、ステートメント・カバレッジ
命令網羅テストは命令に着目したテストである。
ソースコード中に条件分岐があり、そこに分岐によって枝分かれする全ての命令を通らせて正常に動作することを確認する。
int func(int x) { if (x < 0) { x = 0; } return x; }
この例では、「x=0」が条件分岐によって枝分かれしている。xが0以上の場合は、この「x=0」を通らない。
命令網羅テストにおいては、必ず「x=0」を実行させるよう、xに負値を入れて確かめる。
*分岐網羅テスト、判定条件網羅テスト、C1テスト、ブランチ・カバレッジ
分岐網羅テストは、分岐に着目したテストである。
int func(int x) { if (x < 0) { x = 0; } return x; }
この例だと、「x<0」という条件が真となるケースと偽となるケース両方をテストする。
つまり、xに負値の値を入れるケースと、xに0以上の値を入れるケースのテストを行う。
*条件網羅テスト、C2テスト、コンディション・カバレッチ
条件網羅テストは、分岐とその組み合わせにも着目したテストである。
複数の条件があった場合に、それぞれは真にも偽にもなりうるため、特定の組み合わせによってのみ発生する不具合も存在する。
int func(int x, int y) { if (x < 0) x = -x; if (y < 0) y = -x; return x + y; }
この場合は、「x<0」が真か偽、「y<0」も真か偽を取りうるので、4つのテストケースを作り、テストする必要がある。
*HAYST法
*オールペア法、ペアワイズ法
ソフトウェアの機能や仕様に着目したテスト
一般にブラックボックステストと呼ぶ。
同値分析
境界値分析
原因結果グラフ
結合テスト
トップダウンテスト
ボトムアップテスト
プログラム単体ではなく、周辺をも巻き込んだテスト
一般にシステムテストという。
統計的テスト
バグ埋め込み法、捕獲法、再捕獲法
ソフトウェアが内包しているバグの数を推測する為の方法である。
たとえば、10件のバグをわざと埋めておき、テストを行う。
このとき、テストによって、20件のバグが見つかり、わざと埋め込んでおいたバグは5件しか見つからなかったとしよう。
そうすると、テストの品質がわかると同時に、全体の残りバグ数を推測出来る。
この例だと、わざと埋め込んだバグは半分しか見つけられていない。すなわち、わざと埋め込んだものも含めて、
20件のバグが見つかっている物の、全体では40件(うち10件は故意)のバグが存在している可能性がある。
逆に言うと、40件のバグを見つけた段階で、テストに区切りをつける指針となる。
テスト自体が正しい事をテストするためのテスト
- 変異テスト(Mutation testing)