web-dev-qa-db-ja.com

単体テスト、機能テスト、受け入れテスト、統合テストの違いは何ですか?

単体テスト、機能テスト、受け入れテスト、および統合テスト(および私が言及しなかった他の種類のテスト)の違いは何ですか?

771
Andrew

あなたが見る場所に応じて、あなたは少し異なる答えを得るでしょう。私はこの主題についてたくさん読んだ、そしてこれが私の蒸留だ。繰り返しになりますが、これらはわずかに羊毛であり、他の人は反対するかもしれません。

単体テスト

機能の最小単位、通常はメソッド/関数をテストします(たとえば、特定の状態を持つクラスが指定された場合、そのクラスでxメソッドを呼び出すとyが発生します)。単体テストは特定の機能に焦点を当てる必要があります(たとえば、スタックが空のときにpopメソッドを呼び出すとInvalidOperationExceptionがスローされます)。それが触れるすべてのことは、メモリ内で行われるべきです。これは、テストコードテスト中のコードが次のようになるべきではないことを意味します。

  • (自明でない)共同編集者に声をかける
  • ネットワークにアクセスする
  • データベースをヒット
  • ファイルシステムを使用する
  • スレッドをスピンアップ
  • 等.

理解しにくい/初期化/操作するのが遅い/難しい依存関係は、適切な手法を使用してスタブ化/モック/作成する必要があります。そうすることで、依存関係ではなくコード単位の動作に集中できます。

つまり、単体テストは可能な限り単純で、デバッグが容易で、(外部要因が少ないため)信頼性が高く、実行が速く、プログラムの最小構成要素がまとめられる前に意図したとおりに機能することを証明するのに役立ちます。警告は、それらが完全に独立して動作することを証明することはできますが、組み合わせるとコードの単位が爆発する可能性があることです。

統合テスト

統合テストは、コードの単位を組み合わせて、結果として得られる組み合わせが正しく機能することをテストすることによって、単体テストに基づいています。これは1つのシステムの内在的なものでも、複数のシステムを組み合わせて何か便利なものにすることもできます。また、統合テストと単体テストを区別するもう1つの要素は環境です。統合テストでは、スレッドの使用、データベースへのアクセス、またはすべてのコードの異なる環境変更が正しく機能することを保証するために必要なことはすべて実行できます。

シリアル化コードを作成し、ディスクに触れることなくその内部をユニットでテストした場合、ディスクにロードして保存するときにそれが機能することをどのように知っていますか?ファイルストリームをフラッシュして破棄するのを忘れた可能性があります。あなたのファイルのパーミッションが間違っていて、メモリストリームの中で使っている内部標準をテストしたかもしれません。確実に見つける唯一の方法は、本番環境に最も近い環境を使用して「実際に」テストすることです。

主な利点は、ユニットテストが配線のバグ(例えば、クラスAのインスタンスが予期せずにヌルのインスタンスBを受け取る)や環境のバグ(私のシングルCPUマシンではうまく動く)のようなバグを見つけることです。同僚の4コアマシンはテストに合格できません)。主な欠点は、統合テストはより多くのコードに触れ、信頼性が低く、失敗を診断するのが難しく、テストを保守するのが難しくなることです。

また、統合テストは必ずしも完全な機能が機能することを証明するものではありません。ユーザーは私のプログラムの内部の詳細を気にしないかもしれませんが、私はします!

機能テスト

機能テストでは、特定の入力に対する結果を仕様と比較して、特定の機能の正確性を確認します。機能テストは、中間結果や副作用には関係しません。結果だけに関係します(xを実行した後、オブジェクトyが状態zになっても構いません)。これらは、「引数2で関数Square(x)を呼び出すと4が返される」など、仕様の一部をテストするために書かれています。

受入テスト

受け入れテストは2つのタイプに分けられるようです。

標準的な受け入れテストでは、アプリケーションの機能が仕様を満たしているかどうかを確認するために、システム全体でテストを実行する(Webブラウザを介してWebページを使用するなど)必要があります。例えば。 「ズームアイコンをクリックすると、ドキュメントビューが25%拡大されます。」結果の本当の連続はありません、合格または不合格の結果だけです。

利点は、テストが平易な英語で記述され、ソフトウェア全体として機能が完全であることを保証することです。不利な点は、テスト用ピラミッドのレベルをもう1つ上げたことです。受け入れテストはコードの山に触れるので、失敗を追跡するのは難しいかもしれません。

また、アジャイルソフトウェア開発では、ユーザー受け入れテストでは、開発中にソフトウェアの顧客によって/に対して作成されたユーザーストーリーを反映するテストを作成する必要があります。テストに合格した場合は、ソフトウェアが顧客の要件を満たしている必要があり、ストーリーは完全であると見なすことができます。受け入れテストスイートは基本的に、システムのユーザーが使用する言語でテストを記述するドメイン固有の言語で書かれた実行可能仕様です。

結論

それらはすべて補完的です。時々それは1つのタイプに焦点を合わせるか、またはそれらを完全に避けなさいことが有利である。私にとっての主な違いは、いくつかのテストではプログラマーの視点から物事を見ているのに対し、他のテストでは顧客/エンドユーザーに焦点を当てていることです。

1312
Mark Simpson

重要なことは、これらの用語が同僚にとって何を意味するのかを知っているということです。たとえば、グループによって、「完全なエンドツーエンド」テストと呼ばれるときの意味は少し異なります。

私は最近、Googleの命名システムに遭遇したので、それを気に入っています - それらは、Small、Medium、およびLargeを使用するだけで引数を回避します。テストがどのカテゴリに当てはまるかを決定するために、彼らはいくつかの要因を調べます - それが実行するのにかかる時間、それがネットワーク、データベース、ファイルシステム、外部システムなどにアクセスするか。

http://googletesting.blogspot.com/2010/12/test-sizes.html

現在の職場でのSmall、Medium、およびLargeの違いは、Googleのものとは異なる可能性があります。

しかし、それはスコープだけではなく目的についてです。テストの視点の違いについてのMarkの指摘。プログラマー対顧客/エンドユーザーは、本当に重要です。

80
testerab

http://martinfowler.com/articles/microservice-testing/ /

Martin Fowlerのブログ投稿は、コードをテストするための戦略(特にマイクロサービスアーキテクチャにおいて)について述べていますが、そのほとんどはあらゆるアプリケーションに当てはまります。

私は彼の要約スライドから引用します:

  • 単体テスト - アプリケーション内でテスト可能な最小のソフトウェアを実行して、期待通りに動作するかどうかを判断します。
  • 統合テスト - インターフェース間の欠陥を検出するために、コンポーネント間の通信経路と相互作用を検証します。
  • コンポーネントテスト - 実行されるソフトウェアの範囲をテスト中のシステムの一部に限定し、内部コードインタフェースを介してシステムを操作し、テスト用コードを使用してテスト中のコードを他のコンポーネントから分離します。
  • 契約テスト - 外部サービスの境界でのやり取りを検証し、消費しているサービスが期待する契約を満たしていることを証明します。
  • エンドツーエンドのテスト - システムが外部の要件を満たしていることを確認し、エンドツーエンドでシステム全体をテストして目標を達成します。
56
Maxim

単体テスト - 名前が示すように、このメソッドはオブジェクトレベルでテストします。個々のソフトウェアコンポーネントはエラーについてテストされます。このテストにはプログラムの知識が必要です。テストコードは、ソフトウェアが意図したとおりに動作するかどうかを確認するために作成されます。

機能テスト - システムの内部動作に関する知識がなくても実行されます。テスターは、さまざまな入力を提供し、生成された出力をテストすることによって、要件に従うだけでシステムを使用しようとします。このテストは、クローズドボックステストまたはブラックボックスとも呼ばれます。

受け入れ試験 - これは、ソフトウェアがクライアントに渡される前に行われる最後のテストです。開発されたソフトウェアがすべての顧客の要求を満たすことを確実にするために実行されます。受け入れテストには2つのタイプがあります。1つは内部受け入れテスト(Alphaテスト)と呼ばれる開発チームのメンバーによって実行され、もう1つは(Betaテスト)と呼ばれる顧客またはエンドユーザーによって実行されます。

統合テスト - すでに単体テストを受けている個々のモジュールは互いに統合されています。一般的に2つのアプローチが続きます。

1)トップダウン
2)ボトムアップ

29
Shah

これはとても簡単です。

  1. 単体テスト:これは、コーディングの知識がある開発者によって実際に行われるテストです。このテストはコーディング段階で行われ、ホワイトボックステストの一部です。ソフトウェアが開発のために来るとき、それはユニットとして知られているコードの断片またはコードのスライスに開発されます。そして、これらのユニットの個々のテストは、ステートメントカバレッジの欠落などのようなある種の人間の間違いを見つけるために開発者によって行われるユニットテストと呼ばれます。

  2. 機能テスト:このテストはテスト(QA)段階で行われ、ブラックボックステストの一部です。以前に書かれたテストケースの実際の実行。このテストは実際にはテスト担当者によって行われ、テスト担当者はサイト内の機能の実際の結果を見つけて、この結果を予想される結果と比較します。彼らが何らかの不一致を発見した場合、これはバグです。

  3. 受入試験:UATとして知られています。そしてこれは実際にはテスト担当者、開発者、管理チーム、作家、作家、そしてこのプロジェクトに関わっているすべての人によって行われます。プロジェクトを確実にバグなしで配信する準備が整いました。

  4. 統合テスト:コードの単位(ポイント1で説明)を互いに統合してプロジェクトを完成させます。これらのコード単位は、異なるコーディング技術で書かれているか、バージョンが異なるため、開発者がコードのすべての単位が他のコードと互換性があり、統合の問題がないことを確認するために行われます。

17
Rakesh Kumar
6
cdunn2001

単体テスト:アプリケーション内の個々のモジュールまたは独立したコンポーネントのテストは単体テストとして知られています。単体テストは開発者によって行われます。

統合テスト:すべてのモジュールを組み合わせてアプリケーションをテストし、モジュール間の通信とデータフローが適切に機能しているかどうかを確認します。このテストも開発者が行います。

機能テスト アプリケーションの個々の機能をチェックすることは機能テストであることを意味します

受け入れテスト このテストは、ビルドアプリケーションが顧客の要件に従っているかどうか、およびこれが受け入れテストであることがわかっている顧客の仕様に従っているかどうかをエンドユーザーまたは顧客が行います

4
malini

私はあなたにこれを実際的な例で、理論的なものではないことを説明します:

開発者がコードを書きます。 GUIはまだ実装されていません。このレベルのテストでは、関数が正しく機能し、データ型が正しいことを確認します。このテスト段階は単体テストと呼ばれます。

GUIが開発され、アプリケーションがテスターに​​割り当てられると、彼はクライアントとのビジネス要件を検証し、さまざまなシナリオを実行します。これは機能テストと呼ばれます。ここでは、クライアント要件をアプリケーションフローとマッピングしています。

統合テスト:アプリケーションにHRとFinanceの2つのモジュールがあるとしましょう。 HRモジュールは以前に納入されテストされました。今財務が開発され、テストすることができます。相互依存機能も現在利用可能です、従ってこの段階では、2つの間のコミュニケーションポイントをテストし、それらが要件の要求どおりに機能していることを確認します。

回帰テストは別の重要なフェーズです。これは、新しい開発やバグ修正の後に行われます。その目的は、以前に機能していた機能を検証することです。

4
fahad shaikh