単体テストと統合テストを分離する必要がありますか?


17

プロジェクトの単体テストと統合テストを作成する必要があります。

  • すべてのテストを単一のテストフォルダーに入れる必要がありますか?
  • または、単体テストと統合テストをそれぞれ個別のテストフォルダーに配置する必要がありますか?
  • それとも、それらを別々のプロジェクトに入れるべきですか?

それらをまとめると、このアプローチには利点や欠点がありますか?


1
CI環境で操作している場合、重要なことは、ビルドサーバーで統合テストが常に実行されるとは限らないため、(属性などによって)容易に識別できることです。
ロビーディー

回答:


17

一般的に、はい、統合テストと単体テストを異なるフォルダーに配置する必要があります。多くの場合、プログラマーはこれらの2種類のテストの間に明確な境界線を引かず、有用なテストの種類を書くだけです。ただし、統合テストには次のことが含まれる場合が多いため、時間がかかる傾向があります。

  • データベースクエリ
  • ネットワークリクエスト
  • 時間依存の動作
  • 大量のデータ

対照的に、単体テストは高価な操作をモックするため、単体テストは迅速に実行される傾向があります(実際、テストの実行で最も遅い部分は多くの場合テストフレームワーク自体です)。

プログラマがシステムで作業しているとき、編集テストサイクルにあります。テストフィードバックを迅速に取得し、サイクルを短くするほど、生産性が向上します。そこで、迅速に完了する重要なテストのみを実行する必要があります。完全なテストスイートは、CIサーバーなどのQAプロセスの一部としてのみ実行されます。

これは、大規模なテストスイートを分類する必要があることを意味します。特定のコンポーネントの単体テストのみを選択できますか?遅いテストを除外できますか?これを行う簡単な方法の1つは、異なるディレクトリで異なるテストスイートを維持することです。テストが非常に少ない場合は、プログラマがテストのサブセットを簡単に選択できる限り、1つのディレクトリでもかまいません。

プログラマーが迅速にフィードバックを得ることができるものは何でも良いです。最も包括的なテストスイートは、定期的に実行されなくても問題ありません。

参考文献:


フォルダーを分離するとき、それぞれを製品コードと同じパッケージに保持しますか(保護されたメソッドをテストできるように)?たとえば、単体テスト用のmavenモジュールと統合テスト用の別のmavenモジュールを作成します。そのように、それらを分離しても、保護されたメソッドを簡単にテストできます。
ihebiheb

@ihebiheb Javaでは、パッケージの可視性の使用は非常に嫌われています。場合によっては、それを使用し、単体テストからこれらのAPIにアクセスすると役立つ場合があります。しかし、一般的に、それは不要です。統合スタイルのテストでは、パッケージプライベートメンバーにアクセスする必要はありません。テストを別のMavenプロジェクトに配置するかどうかは、テストの実行方法とデプロイ方法によって異なります。ここで賢明なことをあなたに伝えることができるようにするために、私はJava / Mavenには興味がありません。
アモン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.