Software Design 202402
テストの設計
分析
テストは 4 つの段階からなる。
- 分析 / 何をテストするか決める
- 設計 / それをどのようにテストするか決める
- 実装 / テスト実行に必要なものを準備する
- 実行 / テストスイートを実行する
テストの分析とは妥当性確認のことで、仮に要件として明文化されていなかったとしても、ステークホルダーのニーズを満たしているのかどうかを考えることを指す。例えば「パスワードの文字列長が妥当であるか」など、高い抽象度で作成する。実装が始まっていない早い段階から取り組める。
一方で、プロジェクトが進行し、具体的な要件や機能が明確になると、検証のフェーズに移行する。この段階では、既に定義された要件が満たされているかどうかを確認する。テスト設計のフェーズで行われる作業である。「パスワードが 4 文字以上であるかどうか」といった抽象度の低いテストとして作成する。
早い段階でテストの考えを注入することをシフトレフトテストという。より早い段階で誤りに気がつくことができれば、コストを指数関数的に下げることができる。
設計
テスト技法には大きく 3 つの種類がある。
- ブラックボックステスト
- ホワイトボックステスト
- 経験ベースのテスト
ブラックボックステスト
同値分割法とは、結果的に同じ振る舞いをするはずの入力値 をグループ化し、そのグループの中から 1 つずつ任意の値を選んでテストする手法である。このグループのことを同値パーテーションと呼ぶ。有効な値だけでなく無効な値も含めてテストすることが重要。
境界値分析とは、同値分割法の拡張版であり、境界値周辺をより詳細にテストする方法である。境界値ごとに 2 つもしくは 3 つのテストケースを作成するため、同値分割法よりもテストケースは増える。
デシジョンテーブルテストとは、複数の条件とその結果を表にまとめ、その表からテストケースを作成する方法である。テーブルは条件記述分、動作記述分、条件指定部、動作指定部の 4 つの部分から構成される。条件記述部にはY/N/-(動作に影響しない)
などを書く。各列がテストケースとなる。
1 | 2 | 3 | 4 | |
---|---|---|---|---|
🟢 条件 | ||||
メールアドレスが正しい | Y | N | - | N |
パスワードが正しい | Y | - | N | N |
🟢 動作 | ||||
ホーム画面に遷移する | X | |||
エラーを表示する | X | X | ||
怒る | X |
状態遷移テストとは、システムの状態遷移をテストする手法である。状態遷移図を作成し、その図からテストケースを作成する。有効な遷移だけをテストするパターン、無効な遷移を含めてテストするパターン、間に N 個の状態を経由する全ての遷移をテストするパターンの 3 つのパターンがあり、要件に応じて選択する。
ペアワイズテストとは、複数の入力値の組み合わせをテストする手法である。全ての組み合わせをテストすると膨大な数のテストケースが必要になる場合に最適。
ホワイトボックステスト
ステートメントテストとは、プログラムの各ステートメントを 1 回以上実行するテストケースを作成する手法である。ステートメントを網羅したとしても、全てのケースを網羅しているとは限らないので注意。
ブランチテストとは、プログラムの分岐を網羅するテストケースを作成する手法である。分岐を網羅するためには、真と偽の両方のケースをテストする必要がある。全てのケースをカバーできる。
経験ベースのテスト
エラー推測とは、過去の経験からエラーが発生しそうな箇所を推測し、テストケースを作成する手法である。
探索的テストとは、テストケースを事前に作成せず、実際にシステムを操作しながら知見を深め、次のテストケースを作成していく手法である。
チェ ックリストベースドテストとは、チェックリストに掲げた項目をカバーするようにテストケースを作成する方法のこと。チェックリストは、経験、標準または知識に基づいて作成される。
探索的テスト
探索的テストとは、学習、テスト設計、テスト実行を同時に行うことである。仕様を見るだけでは洗い出しきれない、テストすべき弱点を見つけることに向いている。テストの技法というよりは、テストのアプローチ・進め方の一つである。
対義語は記述式テストである。記述式テストは、事前にテストケースを作成し、それに従ってテストを実行すること。
探索的テストを行うには、以下の知識を持っていることが前提となる。
- 基本的なテスト技法が既に自在に使えること
- 参考になるソフトウェアの仕様を把握していること
- e.g. 同じソフトウェアの似たようなほかの部分の仕様
- e.g. デファクトとされている他社ソフトでの仕様
- ドメイン知識を持っていること
- 過去に発生したバグを知っていること
進め方
まずは情報を収集する。対象の機能が何を解決しようとしているのか、開発者として不安なところがあるか、起きてほしくないことは何か、など。