テスト仕様書を作成するにあたり網羅性を高めることが重要だと学んだ。作成するときに意識するポイントは?
テスト仕様書の網羅性を高めることは、ソフトウェアの品質向上に直結します。特に、仕様の抜け漏れを防ぐために、以下の点を意識して作成することが重要です。
網羅性を高めるためにどうしたら良いか、もう少し詳しく教えてほしい。
テスト仕様書を作成する際、正常系(Expected Cases)・異常系(Unexpected Cases)・臨界値(Boundary Cases) を意識することで、より抜け漏れのないテストが可能になります。
ここでは、「製品登録システム」を例にとり、「管理番号」と「製品番号」 の入力項目があるケースを想定して、それぞれの網羅方法を詳しく説明します。
正常な入力値を用いて、期待通りの結果が得られるかを確認する。
No | テスト項目 | 入力値 | 期待される結果 |
---|---|---|---|
1 | 正常登録(最小値) | 管理番号: 1000, 製品番号: A | 正常に登録される |
2 | 正常登録(最大値) | 管理番号: 9999, 製品番号: B | 正常に登録される |
3 | 正常登録(中間値) | 管理番号: 5000, 製品番号: C | 正常に登録される |
4 | 正常登録(特殊文字なし) | 管理番号: 2500, 製品番号: T | 正常に登録される |
5 | 2006年以降の正常値 | 年: 2007, 製品番号: A | 正常に登録される |
✅ ポイント
不正な入力値を用いて、適切にエラー処理されるかを確認する。
No | テスト項目 | 入力値 | 期待される結果 |
---|---|---|---|
6 | 管理番号が空欄 | 管理番号: (空), 製品番号: A | エラーメッセージ表示 |
7 | 製品番号が空欄 | 管理番号: 2000, 製品番号: (空) | エラーメッセージ表示 |
8 | 管理番号が範囲外(999以下) | 管理番号: 999, 製品番号: B | エラーメッセージ表示 |
9 | 管理番号が範囲外(10000以上) | 管理番号: 10000, 製品番号: C | エラーメッセージ表示 |
10 | 製品番号が無効値 | 管理番号: 3000, 製品番号: "X" | エラーメッセージ表示 |
11 | 2006年以前の異常値 | 年: 2005, 製品番号: A | エラーメッセージ表示 |
12 | 半角英数字以外の入力 | 管理番号: 2000, 製品番号: "@" | エラーメッセージ表示 |
✅ ポイント
閾値付近の動作を検証し、バグを防ぐ。
No | テスト項目 | 入力値 | 期待される結果 |
---|---|---|---|
13 | 管理番号の最小境界(OK) | 管理番号: 1000, 製品番号: A | 正常に登録される |
14 | 管理番号の最小境界(NG) | 管理番号: 999, 製品番号: B | エラーメッセージ表示 |
15 | 管理番号の最大境界(OK) | 管理番号: 9999, 製品番号: C | 正常に登録される |
16 | 管理番号の最大境界(NG) | 管理番号: 10000, 製品番号: T | エラーメッセージ表示 |
17 | 2006年境界(OK) | 年: 2006, 製品番号: A | 正常に登録される |
18 | 2006年境界(NG) | 年: 2005, 製品番号: A | エラーメッセージ表示 |
✅ ポイント
テスト仕様書において、入力項目を明確に記述すること は、テストの網羅性と正確性を確保するために非常に重要です。
入力項目が曖昧だと、どの値をテストすべきかが分かりにくくなり、テストケースの抜け漏れが発生する原因 になります。
入力項目を整理することで、テストすべきパターンを明確にできます。
例えば、「製品登録システム」において、以下のような入力項目があるとします。
項目名 | 説明 | 例 |
---|---|---|
管理番号 | 製品を識別する一意の番号(4桁の数字) | 1000, 2500, 9999 |
製品番号 | 製品の種類を表すコード(英大文字1文字) | A, B, C, T |
価格 | 製品の販売価格(整数) | 1000, 2000, 50000 |
各入力項目ごとに、正常値・異常値・境界値を意識してテストケースを設計します。
テスト仕様書では、各入力項目を明確に区別するため、入力項目ごとに列を分ける ことが重要です。
❌ 悪い例(入力項目が曖昧)
No | テスト内容 | 入力値 | 期待される結果 |
---|---|---|---|
1 | 正常な登録 | 1000, A | 正常に登録される |
2 | 異常値(範囲外) | 999, B | エラーメッセージ表示 |
このような表記では、どの入力項目が何の値を指しているのかが分かりにくい です。
✅ 良い例(入力項目を明確に記述)
No | テスト内容 | 管理番号 | 製品番号 | 価格 | 期待される結果 |
---|---|---|---|---|---|
1 | 正常な登録 | 1000 | A | 2000 | 正常に登録される |
2 | 管理番号の範囲外(最小値) | 999 | B | 5000 | エラーメッセージ表示 |
3 | 製品番号の無効値 | 3000 | X | 10000 | エラーメッセージ表示 |
4 | 価格の範囲外(最大値超過) | 5000 | C | 1000000 | エラーメッセージ表示 |
このように入力項目を明確に列分けすると、どのテストケースがどの入力項目を対象としているのかが分かりやすくなります。
入力項目ごとに個別のテストケースを設計するだけでなく、複数の入力項目を組み合わせたテストも重要 です。
例えば、管理番号と製品番号の両方が関係するテストケースを考える場合:
No | 管理番号 | 製品番号 | 期待される結果 |
---|---|---|---|
1 | 空欄 | A | エラーメッセージ表示 |
2 | 2000 | 空欄 | エラーメッセージ表示 |
3 | 999 | A | エラーメッセージ表示 |
4 | 1000 | X | エラーメッセージ表示 |
✅ ポイント
入力項目が明確に記述されていると、仕様変更にも柔軟に対応しやすい です。
例えば、2006年以降に「製品番号 'X' の新しいルールが追加された」とします。
この場合、テスト仕様書の 「製品番号」 に関するテストケースを追加・修正するだけで対応できます。
No | 管理番号 | 製品番号 | 年 | 期待される結果 |
---|---|---|---|---|
1 | 2000 | A | 2005 | 正常に登録される |
2 | 2000 | X | 2005 | エラーメッセージ表示 |
3 | 2000 | X | 2006 | 正常に登録される |
✅ ポイント
テスト仕様書がソースコードと一致しているかを確認するために、入力項目をソースコードのロジックと照らし合わせて整理 する。
例:ソースコード
def validate_product(management_number, product_code, year):
if not (1000 <= management_number <= 9999):
return "管理番号が範囲外です"
if product_code not in ["A", "B", "C", "T"] and year < 2006:
return "無効な製品番号です"
return "登録成功"
この場合、テスト仕様書に「管理番号の範囲チェック」や「製品番号のバリデーション」 を確実に反映する必要があります。
テスト仕様書を作成する際、判断条件(条件分岐)が適切にカバーされているか を確認することは非常に重要です。
特に、IF文・CASE文・ルールベースの分岐が存在する場合、すべてのパターンを網羅するテストケースを作成 しないと、潜在的なバグを見逃す可能性があります。
まず、テスト対象のソースコードや仕様書を確認し、どのような条件分岐があるかを明確にする ことが必要です。
例えば、以下のようなルールがあるとします。
📌 ルール例:製品の割引適用
このようなルールをテストするために、すべての条件をカバーするテストケースを設計する必要があります。
このルールに基づき、考えられるすべての組み合わせを網羅するテストケースを作成します。
No | 購入金額 | 会員ランク | 年 | 割引率 | 期待される結果 |
---|---|---|---|---|---|
1 | 9,999 | 一般 | 2005 | 0% | 割引なし |
2 | 10,000 | 一般 | 2005 | 10% | 10% 割引適用 |
3 | 10,000 | ゴールド | 2005 | 15% | 10% + 5% 割引適用 |
4 | 5,000 | ゴールド | 2005 | 0% | 割引なし |
5 | 20,000 | ゴールド | 2006 | 8% | 一律 8% 割引適用 |
6 | 20,000 | 一般 | 2006 | 8% | 一律 8% 割引適用 |
✅ ポイント
判断条件を考慮したテスト設計を行う際には、以下の手法を活用すると網羅性を高めることができます。
デシジョンテーブルは、複数の条件とその組み合わせを整理し、抜け漏れなくテストケースを作成するための手法 です。
ルール:
No | 在庫あり | 予約可能 | 期待される結果 |
---|---|---|---|
1 | あり | ー | 注文可能 |
2 | なし | あり | 予約注文可能 |
3 | なし | なし | 注文不可 |
✅ ポイント
条件分岐が「数値の範囲」によって決まる場合、境界値をテスト することが重要です。
No | 年齢 | 期待される料金プラン |
---|---|---|
1 | 17 | 子供料金 |
2 | 18 | 大人料金 |
3 | 65 | 大人料金 |
4 | 66 | シニア料金 |
✅ ポイント
条件が複数ある場合、それぞれの組み合わせが適切にテストされているかを確認する。
📌 例:2006年を基準とした判断条件 例えば、システムの仕様が「2006年以降は新しいルールに従う」となっている場合、2025年と2006年の境界テストを忘れない ようにする。
No | 入力年 | ルール適用 |
---|---|---|
1 | 2005 | 旧ルール適用 |
2 | 2006 | 新ルール適用 |
3 | 2007 | 新ルール適用 |
✅ ポイント
テスト仕様書を作成する際には、ソースコードの条件分岐をチェックし、それがすべてテストケースに反映されているかを確認する。
📌 例:Pythonのコード
def discount(price, member, year):
if year >= 2006:
return price * 0.92 # 8% 割引
elif price >= 10000:
return price * (0.9 if member == "一般" else 0.85) # 10% or 15% 割引
return price
📌 必要なテストケース
ソフトウェアのテストでは、入力項目の組み合わせを適切に考慮することが重要です。
組み合わせを十分に考えないと、予期しないバグが発生するリスクがあります。
ここでは、テストケースを効率的に設計し、網羅性を高める方法を解説します。
複数の入力項目がある場合、それぞれの組み合わせを考慮することで、期待通りに動作するか、異常が発生しないかを確認します。
例えば、「製品登録システム」では、以下のような入力項目があるとします。
項目名 | 説明 | 例 |
---|---|---|
管理番号 | 4桁の数字 | 1000, 2000, 9999 |
製品番号 | 1文字の英字(A, B, C, T など) | A, B, C |
価格 | 1000以上の整数 | 1000, 5000, 10000 |
登録年 | システムに登録された年 | 2005, 2006, 2007 |
このように複数の入力値がある場合、適切な組み合わせテストが必要です。
すべての組み合わせをテストする方法です。
網羅性が最も高いですが、組み合わせが多すぎるとテストケースの数が爆発的に増加します。
No | 管理番号 | 製品番号 | 価格 | 登録年 |
---|---|---|---|---|
1 | 1000 | A | 1000 | 2005 |
2 | 1000 | A | 1000 | 2006 |
3 | 1000 | A | 5000 | 2005 |
4 | 1000 | B | 1000 | 2005 |
5 | 2000 | C | 5000 | 2006 |
… | … | … | … | … |
✅ メリット
❌ デメリット
すべての組み合わせをテストするのが難しい場合、「直交表(Orthogonal Array)」 を使って最小限の組み合わせを選ぶ方法があります。
No | 管理番号 | 製品番号 | 価格 | 登録年 |
---|---|---|---|---|
1 | 1000 | A | 1000 | 2005 |
2 | 2000 | B | 5000 | 2006 |
3 | 9999 | C | 10000 | 2007 |
4 | 1000 | B | 5000 | 2007 |
5 | 2000 | C | 1000 | 2005 |
✅ メリット
❌ デメリット
入力値をグループ化し、代表値を選んでテストする方法 です。
クラス | 代表値 |
---|---|
有効な管理番号(1000〜9999) | 1000, 5000, 9999 |
無効な管理番号(範囲外) | 999, 10000 |
No | 管理番号 | 価格 | 期待される結果 |
---|---|---|---|
1 | 999 | 1000 | エラー |
2 | 1000 | 1000 | 正常 |
3 | 9999 | 1000 | 正常 |
4 | 10000 | 1000 | エラー |
✅ ポイント
異常値を組み合わせたケースもテストが重要です。
例えば、「管理番号が正常でも、製品番号が異常な場合」などのケースを考慮します。
No | 管理番号 | 製品番号 | 価格 | 期待される結果 |
---|---|---|---|---|
1 | 1000 | X | 5000 | エラーメッセージ |
2 | 999 | A | 1000 | エラーメッセージ |
3 | 10000 | C | 1000 | エラーメッセージ |
4 | 2000 | B | -1000 | エラーメッセージ |
✅ ポイント
AIをテスト仕様書の作成・改善に活用することで、抜け漏れのチェック、テストケースの自動生成、網羅性の向上 などのメリットが得られます。しかし、AIの結果をそのまま受け入れるのではなく、人間が判断して適切に補正することが重要 です。
ここでは、AIを活用する具体的な方法と、人間がどのように判断すべきか を詳しく解説します。
AIは、以下のようなタスクで特に有効です。
活用領域 | 具体的な活用方法 | メリット |
---|---|---|
テストケースの生成 | 入力値や条件を与えて、AIにテストケースを作成させる | 網羅性を高め、作業の手間を削減 |
網羅性チェック | 既存のテスト仕様書をAIに解析させ、抜け漏れを指摘させる | ヒューマンエラーを防ぐ |
異常系・境界値の提案 | 想定外のケースや境界値をAIに提案させる | 意識しづらいケースを網羅できる |
仕様の矛盾検出 | ソースコードや仕様書のロジックを比較し、矛盾を検出する | 仕様ミスを早期発見 |
自動テストコードの生成 | 仕様書をもとに、テストコードのひな形を作成させる | 効率化 & 自動化 |
✅ ポイント
例えば、製品登録システムのテスト仕様書を作成するときに、AIに以下のようなプロンプトを入力します。
📌 AIに依頼するプロンプト例
「管理番号(1000~9999)、製品番号(A, B, C, T)、価格(1000~10000)、登録年(2025~2027)を考慮した正常系・異常系・境界値のテストケースを作成してください。」
No | 管理番号 | 製品番号 | 価格 | 登録年 | 期待される結果 |
---|---|---|---|---|---|
1 | 1000 | A | 1000 | 2005 | 正常に登録される |
2 | 999 | B | 5000 | 2006 | エラーメッセージ表示 |
3 | 2000 | C | -1000 | 2007 | エラーメッセージ表示 |
4 | 9999 | T | 10000 | 2005 | 正常に登録される |
✅ AIの出力を人間がどう判断するか
AIは万能ではないため、その結果を鵜呑みにせず、人間がレビュー・修正を行う 必要があります。
✅ ポイント
AIと人間の作業をうまく分担することで、テスト仕様書の作成が効率的になります。
作業 | AIが得意な部分 | 人間が判断すべき部分 |
---|---|---|
テストケースの生成 | テストケースのひな形を作成 | ビジネスルールに沿っているか判断 |
異常系の網羅チェック | 一般的な異常ケースを提案 | 仕様に基づく異常ケースを追加 |
組み合わせテストの設計 | 直交表などを使った効率的なテストパターンを生成 | 重要なケースを追加・調整 |
境界値の洗い出し | 境界値の候補をリストアップ | 仕様をもとに本当に必要な境界を選定 |
自動テストコード生成 | テストスクリプトのひな形作成 | 実際の環境で動作するか検証 |
✅ ポイント
✅ このサイクルを回すことで、網羅性の高いテスト仕様書を作成できる。
テスト仕様書の網羅性を高めることは、ソフトウェアの品質向上に直結します。
✅ 網羅性の向上
✅ 入力項目の明確化
✅ 判断条件の考慮
✅ AIの活用と人間の判断
🎯 AIをアシスタントとして活用し、精度の高いテスト仕様書を作成しよう!