2.6.3. ソフトウェアユニットのテストの設計

1. 概要

 ソフトウェア開発において、品質保証は非常に重要な要素です。その中でも、ソフトウェアユニットのテストの設計は、個々のモジュールやコンポーネントが正しく機能することを確認するための非常に重要なステップです。本記事では、ソフトウェアユニットのテストの設計について、その目的、重要性、および主要な概念を解説します。

 ソフトウェアユニットのテストの設計の主な目的は、ソフトウェアユニット機能仕様書で提示された要件を全て満たしているかどうかを確認することです。これを達成するために、テストの範囲、テスト計画、テスト方式を定義し、ソフトウェアユニットのテスト仕様書を作成します。

2. 詳細説明

2.1. テスト要件の定義

 テスト要件とは、ソフトウェアユニットが満たすべき機能や性能の基準を指します。これらの要件は、ソフトウェアユニット機能仕様書から抽出され、テストの基準となります。

2.2. テストの範囲の決定

 テストの範囲を決定する際は、以下の点を考慮します:

  • テスト対象のソフトウェアユニットの機能
  • 入力値の範囲と種類
  • 予想される出力や結果
  • エラー処理や例外処理
flowchart TD
    A[開始] --> B[ソフトウェアユニット
    機能仕様書の確認]
    B --> C[テスト対象の機能の特定]
    C --> D[入力値の範囲と種類の定義]
    D --> E[予想される出力や
    結果の定義]
    E --> F[エラー処理や
    例外処理の考慮]
    F --> G[終了]

    style A fill:#4CAF50,stroke:#000,stroke-width:2px,color:#fff
    style B fill:#FFF176,stroke:#000,stroke-width:2px
    style C fill:#FFF176,stroke:#000,stroke-width:2px
    style D fill:#FFF176,stroke:#000,stroke-width:2px
    style E fill:#FFF176,stroke:#000,stroke-width:2px
    style F fill:#FFF176,stroke:#000,stroke-width:2px
    style G fill:#F44336,stroke:#000,stroke-width:2px,color:#fff

 具体的な範囲設定のフローチャート例

2.3. テスト計画の立案

 テスト計画には、以下の要素が含まれます:

  • テストの目的
  • テスト環境
  • テストデータ
  • テストケースの優先順位
  • テストスケジュール
項目詳細
テスト対象ユーザー認証モジュール
テストの目的ユーザー認証機能の正確性、安全性、パフォーマンスを検証する
テスト環境– テスト用サーバー(OS: Ubuntu 20.04 LTS)
– テストデータベース(MySQL 8.0)
– テストクライアント(Chrome 最新版、Firefox 最新版)
テストデータ– 有効なユーザーアカウント 100件
– 無効なユーザーアカウント 50件
– 特殊文字を含むパスワード 20件
テストケースの優先順位1. 基本的なログイン/ログアウト機能
2. パスワードのハッシュ化とセキュリティ
3. アカウントロックアウト機能
4. パスワードリセット機能
5. 多要素認証(オプション機能)
テストスケジュール– テスト準備期間: 2024/10/15 – 2024/10/20
– テスト実施期間: 2024/10/21 – 2024/11/10
– 結果分析とレポート作成: 2024/11/11 – 2024/11/15
テスト担当者– 主任テスター: 山田太郎
– セキュリティテスト担当: 鈴木花子
– パフォーマンステスト担当: 佐藤次郎
テスト方法– 手動テスト: 基本機能とユーザビリティ
– 自動化テスト: JUnit を使用した単体テストと統合テスト
– セキュリティテスト: OWASP ZAP を使用した脆弱性スキャン
– 負荷テスト: Apache JMeter を使用したパフォーマンステスト
テスト成功基準– すべての重要度の高いバグが修正されていること
– テストカバレッジが 90% 以上であること
– ログイン処理の応答時間が 1 秒以内であること
– セキュリティスキャンで重大な脆弱性が検出されないこと
リスクと対策– リスク: テストデータの漏洩
 対策: テストデータの匿名化と暗号化
– リスク: テスト環境の不安定性
 対策: バックアップ環境の準備と定期的なチェックポイント作成
報告方法– 日次進捗レポート(メール)
– 週次ステータスミーティング
– 最終テストレポート(文書)
ユーザー認証モジュールのテスト計画の例

 この表形式のテスト計画例は、ユーザー認証モジュールのテストに関する主要な情報を簡潔にまとめています。以下、各項目について補足説明いたします:

  1. テスト対象: テストの焦点となるソフトウェアコンポーネントを明確にします。
  2. テストの目的: テストによって達成したい具体的な目標を示します。
  3. テスト環境: テストを実行するためのハードウェアとソフトウェアの構成を詳細に記述します。
  4. テストデータ: テストに使用するデータの種類と量を指定します。
  5. テストケースの優先順位: 重要度と依存関係に基づいてテストケースの順序を決定します。
  6. テストスケジュール: テスト活動の各フェーズの期間を明確に定義します。
  7. テスト担当者: テスト作業に関与する主要な人員とその役割を列挙します。
  8. テスト方法: 実施する具体的なテスト技法と使用するツールを指定します。
  9. テスト成功基準: テストが成功したと判断するための明確な基準を設定します。
  10. リスクと対策: テスト中に発生する可能性のある問題とその対処方法を事前に検討します。
  11. 報告方法: テスト結果と進捗状況を関係者に伝達する方法を定義します。

 このようなテスト計画表を使用することで、テストの目的、範囲、方法、およびリソースが明確になり、効果的かつ効率的なテスト実施が可能となります。また、プロジェクト関係者間でテスト活動に関する共通理解を形成するのに役立ちます。

2.4. テスト方式の選定

 テスト方式には、主に以下の2つがあります:

  1. ブラックボックステスト:ソフトウェアの内部構造を考慮せず、入力と出力のみに着目するテスト方式
  2. ホワイトボックステスト:ソフトウェアの内部構造や実装詳細を考慮してテストを行う方式

 ホワイトボックステストでは、コードの網羅性を確認するため、以下のようなテスト技法が用いられます:

  • 命令網羅
  • 分岐網羅
  • 条件網羅
  • パス網羅
flowchart TD
    A[開始] --> B[命令網羅]
    B --> C{全ての命令を\nカバーしたか?}
    C -->|Yes| D[分岐網羅]
    C -->|No| B
    D --> E{全ての分岐を\nカバーしたか?}
    E -->|Yes| F[条件網羅]
    E -->|No| D
    F --> G{全ての条件の\n真偽をカバーしたか?}
    G -->|Yes| H[パス網羅]
    G -->|No| F
    H --> I{全ての実行可能な\nパスをカバーしたか?}
    I -->|Yes| J[完全網羅]
    I -->|No| H
    J --> K[終了]

    style A fill:#4CAF50,stroke:#000,stroke-width:2px,color:#fff
    style B fill:#FFF176,stroke:#000,stroke-width:2px
    style C fill:#FF7043,stroke:#000,stroke-width:2px
    style D fill:#FFF176,stroke:#000,stroke-width:2px
    style E fill:#FF7043,stroke:#000,stroke-width:2px
    style F fill:#FFF176,stroke:#000,stroke-width:2px
    style G fill:#FF7043,stroke:#000,stroke-width:2px
    style H fill:#FFF176,stroke:#000,stroke-width:2px
    style I fill:#FF7043,stroke:#000,stroke-width:2px
    style J fill:#4CAF50,stroke:#000,stroke-width:2px
    style K fill:#F44336,stroke:#000,stroke-width:2px,color:#fff

 このフローチャートは、ホワイトボックステストの主要な網羅基準を段階的に示しています。以下、各ステップについて説明いたします:

  1. 命令網羅:
    • プログラム内のすべての命令(ステートメント)を少なくとも1回は実行するテスト方式です。
    • 基本的な網羅性の基準であり、最低限のテスト網羅性を確保します。
  2. 分岐網羅:
    • プログラム内のすべての分岐(条件分岐)の真偽両方のケースを少なくとも1回は実行するテスト方式です。
    • 命令網羅よりも厳密な基準で、条件文の両方の分岐をテストします。
  3. 条件網羅:
    • 複合条件文において、各条件の真偽のすべての組み合わせをテストする方式です。
    • 分岐網羅よりも詳細に条件をテストし、より多くのケースをカバーします。
  4. パス網羅:
    • プログラム内のすべての可能な実行パスを少なくとも1回は実行するテスト方式です。
    • 最も厳密な基準ですが、実際にはループなどにより無限のパスが存在する場合があるため、完全な実施は困難な場合があります。
  5. 完全網羅:
    • すべての網羅基準を満たした理想的な状態を示します。
    • 実際のプロジェクトでは、リソースや時間の制約により、完全網羅を達成することは稀です。

 このフローチャートは、網羅性の段階を視覚的に示すことで、テスト設計者がどの程度の網羅性を目指すべきかを判断する際の指針となります。プロジェクトの重要度、リソース、時間制約などを考慮しながら、適切な網羅性レベルを選択することが重要です。

 また、このフローチャートは、テストの進捗状況を把握するためのチェックリストとしても活用できます。各段階でのテストケースの作成と実行状況を確認しながら、網羅性を高めていくことができます。

 ブラックボックステストは外部仕様に基づいて行い、ホワイトボックステストは内部ロジックの網羅性を確認するために使用します。実際には、これらの手法を組み合わせて使うことが一般的です。

2.5. テスト仕様書の作成

 テスト仕様書には、以下の情報を含めます:

  • テストケース ID
  • テストの目的
  • 前提条件
  • テスト手順
  • 入力データ
  • 期待される結果
  • 実際の結果(テスト実行後に記入)
  • 合否判定基準
テストケース ID テストの目的 前提条件 テスト手順 入力データ 期待される結果 実際の結果 合否判定基準
LOGIN-001 有効なクレデンシャルでのログイン成功を確認 ユーザーアカウントが存在する
システムがログイン画面を表示している
1. ユーザー名を入力
2. パスワードを入力
3. 「ログイン」ボタンをクリック
ユーザー名: user001
パスワード: validPass123!
ログインが成功する
ユーザーダッシュボードが表示される
ウェルカムメッセージが表示される
ログイン処理が3秒以内に完了すること
セッションが正しく作成されていること
LOGIN-002 無効なユーザー名でのログイン失敗を確認 システムがログイン画面を表示している 1. 存在しないユーザー名を入力
2. 任意のパスワードを入力
3. 「ログイン」ボタンをクリック
ユーザー名: invaliduser
パスワード: anyPassword123
ログインが失敗する
エラーメッセージ「ユーザー名またはパスワードが正しくありません」が表示される
ログイン画面にとどまる
エラーメッセージが明確に表示されること
パスワードフィールドがクリアされること
LOGIN-003 パスワード入力を間違えた場合のログイン失敗を確認 ユーザーアカウントが存在する
システムがログイン画面を表示している
1. 有効なユーザー名を入力
2. 間違ったパスワードを入力
3. 「ログイン」ボタンをクリック
ユーザー名: user001
パスワード: wrongPass123!
ログインが失敗する
エラーメッセージ「ユーザー名またはパスワードが正しくありません」が表示される
ログイン画面にとどまる
エラーメッセージが明確に表示されること
パスワードフィールドがクリアされること
LOGIN-004 空のフィールドでのログイン試行を確認 システムがログイン画面を表示している 1. ユーザー名フィールドを空のままにする
2. パスワードフィールドを空のままにする
3. 「ログイン」ボタンをクリック
ユーザー名: (空)
パスワード: (空)
ログインが実行されない
「ユーザー名を入力してください」と「パスワードを入力してください」のエラーメッセージが表示される
両方のエラーメッセージが明確に表示されること
ログインボタンが無効化されていないこと
LOGIN-005 パスワード5回連続誤入力時のアカウントロックを確認 ユーザーアカウントが存在する
システムがログイン画面を表示している
1. 有効なユーザー名を入力
2. 間違ったパスワードを入力
3. 「ログイン」ボタンをクリック
4. 手順2-3を4回繰り返す(合計5回)
ユーザー名: user001
パスワード: wrongPass1
wrongPass2
wrongPass3
wrongPass4
wrongPass5
5回目の失敗後、アカウントがロックされる
「アカウントがロックされました。管理者に連絡してください」というメッセージが表示される
アカウントがロックされ、正しいパスワードでもログインできないこと
ロックアウトの期間が設定通りであること(例:30分)

 このテスト仕様書のサンプルについて、各項目の説明を以下に記します:

  1. テストケース ID: 各テストケースを一意に識別する ID です。
  2. テストの目的: そのテストケースで何を検証したいのかを明確に記述します。
  3. 前提条件: テストを実行するために必要な初期状態や環境設定を記述します。
  4. テスト手順: テストを実行するための具体的な手順を順序立てて記述します。
  5. 入力データ: テストで使用する具体的な入力値を記述します。
  6. 期待される結果: テストが成功した場合に期待される動作や出力を詳細に記述します。
  7. 実際の結果: テスト実行時に実際に観察された結果を記入するための列です。テスト実行前は空欄です。
  8. 合否判定基準: テストの成功/失敗を判断するための具体的な基準を記述します。

 このようなテスト仕様書を作成することで、以下のメリットがあります:

  • テストの目的と範囲が明確になります。
  • テスト担当者間で一貫性のあるテストが可能になります。
  • テストの再現性が高まり、バグの発見と修正が容易になります。
  • テスト結果の評価基準が明確になり、品質管理が容易になります。
  • テスト漏れを防ぎ、ソフトウェアの品質向上に貢献します。

 実際のプロジェクトでは、このサンプルをベースにして、テスト対象のソフトウェアの特性や要件に応じてカスタマイズし、より詳細で包括的なテスト仕様書を作成することが推奨されます。

2.6. チェックリストの活用

 テストの漏れを防ぐために、チェックリストを作成し活用することが効果的です。チェックリストには、テストすべき項目や確認ポイントを列挙し、各項目のテスト状況を記録します。

3. 応用例

 ソフトウェアユニットのテストの設計は、様々な業界で重要な役割を果たしています。以下に、いくつかの応用例を示します:

  1. 金融システム:取引処理や計算ロジックの正確性を確認するためのユニットテスト設計
  2. 医療機器ソフトウェア:患者データの処理や診断支援機能の信頼性を検証するためのテスト設計
  3. 自動車制御システム:エンジン制御やブレーキシステムの安全性を確保するためのユニットテスト設計
  4. Webアプリケーション:ユーザー認証やデータ処理機能の品質を確保するためのテスト設計(例:無効なユーザー名とパスワードを入力した際、エラーメッセージが正しく表示されるかどうか)

4. 例題

例題1

問題:ある関数が与えられた整数の階乗を計算するとします。この関数に対するテストケースを3つ設計してください。テストケースには、入力値、期待される出力、およびテストの目的を含めてください。

回答例:

  1. 入力値:5、期待される出力:120、テストの目的:正の整数に対する正常動作の確認
  2. 入力値:0、期待される出力:1、テストの目的:境界値(0の階乗は1)の確認
  3. 入力値:-1、期待される出力:ValueError(例外)、テストの目的:不正入力(負の整数)に対するエラー処理の確認

例題2

問題:ホワイトボックステストの一種である分岐網羅について説明し、以下のコードに対する分岐網羅のためのテストケースを設計してください。

def classify_triangle(a, b, c):
    if a == b == c:
        return "正三角形"
    elif a == b or b == c or a == c:
        return "二等辺三角形"
    else:
        return "不等辺三角形"

回答例:
分岐網羅とは、プログラム内のすべての分岐(条件分岐)を少なくとも一度は実行するようにテストケースを設計する手法です。

このコードに対する分岐網羅のためのテストケースは以下のようになります:

  1. 入力:(5, 5, 5)、期待される出力:”正三角形”、目的:最初のif文の条件を真にする
  2. 入力:(4, 4, 3)、期待される出力:”二等辺三角形”、目的:2番目のelif文の条件を真にする(a == b)
  3. 入力:(3, 4, 5)、期待される出力:”不等辺三角形”、目的:else文を実行する

 これらのテストケースにより、コード内のすべての分岐が少なくとも一度は実行されることが保証されます。

5. まとめ

 ソフトウェアユニットのテストの設計は、品質の高いソフトウェア開発において不可欠なプロセスです。主要なポイントは以下の通りです:

  1. テスト要件の明確化
  2. テストの範囲、計画、方式の適切な定義
  3. 詳細なテスト仕様書の作成
  4. ブラックボックステストとホワイトボックステストの適切な使い分け
  5. チェックリストの活用によるテストの網羅性確保

 これらの要素を適切に組み合わせることで、ソフトウェアユニットが機能仕様書の要件を満たしていることを効果的に検証できます。