スタブとドライバとは?それぞれの違いや必要性、作成方法を解説
システムのほとんどは、他システムとの依存関係にあります。依存関係のあるシステムのテストは、気軽に行えるものではありません。例えば、他システムがすでにリリース済みである場合や、他システムが未完成である場合などです。
このような状況下でも、スタブやドライバを用意することで、他システムがなくともテストを実施することが可能となります。これにより、システムの品質の向上や、プロジェクトの進行速度を上げることが可能になります。
この記事では、図を使ってスタブとドライバの説明をするとともに、その違いや必要性を解説していきます。
目次
1.スタブとドライバとは
スタブとドライバは、ソフトウェアテストにおいて重要な役割を果たすツールです。他にもモックやフェイク、ダミーといったテストダブルが存在しますが、ここでは特にスタブとドライバに焦点を当てます。
1-1.スタブとは
スタブは、テスト対象から呼び出されるシステムの代替として使用されます。未完成またはテスト不可能な依存システムの代わりに、決まった応答を返す簡易な実装を行います。例えば、機能Aが機能Bを呼び出すシステムの場合、機能Bが未完成であれば、機能Bの代わりにスタブを使用します。
1-2.ドライバとは
ドライバは、テスト対象を呼び出すシステムの代替として使用されます。未完成またはテスト不可能な上位システムの代わりに、テスト対象を呼び出す簡易な実装を行います。例えば、機能Aが機能Bを呼び出すシステムの場合、機能Aが未完成であれば、機能Aの代わりにドライバを使用します。
2.スタブとドライバの違い
スタブとドライバは共にテストを補助するツールですが、その役割が異なります。
- スタブ: テスト対象の機能が依存する外部機能を模擬するために使用される。
- ドライバ: テスト対象を呼び出して動作を確認するために使用される。
また、役割の違いから、利用されるテスト戦略が異なります。
- スタブ: トップダウンテスト(システム上位から下位に向けて行うテスト戦略)
- ドライバ: ボトムアップテスト(システム下位から上位に向けて行うテスト戦略)
スタブ | ドライバ | |
役割 | テスト対象の機能が依存する外部機能を模擬すること | テスト対象を呼び出して動作を確認する |
テスト戦略 | トップダウンテスト | ボトムアップテスト |
2-1.スタブの役割
スタブの役割は、テスト対象の機能が依存する外部機能を模擬することです。スタブは、テスト対象の機能が依存する外部機能を模擬することで、テスト対象の機能の動作を独立してテストすることを目的としています。スタブの使用により、外部環境の影響を受けずにテスト対象のコードの動作を確認することが可能となります。スタブを構築する際は、テスト対象に都合の良い返り値を渡す機能を持たせます。
簡単な例をご紹介します。
時間帯に合わせて挨拶をするシステムがあるとします。機能A、機能Bは以下の通りです。
機能A
- 現在時刻を機能Bに渡して呼び出す。
- 機能Bの返答がmorningの時は「おはよう」nightの時は、「こんばんは」と挨拶する。
機能B
- 機能Aから受け取った現在時刻から以下の通り判定し、機能Aに返す。
- 現在時刻が「0:00~11:59」の時はmorning
- 現在時刻が「12:00~23:59」の時はnight
機能Aをテスト対象とし、機能Bをスタブに代替する場合を考えます。
この時、機能Aのテストは以下の通りになります。
- テストケース1:機能Bからの返答がmorningの時は「おはよう」と挨拶する。
- テストケース2:機能Bからの返答がnightの時は、「こんばんは」と挨拶する。
これを確認するためにスタブを構築します。テスト対象に都合の良い返り値を渡すためには、テストケースに合わせて、スタブを作り直す必要があります。
- テストケース1をテストする場合
- スタブには、「機能Aにmorningを返答する。」という機能を実装し構築。
- テストケース2をテストする場合
- スタブには、「機能Aにnightを返答する。」という機能を実装し構築。
例からわかるように、スタブが外部機能を模擬していることがわかると思います。
このように、スタブを使用することで、テスト対象の機能が依存する外部機能を担うことで、テスト対象を独立してテストできます。スタブには、テスト対象のテストケースに合わせて都合の良い返り値を渡すような機能を持たせます。
2-2.ドライバの役割
ドライバの役割は、テストを制御し、テスト対象を呼び出すことです。ドライバは、テストを制御し、テスト対象を呼び出すことで、テストの一貫性と再現性を確保することを目的としています。ドライバの使用により、テストケースの自動実行やテスト結果の収集が可能となります。ドライバを構築する際は、テストの一貫性と再現性を確保できるようにします。また、必要な引数を渡し、返り値を受け取る機能を持たせます。
スタブの時に紹介したものと同じ例を使ってご紹介します。
今回は、機能Bをテスト対象、機能Aをドライバに代替する場合を考えます。
機能Bのテストは以下の通りになります。
- テストケース1:8:00を受け取った場合、**morning**と返答する。
- テストケース2:19:00を受け取った場合、**night**と返答する。
これを確認するために、ドライバを構築します。テストの一貫性と再現性を確保するため、1つのドライバに以下2つの機能を実装します。
- テストケース1をテストするための以下機能
- 機能Bに8:00を渡す。
- **morning**を受け取ったらOKと出力する。
- それ以外が帰ってきたらNGを出力する。
- テストケース2をテストするための以下機能
- 機能Bに19:00を渡す。
- **night**を受け取ったらOKと出力する。
- それ以外が帰ってきたらNGを出力する。
例からわかるように、テストを制御していることがわかるかと思います。
このように、ドライバを使用することで、テストの一貫性と再現性を確保することができます。一つのドライバに、必要な引数を渡し、返り値を受け取る機能を持たせることで、テストケースの自動実行やテスト結果の収集が可能となります。
2-3.トップダウンテストとは
トップダウンテストは、システムの上位レベルの機能からテストを開始し、下位レベルの機能を徐々に統合していくテスト戦略です。この方法では、スタブが頻繁に使用されます。
手順
- 上位機能のテスト: 最上位の機能から始めます。
- スタブの使用: 下位の依存機能はスタブで置き換えます。
- 下位機能の統合: 下位機能を順次実装・統合していきます。
利点
- 早期の統合テスト: 上位の設計とインターフェースが早期にテストされる。
- ユーザー視点の検証: 実際の使用シナリオに近い形でテストが進行する。
2-4.ボトムアップテストとは
ボトムアップテストは、システムの下位レベルの機能からテストを開始し、上位レベルの機能を徐々に統合していくテスト戦略です。この方法では、ドライバが頻繁に使用されます。
手順
- 下位機能のテスト: 最下位の機能から始めます。
- ドライバの使用: 上位の依存機能はドライバでシミュレートします。
- 上位機能の統合: 上位機能を順次実装・統合していきます。
利点
- 単体テストの充実: 各機能がしっかりとテストされる。
- 問題の早期発見: 下位機能で発生する問題が早期に発見・修正される。
3.スタブとドライバの必要性
スタブとドライバは、ソフトウェアテストにおいて非常に重要な役割を果たします。これらのツールを使用することで、コードが予期せぬ動作をする可能性のある外部依存性を排除し、テスト対象のコードが正確に動作することを確認することができます。これは、ソフトウェアの品質を高め、バグや不具合を早期に検出することにつながります。
また、スタブとドライバを使用することで、テストケースを効率的に管理し、一貫したテスト結果を得ることができます。これは、テストプロセスを自動化し、コードの変更を迅速に反映させることが可能となります。
さらに、スタブとドライバの使用は、コードの可読性と保守性を向上させます。スタブとドライバを使用することで、テストコードはより簡潔で理解しやすくなり、新たな開発者やテストエンジニアがプロジェクトに参加したときに、コードの理解と修正を容易にします。
4.さいごに
スタブとドライバは、ソフトウェアテストにおいて非常に重要なツールです。適切に使用することで、テストの効率化やコードの品質向上が図れます。トップダウンテストやボトムアップテストといったテスト戦略を理解し、適切な場面でスタブやドライバを活用することが重要です。テストの一貫性と再現性を確保しながら、システム全体の品質を向上させていきましょう。
コメント