web-dev-qa-db-ja.com

JUnitテストはどこに置くべきですか?

ユニットテストの構成について2つの質問があります。

  1. テスト済みのクラスと同じパッケージにテストを配置する必要がありますか、それとも別のパッケージにテストを編成できますか?

    たとえば、validityおよびotherテストがある場合、それらが同じクラスのものであっても、それらを異なるパッケージに分割することは正しいですか?

  2. モッククラスとスタブクラスはどうですか?テストのみを含むパッケージからそれらを分離するか、それらをまとめますか?

47
Jakub Arnold

JUnitテストケースを実行する方法は、それらを同じパッケージに配置することですが、異なるルートディレクトリに配置します。 Mavenを使用するため、標準の場所を使用するだけで、次のような構造になります。

src/main/Java/com/foo/Bar.Java
src/test/Java/com/foo/BarTest.Java

明らかに構造には他にもありますが、これによりメインラインのコードとは別にテストを構築できますが、保護されたクラスなどにアクセスできます。さまざまなタイプのテストに関して、これは非常に主観的です。テスト作業を開始したとき(残念ながら開発後に開始しました)、私は物事をかなり隔離したままにしようとしました。残念ながら、500以上のテストケースポイントに到達すると、すぐに悪夢になりました。私はそれ以来、より多くの統合を試みました。これにより、維持するコードの量が減少しました。でも言ったように、それは非常に主観的です。

テスト専用コードに関する限り、別のcom.foo.testにのみ存在するパッケージsrc/test/Java 木。

61
Paul Kuykendall

私も同じパッケージにテストを入れる傾向がありますが、別のルートディレクトリの下にあります。これにより、パッケージプライベートクラスをテストしたり、パッケージ内の他の何かをテストしながら、パッキングプライベートクラスにアクセスしたりできます。それらは、デプロイされた結果からそれらを除外できるように別のディレクトリツリーに保持されます(特に、テストコードが誤ってプロダクションコードに入らないようにするため)。ただし、最も重要なのは、状況に合った方法です。

プロダクションクラスあたりのテストクラスの数に関して、私が見た理論では、フィクスチャごとに、つまりセットアップ構造ごとに1つのテストクラスを記述します。多くの場合、プロダクションクラスごとに1つのテストクラスと同じ(または十分に近い)ですが、特定のプロダクションクラスに対してより多くのテストクラス(特に、等式テストが分離される傾向がある)を作成したり、場合によっては(関連する)プロダクションクラスのグループ(たとえば、Strategyパターンのテスト用)。

ほとんどの場合、理論についてはあまり心配しませんが、必要に応じてテストを作り直して、重複を最小限に抑えます。

5
Kathy Van Stone

テストクラスは、別のパッケージに収める必要があります。リリース用にパッケージ化するときに、プロダクションコードからそれらを分離する方が簡単です。私は通常、これらのパッケージ、あらゆる種類のモック、構成、シナリオに多数のテストフラッフを保持しています。しかし、ビルドすると、取得できません。状況によっては、さまざまなプロジェクトでテストを継続することをお勧めします。依存します。

3
Dima

同じパッケージを維持することで、テストのみを介してアクセスすることを目的としたコードに対して、パッケージプライベートの可視性を使用できます。

個別のルートディレクトリの使用に関しては、これは良い方法です。 IDEAを使用するため、これには利点もあります。IDEAは、製品コードがテストコードを参照できないことを認識しています。

それらを別々に保つという点で、ユニットレベルでプロダクションクラスごとにテストクラスを1つだけ持つことには大きな力があります。もちろん、テストクラスがまったくないリファクタリングの一部として本番環境で作成されるクラスもありますが、それは問題ありませんが、特定のクラスをテストするテストを知りたい場合は、ClassNameTestがClassNameのテストであるという規則があります。とても役に立ちます。

ただし、TestNGはJUnitよりもこのパラダイムに非常に友好的です。

3
Yishai