web-dev-qa-db-ja.com

統合テストとは正確には何ですか?

友人と私は、統合テストとは何かを正確に分類するのに苦労しています。

今、家に帰る途中で、統合テストの実例を挙げようとするたびに、それが受け入れテストになることがわかりました。システムが何を提供すべきかを指定する、ビジネスマンが大声で言う何か。

Ruby on Railsドキュメントでこれらのテストタイプの分類を確認したところ、完全にスローされました。

実世界の例を使用した統合テストの簡単な学術的説明をいただけますか?

116
Martin Blore

現時点で私はこのステートメントが好きです。「それを何と呼ぶか​​は重要ではありませんが、何をするか」がGojko Adzicによって この記事 で作成されました。

テストについて話している人に、テストする予定の内容を本当に指定する必要があります。

彼らの役割が何であるかによって、多くの人々が異なる見解を持っています。

テスターに​​とって、オランダで一般的に受け入れられているテスト方法は TMap です。 TMapは次の区別をします。

  • 単体テスト
  • ユニット統合テスト
  • システムテスト
  • システム統合テスト
  • 受け入れテスト(すべての種類/レベル)
  • 機能受け入れテスト
  • ユーザー受け入れテスト
  • 生産受け入れテスト

それらには、上記のテスト内で実行できるより具体的な種類のテストがあります。概要については このWord文書 を参照してください。

ウィキペディアには 素敵な概要 もあります。

実用的なプログラマーの本 は言う:

  • ユニットテストはモジュールを実行するテストです
  • 統合テストは、システムの主要部分が連携して機能することを示しています

これらのさまざまな情報源を見て、自分自身の経験や意見のいくつかを入れて、3つのカテゴリーで区別することから始めます。

  • 一般にテストを行うのは誰ですか
  • テストされるもの
  • テストの目的は何ですか

    • 単体テスト:コードレベルの正確さを示すために、プログラマーがクラスのロジックをテストします。それらは高速で、テストするつもりのないシステムの他の部分に依存してはいけません
    • 機能的受け入れテスト:テストユースケースシナリオは、指定されたすべてのシナリオが指定どおりに機能することを示すために、テスト部門によって実行された限られた(特別に作成された)データセットに対して行われます。
    • ユーザー受け入れテスト:ユーザーの代表がアプリケーションを正式に受け入れるようにするためにユーザーの代表が行ったデータのような、本番環境でのユースケースシナリオのテスト
    • 統合テスト:テスト部門または開発者によって行われたモジュールのさまざまな部分間の通信パスをテストして、すべてのモジュールが正しく連動することを示します。

上記の私のリストはほんの始まりであり提案ですが、私は本当に考えています。「それを何と呼ぶか​​は重要ではありませんが、何をするか」

お役に立てれば。

26-10-2016編集:つい最近、非常に素晴らしい紹介がYouTubeに掲載されました ユニットテストと統合テスト-MPJの考察-FunFunFunction#55

81
KeesDijk

統合テスト、それは受け入れテストであることが判明

明らかに。

これら2つはほとんど同じものです。しかし、テスト定義には若干異なる次元があります。

統合==システム全体。

受け入れ==システム全体。

唯一の違い-これは微妙です-はテストケースの定義です。

統合==統合の深さと度合いをテストするテストケース。すべてのEdgeケースとコーナーケースで機能しますか?テストケースは、設計者やプログラマーが作成した技術的な傾向があります。

受け入れ==エンドユーザーに焦点を当てた機能セットの80%のみを実行するテストケース。すべてのエッジとコーナーのケースではありません。テストケースは、技術的ではなく、エンドユーザーが作成する傾向があります。

31
S.Lott

私は個人的には、システムのすべてのコンポーネントがrealであり、モックオブジェクトがない場合のfeature testとしての統合テストについて考えたいと思います。

実際のリポジトリ、実際のデータベース、実際のUI。システムが完全に組み立てられたときに特定の機能をテストします。これは、展開時に想定されているようなものです。

16
user8685

私の(私が認める)少しの経験では、Wordの統合が誤解を生む可能性があることを理解しました。

したがって、私は次の区別をすることに慣れました。

  • 私は単体テストを使用して、テストしているクラスが実行する責任があるすべての動作を識別、文書化、および強調します。
  • システムにコンポーネント(おそらく1つ以上)があり、別のコンポーネントと会話している統合テストを実行しています "external "システム。 (以下に続く...)
  • 受け入れテストを実装して、システムが期待する特定のワークフローを定義、文書化、および強調します。

統合テストの定義では、外部とは、開発範囲外のシステムを意味します:何らかの理由で、それらの動作をすぐに変更することはできません。これは、ライブラリ、変更できないシステムのコンポーネント(つまり、社内の他のプロジェクトと共有されている)、dbmsなどです。これらのテストでは、システムの実際の環境と非常によく似たものをセットアップする必要がありますで動作します:外部システムを初期化して特定の状態に設定する必要があります。現実的なデータをデータベースに登録する必要があります。等.

代わりに、受け入れテストをしているとき、私fakeのこと:別の何かに取り組んでいます。システムの仕様に取り組んでいます。外部のエンティティとコラボレーションすることはできません。

これは、前にKeesDijkが説明したものと比べると、実際には狭いビューですが、私が今まで取り組んできたプロジェクトは、このレベルの単純化を可能にするのに十分小さいと思います。

8
Marco Ciambrone

統合テストは、複雑なシステムのコンポーネント(ソフトウェア、航空機、発電所など)が設計どおりに連動していることを確認します。

航空機について話しているとしましょう(ソフトウェアを使用すると、より抽象化され、違いを生み出すことが難しくなります)。統合テストには以下が含まれます。

  • 一部のコンポーネント間の正しい相互作用。例:スタートボタンを押すと、エンジンが始動し、プロペラが予想される回転速度に到達します(航空機はまだ地上にあります)
  • 外部コンポーネントとの正しい相互作用。例:組み込み無線機が固定無線機(まだ地上にある航空機)と通信できることを確認します
  • 関係するすべてのコンポーネント間の正しい相互作用により、システム全体が期待どおりに機能します。例:テストパイロットとエンジニアの乗組員が飛行機を始動し、一緒に飛行します(全員がパラシュートを着用しています...)。

統合テストは技術的な問題に対処します。つまり、システムはコンポーネントに細分されていても機能します。ソフトウェアでは、コンポーネントはユースケース、モジュール、関数、インターフェース、ライブラリなどです。

受け入れテストは、製品が目的に適していることを確認します。原則としてお客様が行います。航空機の類推では、次のことを確認します。

  • 想定されるビジネスシナリオは、ほぼ実際の状況で期待される結果につながります。例:試乗者の搭乗をリハーサルして、スタッフが操作手順で期待どおりに搭乗を監視できることを確認します。一部のシナリオは、単体テストのように見えるほど単純である可能性がありますが、ユーザーによって実行されます(たとえば、会社の機器の電気プラグを試します)。
  • システムは、ほぼ実際のビジネス状況で機能します。例:2つの実際の目的地の間で空のテスト飛行を行い、航空会社から新しく訓練されたパイロットが燃料消費量が約束どおりであることを確認します。

受け入れテストは、より責任のある問題に対処します。クライアント/サプライヤーの関係では、それは契約上の責任である可能性があります(すべての要件への準拠)。ただし、いずれの場合も、システムで職務を継続できることを保証し、予期しない問題を慎重に防止することは、使用する組織の責任でもあります(たとえば、この鉄道会社のように、受け入れテスト中にいくつかのquai​​sを短くする必要があることが判明したため、新しいワゴンは5 cm大きすぎました-冗談ではありません!).

結論:統合テストと受け入れテストは重複しています。彼らは両方とも、システム全体が機能することを示すつもりです。ただし、「システム全体」は顧客にとってはより大きくなる可能性があり(システム自体がより大きな組織システムの一部である可能性があるため)、システムインテグレーターにとってはより技術的です。

enter image description here

7
Christophe

統合テストは、2つ以上のモジュール間のデータフローの接続と正確さをチェックすることに他なりません。

例:メール(1つのモジュール)を作成して有効なユーザーID(2つ目のモジュール)に送信する場合、統合テストでは、送信済みメールが送信済みアイテムにあるかどうかを確認します。

1
Anita

統合テストの1つ実用的な定義は、次のとおりです。プロセス外の何かとの相互作用を必要とする任意のテスト。

例えば:

  • ファイルシステム
  • ネットワーク
  • データベース
  • 外部API

プロセスと外部の世界との間にある種の契約が存在し、その契約が統合テストの目標であることを最小限に検証します。つまり、契約を確認するだけです。もしそうなら、あなたはシステム/エンドツーエンドのスペースに向かって動いています。

ユニットテストは、プロセス境界内のすべてのロジックをテストできます。また、slow/fragile /に依存しないため、簡単に正確にテストできます。複雑な「外の世界」。

統合テストはありますが、この定義はカバーしていません(したがって、practical定義と呼んだ理由は)あまり一般的ではない/役に立たないと思います。

N.B.厳密に言えば、はい、この定義はシステム/エンドツーエンドのテストもカバーします。私の哲学では、これらは「極端な」統合テストの1つの形式であり、そのため、それらの名前が別の側面を強調しているのはなぜですか。他の方向では、ユニットテストはゼロ成分の統合テストと見なすことができますすべてのテストは、0-nコンポーネント間を統合する統合スペクトルのどこかにあると見なすことができます:-)

0
Schneider