注意書き
個人の学びのメモとしてまとめている側面が大きいため、読み物としてはあまりまとまっていません。
あらかじめご了承ください。
該当の書籍
- 【この1冊でよくわかる】 ソフトウェアテストの教科書 [増補改訂 第2版]
- 布施昌弘:著者 / 江添智之:著者 / 永井努:著者 / 三堀雅也:著者 / 石原一宏:監修 / 堀明広:監修
なぜ読んだのか
- なんとなくソフトウェアのQAに対する解像度が低いような気がしているため、テストに関する体系的な知識を手に入れたい
- 雰囲気でテストを書いていたり書いていなかったりするので、堅牢なソフトウェアを作るための知識を手に入れたい
何を学んだのか
- テストを書く際に、何をテストするべきなのかの勘所
- ソフトウェアを設計する際に検討するべき項目
- 「何をテストするべきか」の項目を知る事が、「設計する際に注意すべきポイント」にもつながる
具体的に得た知識
ソフトウェアの品質とは
ソフトウェアの品質を評価する際の一つの考え方として、以下3点が存在する。
- 当たり前品質
- ユーザーが最低限、ソフトウェアに期待する品質。これが達成されていなければ、製品として販売するべきではない。
- 例えばYouTubeで言うと「動画の視聴ができること」など。
- 一元的品質
- 当たり前品質をMUSTだとした際に、必ずしも満たす必要はないが、満たしていなければユーザーの不満となり得る品質。
- 例えばYouTubeで言うと「動画を視聴する際に、自由に解像度を選べること」など。
- 魅力的品質
- 一元的品質をBESTだとした際に、Betterに位置付けられるもの。実現できなくても仕方なくユーザーの不満にはなり得ないが、実現できればソフトウェアの評価を大きく向上させる品質。
- 例えばYouTubeで言うと、「動画を視聴する際に、クライアントのネットワーク速度から自動的に最適な解像度を選び、配信する」など。
テストの種類と、各テストケースが期待する目的
テストの種類や考え方は多数存在するが、一つの切り口として以下のような考え方ができる。
- 内部の処理に注目するかどうか
- ホワイトボックステスト
- ブラックボックステスト
- 実際にソフトウェアを動作させるかどうか
- 静的テスト
- 動的テスト
- 各開発工程に適したテスト
- 単体テスト
- 結合テスト
- システムテスト
具体的なテスト手法
ホワイトボックステスト
一つの機能やモジュール等の単体テストを行う際に用いる手法。
- 制御フローテスト(命令文の処理順序を確認する)
- データフローテスト(データの流れを確認する)
制御フローテストでは、論理構造(条件分岐)の正しさを図る。そのための手法は幾つか存在するが、もし可能なのであれば全ての条件に対するテストをカバーするのが望ましい。
データフローテストでは、使われていない変数等がないかをテストする。こちらはRubyにおいてはあまり意識する必要がなさそう。
ブラックボックステスト
ブラックボックステストは、主に機能テストとシステムテストにおいて用いる。
内部処理がどのように動いているのかは気にせず、入力や出力が意図した通りに行われているかをテストする。
ブラックボックステストの手法は複数存在するが、以下について記述していく。
- 境界値テスト、同値分割テスト
- デシジョンテーブルテスト
- 状態遷移テスト
境界値テスト、同値分割テスト
仕様の境界となる値に対してテストを行う。例えばユーザー名を入力するフォームがあったとして、
- 数字、英大文字、小文字のみ入力可能
- 5文字以上、15文字以下のみ有効
が仕様だとするならば、以下のように境界値のテストを行う。
- 4文字、16文字の数字、英大文字、小文字を入力して入力がされない事を確認する
- 5文字、15文字の数字、英大文字、小文字を入力して入力される事を確認する
※境界値のテストを行う際は、値の最小単位に注意する。整数なのか少数なのか等。
デシジョンテーブルテスト
デシジョンテーブルテストでは、複数の条件に着目してテストを行う。
複数の条件とは具体的に、複雑な条件分岐の事を指す。
具体的な例として、以下のような仕様をモデルとしてみる。
- 12歳以下は、入場料が600円
- 13歳以上、18歳以下は入場料が900円
- 19歳以上は、入場料が1200円
- 土曜日は入場料が2倍になる(土曜日価格)
- 毎月15日は、年齢を問わず入場料が500円になる(遊園地デー)
このような場合、例えば一例として以下のようなコードが考えられる。
# Ruby
return 500 if 15日
admission_fee = 0
if 12歳
admission_fee = 600
elsif 13歳以上且つ18歳以下
admission_fee = 900
elsif 19歳以上
admission_fee = 1200
end
return admission_fee * 2 if 土曜日
admission_fee
まず、毎月15日は年齢を問わず一律で入場料が500円になるため、土曜日の場合は500円を返却する。
次に、土曜日の場合は入場料が倍になるため、各年齢層の価格に対して2倍の掛け算を行い、その値を返却する。
15日でもなく土曜日でもない場合は、普段の入場料を返却する。
このように、条件が複数存在し、条件によってリターンを変える必要がある場合は、デシジョンテーブルテストが適している。
以下のような表を作成し、組み合わせ毎の抜け漏れを減らす事ができる。
ただし、このデシジョンテーブルは項目が増えるほどテーブルが膨大になっていくため、重複している項目等はうまく消去していく必要がある。
具体的にどのようなテクニックがあるのかは、「ソフトウェアテストの教科書」を参照されたし。
状態遷移テスト
ここは現在学習中のため、理解できたら書く。