目的
様々なテスト技法を知り、実際のテストケースの作成に役立てる
対象読者
体系的なテスト技法の学習をしたことのないエンジニア
1章 点に注意を向ける
ピンポイントテスト
ここでは、あるプログラムに対してピンポイントでバグを狙い撃つピンポイントテストと呼ばれる手法が紹介されている。
例えばnの階乗を行うプログラムについてピンポイントテストを考えてみる。
ピンポイントでバグを狙い撃てそうなnとしては「小数,0,巨大数」などが考えられる。また、階乗計算なのでnが巨大数の場合は時間がかかることも予想される。
こうしたケースをピンポイントに狙っていくのがピンポイントテストである。
バグを狙い撃つには
ただ、数値nなど仕様に含まれている怪しい箇所は分かっても何が怪しいのかが分からないケースもあるかもしれない。
そういう時はnが「1,5,100」などの具体的な例を挙げてみることが有効。その上で「間、対照、類推、外側」を考えてみると良い。
例えば例に出した1と5の間には1.5(小数!)がある。そして5の対照を考えてみると-5や1/5(負数や分数!)がある。あるいは100の類推から0が出てくるかもしれない。そして数値の外側を考えてみるとnumericな文字列("3"とか)を考えることもできる。
意地悪テスト
意地悪条件を探して行うテスト。
ソフトウェアが大変な計算をしなければならなくなる入力や異常値・特異値(=意地悪条件)を考えて行う。
異常値
ソフトウェアの入力可能範囲を超えた値のこと
特異値
0などの特別な処理が行われる値のこと
そして意地悪条件は類推から過去の経験を思い出して見つけることもできる。
例えば階乗計算で言えば「巨大数、メモリを少なくする」とか。
探索的テスト
経験上怪しそうなところを重点的に探索して掘り下げてテストしていく技法。つまりテストにおいて経験は偉大。
2章 線を意識する
同値分割法
入力される可能性のある値をグルーピングして、それぞれのグループから代表値を選んでそれだけをテストする技法。有効な値のグループを「有効同値パーティション」、無効な値のグループを「無効同値パーティション」と呼ぶ。あるいは単に各グループのことを「同値パーティション」とも呼ぶ。
境界値分析
言わずと知れた境界付近の値を集中的に狙う技法。例えば模試の偏差値が60以上で合格で偏差値が0.1刻みと仮定すると、この場合テストすべきなのは60.1,60.0,59.9の3つとなる。
tips1
境界値分析をする際には簡単そうに思えても必ず直線を描いて、どの値が境界値なのかを視覚的に確認しながら行うこと。
tips2
パスワードのような文字列では使える文字種が決まっていることが多い。
使用された文字種が妥当かどうかチェックするテストでは文字コードを同値分割し境界値分析することができる。
tips3
同値分割・境界値分析の適用範囲はtips2の文字列の他にも日付と時刻など幅広い。線には型があると知ること。
tips4
正常ケースは1度で確認できるが異常ケースは1度で1つしか確認できない。 異常値に引っかかった場合、その異常をテストはアサートするがそれ以上先のプログラムの部分についてはテストは言及できないから。
技法に囚われるな
同値分割法や境界値分析はあくまで手法であって、本来の目的は無限にあるテストケースからバグの検出に有効なケースを抽出し現実的にテストできる分量まで減らすことである。例えば文字列のテストで空文字や改行などの制御コードが入ってきた場合が気になったら別途テストケースを追加すべきである。
3章 面で逃がさない
tl;dr
テスト対象の次元が増えたら表を描け
ドメイン分析テスト
テストの次元(変数)が増えてきた時にいかにして異常系を確認していくか、というお話。
既に出ているように 「正常系は同時に複数確認できるが異常系は1つずつしか確認できない」 ので、着目する1つの変数だけを動かし残りの変数を固定にしておくというのが基本。
クラシフィケーションツリー
デシジョンテーブル
論理値の組み合わせに対して使える。テストケースが多くなってきたら、適宜テストケースをまとめて簡単化することも忘れずに。
CFD
Cause Flow Diagramの略。プログラムの流れ図をノードと矢印で表して、そこからデシジョンテーブルを作成する。
流れ図を書く際にはノードを集合として描くことで、補集合への意識を持たせること。
CFDが描けたら流れを1つ1つ辿ってデシジョンテーブルを作成すれば良い。