友人と私は、統合テストとは何かを正確に分類するのに苦労しています。
今、家に帰る途中で、統合テストの実例を挙げようとするたびに、それが受け入れテストになることがわかりました。システムが何を提供すべきかを指定する、ビジネスマンが大声で言う何か。
Ruby on Railsドキュメントでこれらのテストタイプの分類を確認したところ、完全にスローされました。
実世界の例を使用した統合テストの簡単な学術的説明をいただけますか?
現時点で私はこのステートメントが好きです。「それを何と呼ぶかは重要ではありませんが、何をするか」がGojko Adzicによって この記事 で作成されました。
テストについて話している人に、テストする予定の内容を本当に指定する必要があります。
彼らの役割が何であるかによって、多くの人々が異なる見解を持っています。
テスターにとって、オランダで一般的に受け入れられているテスト方法は TMap です。 TMapは次の区別をします。
それらには、上記のテスト内で実行できるより具体的な種類のテストがあります。概要については このWord文書 を参照してください。
ウィキペディアには 素敵な概要 もあります。
実用的なプログラマーの本 は言う:
これらのさまざまな情報源を見て、自分自身の経験や意見のいくつかを入れて、3つのカテゴリーで区別することから始めます。
テストの目的は何ですか
上記の私のリストはほんの始まりであり提案ですが、私は本当に考えています。「それを何と呼ぶかは重要ではありませんが、何をするか」
お役に立てれば。
26-10-2016編集:つい最近、非常に素晴らしい紹介がYouTubeに掲載されました ユニットテストと統合テスト-MPJの考察-FunFunFunction#55
統合テスト、それは受け入れテストであることが判明
明らかに。
これら2つはほとんど同じものです。しかし、テスト定義には若干異なる次元があります。
統合==システム全体。
受け入れ==システム全体。
唯一の違い-これは微妙です-はテストケースの定義です。
統合==統合の深さと度合いをテストするテストケース。すべてのEdgeケースとコーナーケースで機能しますか?テストケースは、設計者やプログラマーが作成した技術的な傾向があります。
受け入れ==エンドユーザーに焦点を当てた機能セットの80%のみを実行するテストケース。すべてのエッジとコーナーのケースではありません。テストケースは、技術的ではなく、エンドユーザーが作成する傾向があります。
私は個人的には、システムのすべてのコンポーネントがrealであり、モックオブジェクトがない場合のfeature testとしての統合テストについて考えたいと思います。
実際のリポジトリ、実際のデータベース、実際のUI。システムが完全に組み立てられたときに特定の機能をテストします。これは、展開時に想定されているようなものです。
私の(私が認める)少しの経験では、Wordの統合が誤解を生む可能性があることを理解しました。
したがって、私は次の区別をすることに慣れました。
統合テストの定義では、外部とは、開発範囲外のシステムを意味します:何らかの理由で、それらの動作をすぐに変更することはできません。これは、ライブラリ、変更できないシステムのコンポーネント(つまり、社内の他のプロジェクトと共有されている)、dbmsなどです。これらのテストでは、システムの実際の環境と非常によく似たものをセットアップする必要がありますで動作します:外部システムを初期化して特定の状態に設定する必要があります。現実的なデータをデータベースに登録する必要があります。等.
代わりに、受け入れテストをしているとき、私fakeのこと:別の何かに取り組んでいます。システムの仕様に取り組んでいます。外部のエンティティとコラボレーションすることはできません。
これは、前にKeesDijkが説明したものと比べると、実際には狭いビューですが、私が今まで取り組んできたプロジェクトは、このレベルの単純化を可能にするのに十分小さいと思います。
統合テストは、複雑なシステムのコンポーネント(ソフトウェア、航空機、発電所など)が設計どおりに連動していることを確認します。
航空機について話しているとしましょう(ソフトウェアを使用すると、より抽象化され、違いを生み出すことが難しくなります)。統合テストには以下が含まれます。
統合テストは技術的な問題に対処します。つまり、システムはコンポーネントに細分されていても機能します。ソフトウェアでは、コンポーネントはユースケース、モジュール、関数、インターフェース、ライブラリなどです。
受け入れテストは、製品が目的に適していることを確認します。原則としてお客様が行います。航空機の類推では、次のことを確認します。
受け入れテストは、より責任のある問題に対処します。クライアント/サプライヤーの関係では、それは契約上の責任である可能性があります(すべての要件への準拠)。ただし、いずれの場合も、システムで職務を継続できることを保証し、予期しない問題を慎重に防止することは、使用する組織の責任でもあります(たとえば、この鉄道会社のように、受け入れテスト中にいくつかのquaisを短くする必要があることが判明したため、新しいワゴンは5 cm大きすぎました-冗談ではありません!).
結論:統合テストと受け入れテストは重複しています。彼らは両方とも、システム全体が機能することを示すつもりです。ただし、「システム全体」は顧客にとってはより大きくなる可能性があり(システム自体がより大きな組織システムの一部である可能性があるため)、システムインテグレーターにとってはより技術的です。
統合テストは、2つ以上のモジュール間のデータフローの接続と正確さをチェックすることに他なりません。
例:メール(1つのモジュール)を作成して有効なユーザーID(2つ目のモジュール)に送信する場合、統合テストでは、送信済みメールが送信済みアイテムにあるかどうかを確認します。
統合テストの1つ実用的な定義は、次のとおりです。プロセス外の何かとの相互作用を必要とする任意のテスト。
例えば:
プロセスと外部の世界との間にある種の契約が存在し、その契約が統合テストの目標であることを最小限に検証します。つまり、契約を確認するだけです。もしそうなら、あなたはシステム/エンドツーエンドのスペースに向かって動いています。
ユニットテストは、プロセス境界内のすべてのロジックをテストできます。また、slow/fragile /に依存しないため、簡単に正確にテストできます。複雑な「外の世界」。
統合テストはありますが、この定義はカバーしていません(したがって、practical定義と呼んだ理由は)あまり一般的ではない/役に立たないと思います。
N.B.厳密に言えば、はい、この定義はシステム/エンドツーエンドのテストもカバーします。私の哲学では、これらは「極端な」統合テストの1つの形式であり、そのため、それらの名前が別の側面を強調しているのはなぜですか。他の方向では、ユニットテストはゼロ成分の統合テストと見なすことができますすべてのテストは、0-nコンポーネント間を統合する統合スペクトルのどこかにあると見なすことができます:-)