3.8.4. テストの手法

1. 概要

 ソフトウェア開発において、品質保証は非常に重要な工程です。その中でも、ソフトウェアユニットのテストは、個々のモジュールやコンポーネントの正確性を確認する重要なステップです。テストデータの作成方法を理解することは、効果的かつ効率的なテスト実施のために不可欠です。本記事では、主にブラックボックス法とホワイトボックス法によるテストデータ作成方法について解説します。

2. 詳細説明

2.1. ブラックボックス法

 ブラックボックス法は、ソフトウェアの内部構造や実装詳細を考慮せず、仕様書や要求定義書に基づいてテストを行う手法です。内部構造を知らなくてもテストが可能であり、ユーザー視点でのテストが可能です。主な手法として以下があります:

2.1.1. 同値分析法

 入力データを等価なクラスに分割し、各クラスから代表値を選んでテストする方法です。例えば、入力範囲が1〜100である場合、1〜50と51〜100の2つのクラスに分け、各クラスから代表値をテストデータとして使用します。

2.1.2. 限界値分析法

 同値クラスの境界値や極端な値をテストデータとして使用する方法です。境界値付近での動作を確認することで、エラーを検出しやすくなります。

2.1.3. 原因結果グラフ法

 入力条件(原因)と出力結果(結果)の関係をグラフで表現し、テストケースを導出する方法です。複雑な条件が絡む場合に効果的です。

図1: 原因結果グラフの例

 この図は、ログイン機能の簡単な原因結果グラフを表しています。3つの入力条件(ユーザー名正確、パスワード正確、アカウント有効)が全て満たされた場合にのみ、ログイン成功という結果が得られることを示しています。

 この図を使用することで、テスト設計者は以下のようなテストケースを考えることができます:

  1. 全ての条件が真の場合(ログイン成功)
  2. ユーザー名が不正確な場合(ログイン失敗)
  3. パスワードが不正確な場合(ログイン失敗)
  4. アカウントが無効な場合(ログイン失敗)
  5. 複数の条件が偽の場合(ログイン失敗)

 この原因結果グラフを使用することで、テスト設計者はシステムの動作を論理的に把握し、効果的なテストケースを作成することができます。

2.1.4. エラー埋込法

 意図的にエラーを埋め込み、それらが検出されるかを確認する方法です。エラー検出能力を高めるために使用します。

2.1.5. 実験計画法

 統計的手法を用いて、効率的にテストケースを設計する方法です。多くのパラメータが関わる場合に有効です。

2.2. ホワイトボックス法

 ホワイトボックス法は、プログラムの内部構造や論理的な流れを考慮してテストを行う手法です。内部ロジックの正確さを確認するために使用され、プログラム全体の理解が求められます。主な手法として以下があります:

2.2.1. 命令網羅

 プログラム内のすべての命令が少なくとも1回は実行されるようにテストする方法です。

2.2.2. 条件網羅

 各条件式のすべての可能な結果が少なくとも1回は評価されるようにテストする方法です。

2.2.3. 判定条件網羅(Decision Coverage)

 各分岐の真偽両方の結果が少なくとも1回は評価されるようにテストする方法です。

graph TD
    A[開始] --> B{x > 0 ?}
    B -->|Yes| C[処理A]
    B -->|No| D[処理B]
    C --> E[終了]
    D --> E
テストケース 入力値 条件 期待される結果
ケース1 x = 5 x > 0 が真 処理A が実行される
ケース2 x = -3 x > 0 が偽 処理B が実行される

図2: 判定条件網羅の例

2.2.4. 複数条件網羅(Multiple Condition Coverage)

 条件式に含まれる個々の条件のすべての組み合わせをテストする方法です。より詳細なテストが可能になります。

2.2.5. 経路組合せ網羅

 プログラム内のすべての可能な経路の組み合わせをテストする方法です。複雑なフローを持つプログラムで有効です。

2.3. メトリクス計測とカバレージ

 テストの網羅性を評価するために、メトリクス計測が行われます。カバレージ(網羅率)は、テストの品質を測る重要な指標です。例えば、命令網羅率や条件網羅率があります。命令網羅率が80%の場合、20%のコードが未実行であることを意味し、追加のテストケースが必要となる可能性があります。

3. 応用例

 実際の開発現場では、ブラックボックス法とホワイトボックス法を組み合わせて使用することが一般的です。それぞれの手法の特徴を活かし、品質の高いテストを実施できます。

  1. Web アプリケーション開発
  • ブラックボックス法:ユーザー入力の検証(同値分析法、限界値分析法)
  • ホワイトボックス法:セキュリティチェックの網羅性確認(条件網羅)
  1. 組み込みシステム開発
  • ブラックボックス法:センサー入力値の処理(原因結果グラフ法)
  • ホワイトボックス法:割り込み処理の検証(経路組合せ網羅)
  1. ライブラリ開発
  • ブラックボックス法:API の仕様適合性確認(エラー埋込法)
  • ホワイトボックス法:内部ロジックの検証(複数条件網羅)

4. 例題

例題1

 以下の関数に対するテストケースを、ブラックボックス法(限界値分析法)とホワイトボックス法(条件網羅)を用いて作成してください。

def grade_calculator(score):
    if 0 <= score <= 100:
        if score >= 90:
            return "A"
        elif score >= 80:
            return "B"
        elif score >= 70:
            return "C"
        elif score >= 60:
            return "D"
        else:
            return "F"
    else:
        return "Invalid score"

回答例:

  • ブラックボックス法(限界値分析法)
  • score = -1 (下限境界外)
  • score = 0 (下限境界)
  • score = 59 (F と D の境界)
  • score = 60 (D の下限)
  • score = 70 (C の下限)
  • score = 80 (B の下限)
  • score = 90 (A の下限)
  • score = 100 (上限境界)
  • score = 101 (上限境界外)
  • ホワイトボックス法(条件網羅)
  • score = 50 (0 <= score <= 100 が真、他のすべての条件が偽)
  • score = 65 (score >= 60 が真、他の条件が偽)
  • score = 75 (score >= 70 が真、他の条件が偽)
  • score = 85 (score >= 80 が真、他の条件が偽)
  • score = 95 (score >= 90 が真、他の条件が偽)
  • score = -10 (0 <= score <= 100 が偽)

例題2

 次のプログラムに対して、判定条件網羅(Decision Coverage)を満たすテストケースを作成してください。

def check_login(username, password):
    if len(username) >= 4 and len(password) >= 8:
        if username == "admin" and password == "secret123":
            return "Login successful"
        else:
            return "Invalid credentials"
    else:
        return "Username or password too short"

回答例:

  • 判定条件網羅(Decision Coverage)を満たすテストケース
  1. username = “ad”, password = “1234567”(最初の if 文が偽になるケース)
  2. username = “user”, password = “password123″(最初の if 文が真、2番目の if 文が偽になるケース)
  3. username = “admin”, password = “secret123″(両方の if 文が真になるケース)
テストケース username password 条件 期待される結果
ケース1 “ad” “1234567” 最初のif文が偽 “Username or password too short”
ケース2 “user” “password123” 最初のif文が真、2番目のif文が偽 “Invalid credentials”
ケース3 “admin” “secret123” 両方のif文が真 “Login successful”

表1: 判定条件網羅のテストケース一覧

5. まとめ

 ソフトウェアユニットのテストにおいて、ブラックボックス法とホ

ワイトボックス法は相補的な役割を果たします。ブラックボックス法は外部仕様に基づいたテストを、ホワイトボックス法は内部構造に基づいたテストを可能にします。

 効果的なテストのためには、以下の点に注意が必要です:

  1. テスト手法の適切な選択と組み合わせ
  2. テストケースの網羅性の確保(すべての条件や分岐をカバー)
  3. メトリクス計測によるテストの品質評価(例: カバレージの測定)