JUnitクラスの特別なテストパッケージへの分離?


118

私は読書を通じてテスト駆動開発の概念を学んでいます職人の記事を(クリック職人の下にしてトピックを)私の前の質問への答えで推奨「のJUnitと適切なソフトウェア工学を学ぶためのサンプルプロジェクト」。今のところ大好きです!

でも今は座って自分で試してみたいです。簡単な答えだけでいいと思います。

JUnitテストクラスと実際のコードをどのように整理しますか?私は主にパッケージ構造について話していますが、他のメモの概念も役に立ちます。

テストクラスをorg.myname.project.test。*に配置し、通常のコードをorg.myname.project。*に配置しますか?テストクラスを通常のクラスと並べて配置していますか?クラス名に接尾辞を付けるのではなく、接頭辞にTestを付けますか?

これは、すぐに心配する必要のないことのように思えますが、私は非常に組織中心の人です。私はほとんどですむしろ実際に物事を得るよりも、成し遂げるに何を追跡するための方法を考え出すより多くの時間を費やしている人のようなもの。

そして、私は現在きれいにパッケージに分割されているプロジェクトを持っていますが、プロジェクトは混乱しました。すべてをリファクタリングしてテストを作成しようとするのではなく、テストを最初からやり直したいと思います。しかし、最初に、テストの場所を知る必要があります。


編集:私は完全にMavenを忘れましたが、あなたの大多数がそれを使用しているようです!以前は、Mavenが完全に故障した特定のユースケースがありましたが、Antが必要な柔軟性を提供してくれたため、結局Antに執着しましたが、おそらく間違ったアプローチをとっていたのではないかと思っています。テスト駆動開発でうまくいくように思えるので、Mavenをもう一度試してみると思います。


回答:


154

私はテストクラスを、テストするプロジェクトクラスと同じパッケージに配置することを好みますが、次のように異なる物理ディレクトリに配置します。

myproject/src/com/foo/Bar.java
myproject/test/com/foo/BarTest.java

Mavenプロジェクトでは、次のようになります。

myproject/src/main/java/com/foo/Bar.java
myproject/src/test/java/com/foo/BarTest.java

これの主なポイントは、私のテストクラスがパッケージスコープのクラスとメンバーにアクセス(そしてテスト!)できることです。

上記の例が示すように、私のテストクラスには、テストされたクラスの名前とTest接尾辞が付いています。これはそれらを素早く見つけるのに役立ちます-それぞれの名前がTest...で始まる数百のテストクラスの中から検索してみるのはそれほど面白くない

@Ricketのコメントに触発された更新:この方法で、テストクラスは、通常、テストされたバディの直後にクラス名のプロジェクトごとのアルファベット順のリストに表示されます。(私がこの方法から毎日恩恵を受けているのは面白いです。

Update2: Mavenのような多くの開発者(私を含む)がいますが、そうでない開発者も少なくないようです。私見それは「主流」のJavaプロジェクトに非常に役立ちます(私はプロジェクトの約90%をこのカテゴリーに入れます...しかし、他の10%はまだかなり少数です)。Mavenの規則を受け入れることができれば、簡単に使用できます。しかし、そうでなければ、それは人生を悲惨な闘争にします。Mavenは明らかに非常に異なる考え方を必要とするため、Antで交流した多くの人々にとって理解するのは難しいようです。(私自身、Antを使用したことがないので、2つを比較することはできません。)1つ確かなことは、ユニット(および統合)テストをプロセスの自然なファーストクラスのステップにし、開発者がこの本質的なプラクティスを採用するのに役立ちます。


6
接尾辞にも同意します。また、テストクラスは別の物理フォルダーに分離されているため、アルファベット順の並べ替えをグループ化するためにTestをプレフィックスとして追加する必要はなく、SomeClassTestの方が読みやすいと思います。
Ricket

優れたコンベンション+1
ウイスキーシエラ

1
同じパッケージにテストクラスを配置することについての1つのこと:パッケージプライベートメンバーを使用することができますが(このスキームも使用する理由です)、可視性を自動的にテストすることもできません。TDDを使用していて、IDEに必要なメソッドスタブを生成させる場合。パッケージプライベートの可視性(NetBeans、私はあなたを見ている)でそれらを生成する可能性があります。これにより、テストは完全に合格します(実際に実装をスタブに配置した後)が、実際の使用では失敗する可能性があります(追加するのを忘れた場合public) 。
Sergei Tachenov 2016年

この規則は興味深いものですが、テストスイートが大きくなったときはどうしますか?たとえば、クラスに6つのメソッドがあり、各メソッドに10のテストがあるとします。クラスに60のテストがありますか?私は通常、テストクラスを細分します(メソッドごとに1つのテストクラス)。これの問題は、テストパッケージに多くのクラスが見つかる可能性があることです。
mmalmeida 2016

1
Eclipseの@Thick_propheT:プロジェクト名を右クリックし、[新規-その他...]をクリックして、Javaフォルダー内で[ソースフォルダー]を選択します。「test」という名前を付けます。次に、上記の規則に従う場合は、テストケースを作成するクラスのパッケージと同じ名前の新しいパッケージをこのテストフォルダーに追加し、パッケージに新しいJUnitテストケース( New-Other ...を実行するときのJava / Junitフォルダー)。その新しいウィザードであなたがテストされているクラスを指定することができますし、「テスト」のサフィックスを持つ同じ名前としてあなたのテストケースに名前を付ける
inor

15

私はテストクラスを、それらがテストしているものと同じパッケージに入れましたが、別のソースフォルダーまたはプロジェクトに入れました。この方法でテストコードを整理すると、簡単にコンパイルして個別にパッケージ化できるため、本番jarファイルにテストコードが含まれなくなります。また、テストコードがパッケージのプライベートフィールドとメソッドにアクセスできるようにします。


12

私はMavenを使用しています。Mavenが推進する構造は次のとおりです。

src/main/java/org/myname/project/MyClass.java

src/test/java/org/myname/project/TestMyClass.java

つまり、テスト対象のクラスの名前の前にTestが付加されたテストクラスは、メインテストの並列ディレクトリ構造にあります。

同じパッケージ(必ずしもディレクトリである必要はありません)にテストクラスを含めることの1つの利点は、パッケージスコープメソッドを利用して、模擬テストオブジェクトを検査または挿入できることです。


18
私はそうでしたが<class>Test.java、そうではありませんでしたTest<class>.java
マイク・ライランダー2013年

2
Mavenは、Maven Surefireプラグインのドキュメントに従ってどちらのパターンも受け入れます。
Elijah Woodward

3
<class>Test.javaIDEの検索機能を使用すると、命名規則によってメインクラスとテストクラスの両方が近くに表示されるため、よりも少し優れていると私は思いTest<class>.javaます。
christopheml 2018

1
@christopheml同意します、それが私が今やっていることです。
マーティン

これはIntellijで機能しました。MyClassTest.javaが機能しませんでした。
user2761431 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.