web-dev-qa-db-ja.com

単体テストと統合テスト

Web開発に関して、ユニットテストと統合テストの違いは何ですか(コードの90〜95%がデータベースに依存している場合)?いつもここで私がしていることの1つは、単体テストではデータベースを扱うべきではなく、統合テストでは扱うべきだということです。これに関して私が抱えている問題は、ユニットテストと統合テストの唯一の違いはデータソースであり、その場合は同じ機能をテストしているということです。テストされる機能が同じである場合、なぜユニットテストに悩まされ、常にデータベースに対してテストするのでしょうか。

11
ryanzec

統合テストとは、2つ以上のシステム間の統合ポイントをテストすることです。これは、データベース、Webサービスなどです。それが何であれ、それは対話ベースです。 xyとzは? Webサービスはインターフェースを変更しましたか?

単体テストは、単一の作業単位を扱います。各ユニットテストでは、メソッドが行うべきことを1つだけテストする必要があります。ここで、データベースとすべての外部インターフェイスまたは相互作用をスタブします。

7
Nicholas Mayne

単体テストは次のとおりです。

繰り返し可能:同じテストを何度でも再実行できます。

Consistent:実行するたびに、同じ結果が得られます。 (例:スレッドを使用すると、一貫性のない結果が生成される可能性があります)

メモリ内:メモリ内にないもの(ファイルシステム、データベース、ネットワークなど)に対する「ハード」な依存関係はありません。

Fast:単体テストの実行には0.5秒もかかりません。

システムで単一の懸念事項または「ユースケース」をチェックする:(問題が複数ある場合、問題がどこにあるか、またはどこに問題があるかを理解するのが難しくなる可能性があります発生します。)

これらのガイドラインのいずれかに違反すると、開発者がテスト結果を信頼しない、または信じない可能性が高くなります(テストによる誤った失敗が繰り返されるため)、または実行速度が遅いためにテストをまったく実行したくない人もいます。

http://www.typemock.com/unit-tests-integration-tests

上記で言及されていないもう1つのことは、特別な構成に依存しないことです。開発者はソースコードのコピーをチェックアウトしてユニットテストを実行できますか?

データベースでは、各開発者が同じデータベース構成をセットアップする必要があります。一部の開発者がデータベースを正常に操作できない場合はどうなりますか?

7
Davy8

単体テストは、単一コンポーネントのテストに関するものです(したがって、統合テストよりも簡単です)。

単体テストは、バグ修正中にパブリックインターフェイスが壊れないことを確認するのに非常に適しています。各クラス(コンポーネント)は、依存関係を使用せずに分離してテストされます(依存関係は通常、注入され、モックされます)。したがって、通常、実行パスの100%をテストできます(注入された依存関係を取得して、さまざまな種類の結果(エラーを含む)をすべて提供することにより)。エラー応答の生成が難しいため、実際のデータソースでこれを実現するのは非常に困難です(たとえば、DBでは、テストの正しいポイントで強制DB例外をどのように行うか)。

統合テストは、コンポーネントがどのように連携するかについてです。
その結果、すべての可能性をテストするための記述は簡単になりますが、設定が難しくなります。

ここでは、コンポーネントのシステムがどのように連携するかについてのテストを記述します。必要なインターフェースが廃止されていないことを確認するためにテストします。そのようなもの。

1
Martin York