テストパッケージの命名規則


11

実際には、テストするパッケージと同じようにテストパッケージに名前を付けています。したがって、最終的には次のような構造になります。

src/main/java
    com.hello.world
        helloWorld.java
src/test/java
    com.hello.world
        helloWorldTest.java

パッケージ名を指定するだけでは「テスト」と「テストする」を区別できないので、私は常にこれがかなり賢いとは思えませんでした。一方、これがどういうわけか問題になるケースは、実際には見つかりませんでした。(テストケースとソースクラスの)両方のパッケージに同じ命名規則を使用することは良い習慣ですか?そうでない場合、より良いアプローチは何でしょうか?


1
それが良い習慣かどうかはわかりませんが、人気のある方法です。他のオプション(「Test」をパッケージ名、メソッド名などに入れる)は、「Smurfの名前付け」を少なすぎます。あなたが言っているように、「パッケージ名だけで提供されている場合、「テスト」と「テストする」を区別できない」ことが問題になるケースを考えるのは難しいです。
David Arno

@DavidArnoあなたの入力をありがとう:)それではスマーフの命名を避ける方法は?つまり、com.hello.world.test.helloWorld.javaになるということですよね。
OddDev 2016

あなたは方法がある場合、「スマーフ」の問題が多いXXXTest()中をcom.hello.world.test.helloWorldTest.java。一般的なアドバイスは、パスに「テスト」が1回だけ表示されるようにすることです。そのため、(a)パッケージ名でテストを使用します(そしてテストファイルにテスト中のファイルと同じ名前を付けます)または(b)パッケージ名を同じで、ファイル/クラス名に「test」を追加します。
David Arno

@DavidArnoああ、説明ありがとうございます!最初のコメントを間違えました。分かりました。
OddDev

まあ、私はそれを主張したいことは不明であったならば、私は私の最初のコメント間違っ:)ました
デビッドアルノ

回答:


11

それは良い慣習です。

場合によっては、パッケージプライベートクラスおよびメソッドの単体テストも作成する必要があります。別のパッケージに配置された単体テストクラスからそれらを呼び出すことはできません。

本番用コードをコンパイルまたは実行するときにクラスパスに含めてはならないので、ユニットテストクラスを同じ名前空間に置くことに混乱はありません。

以下は、パブリックインターフェイス、パブリックファクトリクラス、および2つのパッケージプライベート実装クラスを持つ小さなモジュールの例です。

src/main/java:
    com.hello.transmogrifier
        public interface Transmogrifier
        public class TransmogrifierFactory
        class MapTransmogrifier implements Transmogrifier
        class ListTransmogrifier implements Transmogrifier

scr/test/java:
    com.hello.transmogrifier
        public class TransmogrifierFactoryTest
        public class MapTransmogrifierTest
        public class ListTransmogrifierTest

Transmogrifierインターフェースの実装を非表示にすることは、有効な設計上の選択になる可能性があります。おそらく、実装を選択するのはファクトリクラスの責任です。

実装はパッケージプライベートであるため、単体テストクラスを直接テストする場合は、同じパッケージに配置する必要があります。ユニットテストクラスが他のパッケージに含まれている場合、テストからパブリックインターフェイスとファクトリクラスに直接アクセスすることしかできません。


1
「通常は、パッケージプライベートクラスとメソッドの単体テストも作成する必要があります」。番号!これは本当に悪い習慣です。パッケージのプライベートタイプは実装の詳細であり、直接テストすることはできません。公開APIのみをテストしてください。
David Arno、

1
@DavidArno同意しない。しかし、その特定の議論を避けるために、「通常」という言葉を「時々」という言葉に置き換えました。
から来

1
あなたが望むものすべてに同意しないかもしれませんが、コードの一部の内部動作をテストすると、それらの内部動作とテストの間の密結合と、単純なリファクタリングでさえも簡単に壊れる壊れやすいテストの両方につながります。それは非常に悪い習慣です。
David Arno

すべてのTransmogrifier実装が機能することを確認したい場合は、ファクトリーの動作に関係なく、各実装をテストする単体テストを作成します。クラスがパッケージプライベートであっても、実装には共有パブリックAPIがあることに注意してください。公開APIを変更しない限り、これらのテストは中断しないはずです。実際、私はおそらくTransmogrifierの一般的なテストを作成し、それを各実装に対して実行します。ファクトリを使用して各実装を取得することは可能ですが、Transmogrifiersをテストするときは、その依存関係を持たない方がよいでしょう。
から来

その後、ある日、それらを1つのクラスにできるかどうかを確認しMapTransmogrifierListTransmogrifier決定したので、を作成しListMapTransmogrifier、それを使用するようにファクトリを変更して、2つのクラスを削除します。あなたは、両方ですべてのテストを変更する必要がありますので、コードは今、コンパイルされないMapTransmogrifierTestListTransmogrifierTest、それはコンパイル取得します。テストは失敗します。テストの変更または作成によるものListMapTransmogrifierですか?デバッガーがそれを見つけ出します...あるいは、テストがファクトリーを使用するとき、あなたはそのリファクタリングを行い、すべてがコンパイルされます...
David Arno
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.