単体テストと結合テスト比較!技術的な違いからメリット・デメリットまで解説します。
システム開発で重要なのがテストです。システムの納品に至るまでには、ユーザーが望む機能が果たされていることや、エラーになってもシステムが止まらない作りになっているかを慎重にテストする必要があります。今回は、テストの中でも「単体テスト」と「結合テスト」について、技術的な違いやメリットとデメリットを交えてかいせつします。
目次
単体テストとは
モジュールの動作テスト
ITシステムは、数々のプログラムの塊が集合することによって実現されています。ひとつひとつのモジュール(プログラムの部品)がしっかりと機能することで、システムとして成り立つのです。
自動車に例えるなら、ドアやタイヤなどの各パーツです。これらパーツのサイズや形が設計と違っていれば、組み立てても乗れない自動車になってしまいます。
システムも同じで、これらのモジュールひとつひとつに欠陥があれば、システムは動かない、あるいは誤動作を起こしてしまいます。
システムのモジュールに関しても、結合する前にモジュール単体でのテストを行います。ひとつひとつをしっかりとテストしておくことで、工程の手戻りを無くすことができるのです。
結合テストとは
モジュールを合わせた機能テスト
結合テストではモジュール単体でのテストをクリアしたモジュールと、その他外部モジュールを結合した状態でテストを行います。
自動車に例えると、本体やドア、タイヤといった部品をそれぞれ繫ぎ合わせ、設計通りにドアが開くのか、タイヤが連動して回るのか、それぞれに歪みがないかなどのテストです。
システムにおける結合テストも、モジュールを連携させた場合に、設計通り動くのか、あるいは想定外のオペレーションでのエラーでも、システムが止まることがないか(エラー処理や例外処理が入っているか)などをテストします。
結合テストを行うことで、ユーザーの業務に耐え得るシステムであることを確認します。
システムテストとは
システムテストはいくつかのモジュールを組み合わせて行う結合テストよりも、大きな単位で不具合がないかを検証します。
例えば、システムとして外部のAPIを利用する場合は、APIの動作も含めてテストする場合が多いです。また、画面遷移のレスポンスなど、性能面でのテストもここで実施されることがあります。
クライアントからの要求に基づいた、品質特性をテストしていくイメージを持つとわかりやすいでしょう。
ただし、会社ごとにシステム開発の標準が異なりますので、場合によってはシステムテストの意味に違いが出ます。
例えば、システムテストが結合テストの意味で使われることもありますし、そもそもシステムテストという用語が使われないこともあるでしょう。
テストに関わる場合は、プロジェクト共通の開発標準を確認し、テストの定義や分類を理解しておく必要があります。
総合テストとは
総合テストはシステムテストよりも大きな単位で、かつより本番を想定したテストです。
個々のプログラムやモジュールの動作よりも、システムが実現すべき機能要件に沿っているかが重要なポイントになります。
総合テストも呼び方に揺らぎがあります。システムのユーザーがテストの主体となる場合はユーザーテスト、リリース後の運用までをテストする場合は運用テストと呼ばれます。
テストの手法
ここではシステム開発における、テストの手法について説明します。一口にテストといってもその種類は様々です。ここでは代表的な手法である、「ブラックボックステスト」と「ホワイトボックステスト」について紹介します。
ブラックボックステストとは
ブラックボックステストは、システムが仕様通り動くかのみを確認するテストです。内部のプログラムの動作や情報の流れは考慮しないためにブラックボックスと呼ばれています。
所定の入力情報に対して正しい出力結果が出るかどうかを重視するため、ユーザー視点でのテストといえるでしょう。
また、全体を網羅してテストする場合に比べ、テスト工数を削減することができます。
ホワイトボックステストとは
ホワイトボックステストは、システムの動作を網羅的に検証するテストです。
例えば、定義されていない数値や文字を入力した場合の出力結果など、あらゆるケースを想定して実施されます。
ホワイトボックステストのテスト計画やテスト項目は、システム設計者の意図に準じて作成されますので、現場の開発者視点でのテストといえます。
一つの一つのプログラムに対して入念に検証できる反面、ブラックボックステストに比べてテスト工数が増えます。
テストにも仕様書が必要
テストにも「テスト仕様書」が必要です。それは、テストパターンやその意味、テスト結果や原因までを記録していきます。
テストパターンでは、パターンに漏れがないように、全てのパターンを洗い出します。そして、パターンごとの結果も全て示しておく必要があります。
パターンについては、全てを網羅する必要があり、パターン漏れは許されません。ですので、ほとんどの場合マトリクスの表を作成します。
テスト仕様書は、ほとんどの場合作り手以外の人が読むことになります。他人が読み、実行することを意識して、読みやすく分かりやすいフォーマットと表現にしなければなりません。
テスト仕様書は、システムのテストが終了した後にも利用されるものです。何かしらの不具合が生じた時に、テスト仕様書を見ながら“問題のパターン”がテスト時点でどのような結果だったのか、また、どのようなアプローチでテストされたのかを確認し、根源を洗い出します。
単体テストや結合テストなどのテスト工程において、最も重要なモノがテスト仕様書なのです。
単体テストと結合テストの技術的な違い
単体テストではモジュールのプログラム把握が必要
単体テストで必要とされる技術は、その機能に特化した動作を把握していることと、動作するプログラムを熟知していることです。
単体テストでは、システムで使われる機能が細分化されたモジュールが完璧に機能していることを確認しなくてはなりません。
変数に入るべき値や、考え得る例外処理に至るまで、あらゆる角度からモジュールの機能をテストしますので、そのモジュールがどのように使われるのかを把握しておかなければなりません。
結合テストはモジュールを繋げた時の全体の把握が必要
単体テストを終えたモジュールを組み合わせた状態でテストを行います。この時必要な技術は、システムの全体的なデータの流れの把握です。
モジュール同士が繋がっているということは、システムに必要な機能は揃っているということで、ユーザーが行うオペレーションに近い動作で検証します。
モジュール単体では完璧に動くものでも、それらを結合すると不具合が起きる可能性があります。それはデータの受け渡しや、予期しないオペレーションによる例外処理などです。
また、結合テストでは、システムのセキュリティに及ぶまでを考慮してテストをする場合もあります。ですので、その業務に必要な技術の全てを把握しておくことも大切なのです。
単体テストを行うメリットとデメリット
メリット
- バグといった問題点の特定が容易
- モジュールごとにより適切にテストできる
単体テストを行う目的は、バグの無い完璧なモジュールを完成させるためです。そして単体テスト工程を行うことで、モジュールをしっかりとテストできるメリットがあります。単体テストが終わったモジュールの信頼性は高くなければなりません。
信頼性の高いモジュールを組み合わせることで、システムが機能するのです。結合テストにおいて、単体テストの信頼性はなくてはならないものなのです。
デメリット
- コストがかかる
- 作業量が増えてより時間と人員が必要に
テストというイメージから、誰でもできてすぐに終わるという意識を持っている人が少なくありません。
しかし、単体テストでは、しっかりとシステムを把握しておかなければなりませんし、そもそも単体テストは非常にコストがかかるのです。
テスト仕様書やテストケースの作成でも工数がかかりますし、実際の単体テスト中にバグが見つかれば、その調査と改修を行わなければならないからです。
単体テストを見積もる際には、コーディングよりも大きなコストがかかることを意識しておかなければなりません。
結合テストを行うメリットとデメリット
メリット
- システムの品質向上
- モジュールの連携部分に弱いという単体テスト弱点を補う
単体テストで信頼性のあるモジュールを結合しテストを行います。単体テストをクリアしたモジュールも、結合テストの段階で機能的な不具合や仕様バグが見つかることも少なくないのです。
結合テストで出た不具合は、最悪の場合モジュールの改修という手戻りを起こしますが、結合テストでモジュールバグや仕様バグといった致命的な不具合を洗い出すことが大切なのです。結合テスト経たシステムは、より品質を高めたシステムとなります。
デメリット
- 単体テストより時間がかかる
- 問題点がみつかればモジュールまで手戻りしなければならない
- 詳細さに欠ける
単体テストよりも多くの動作を考慮したテストですので、システムの規模によってはとても時間のかかる工程となります。更に、結合テストで洗い出される不具合は、大きな手戻りを意味します。
ひとつのモジュールに手戻りが発生すれば、テストの進捗自体に大きな遅れが発生してしまいます。これらを考慮すると、テスト工数は大きく予定しておく必要があるのです。
テストを自動化する判断
テストを自動化するテストツールが存在します。テストツールを導入することで、同じ動作の繰り返しなどに利用できます。これにより、テスト時間の短縮が実現できる可能性があります。
以下のようなテストにはツールを導入しても良いでしょう。
- 値の入力
- 連続した同じオペレーション
- 過負荷テスト
しかし、テストツールはあくまでも、テスト対象のシステムに合ったものを選択しし判断しなければなりません。テストツールさえ使えばテストが短縮できるということで、先行してテストツールを導入してしまったという声もよく聞きます。
テストツールは万能ではありません。ですので、テスト仕様書にて洗い出したテスト項目から、自動化できるモノとそうでないものを切り分け、導入を検討する必要があるのです。
テストツールを利用するにはもちろんコストがかかります。テストツールに合わせたシナリオを別途作成しなければならないという工数も必要です。
テストを自動化する判断は、自動化が効率をあげるシステムであること、そして導入するタイミングなどの判断で、テストツールの価値が決まるのです。
まとめ
- 単体テストはモジュール単位でテストを行う
- 結合テストの主な目的は各モジュールが連携したときの動作確認を行うこと
- 単体テスト、結合テスト共に欠かせない工程であるが、テスト作業には多くの時間を費やすことになる
単体テストと結合テストでは、それぞれ観点が違います。また、単体テストをコーディングの過程で行い、実質では単体テスト工程を省略しているプロジェクトも存在します。
しかし、単体テストや結合テストなど、それぞれのテストにこうした観点の違いがあることを認識していれば、省略は正しい方法ではないことが分かります。
単体テストでも、結合テストでも、それぞれに技術的な違いがあることも分かりました。プログラミングからテストまでを行うエンジニアも、テストを専門とするエンジニアも、これらテストのメリットやデメリットも把握しておく必要がありますね。
\ IT転職のプロが無料でサポート! /
あわせて読みたい関連記事
この記事を読んでいる人におすすめの記事