JUnit 4とTestNGは以前は比較可能でした。 2つのテストフレームワークの長所と短所は何ですか?
今日、TestNGとJUnit4を比較していましたが、テストフレームワークの限られた経験で指摘できる主な利点は、TestNGがデータプロバイダーの概念でパラメーター化されたテストをよりエレガントに処理できることです。
JUnit4でわかる限り、テストするパラメーターのセットごとに個別のテストクラスを作成する必要があります(@RunWith(Parameterized.class)
で実行)。 TestNGを使用すると、1つのテストクラスに複数のデータプロバイダーを含めることができるため、1つのクラスのすべてのテストを1つのテストクラスに保持することもできます。
これまでのところ、JUnit4よりもTestNGの利点として指摘できるのはこれだけです。
Intellij IDEAは、すぐに使用可能なTestNGとJUnitのサポートを含みます。ただし、Eclipseはすぐに使用できるJUnitのみをサポートし、TestNGプラグインをインストールして動作させる必要があります。
ただし、TestNGで遭遇したより厄介な問題は、PowerMockを使用してテストの依存関係を模擬する場合、テストクラスでPowerMockTestCase
を拡張する必要があることです。どうやら、テストフレームワークが特別なメソッドまたはtestng.xml
スイート定義を介してPowerMockを使用する場合に知っておく必要があるオブジェクトファクトリを構成する方法がありますが、現時点では壊れているようです。私はテストクラスがテストフレームワーククラスを拡張することを嫌います、それはハックのようです。
PowerMockを使用しない場合、これはもちろん問題ではありませんが、全体として、JUnit4の方がより適切にサポートされているという印象を受けます。
両方のフレームワークでの私の経験に基づいて、testngにはいくつかの便利な機能があり、JUnitチームは数年前から実装を拒否しています。この理由から、私はJUnitよりもそれを好みます。 testngへの変換は基本的にJUnitのほとんどすべてをサポートしているため(Eclipse用のコンバータープラグインもあります)、これらの機能が不足しているため、JUnitへの変換はそれほどうまくありません。
Testngでは、@BeforeClass
メソッドは静的ではなく、テストクラスがロードされたとき(JUnitの動作)ではなく、そのクラスのテストが実行される前に実行されます。私はかつて、すべてのデータベーステスト(数十件)が最初からデータベースを初期化するJUnitプロジェクトを持っていました。これは非常にばかげた動作でした。 JUnitコミュニティでは、これについて賛否両論がありました。その要点は、すべてのテストメソッドに独自のテストフィクスチャが必要であり、したがって、インスタンス変数を1回こっそり設定してからすべてのテストで使用できるため、静的でないbeforeAllスタイルメソッドを使用しないようにすることでした。有効ですが、統合テストには本当に迷惑です。 TestNGでは、ユーザーがここで選択できます。 Junitは、設計上、面倒ではありません。
Testngデータプロバイダーは、JUnitの同等物よりも少し柔軟性があります。テストごとに、JUnitのように1つのサイズがクラス全体のすべてのアプローチに適合するのではなく、どのデータプロバイダーメソッドが入力を提供する必要があるかを指定できます。そのため、1つのクラスでテスト用に正と負のケースデータプロバイダーを使用できます。とてもうれしいです。
Testngで@Test
を使用してクラスをマークアップできます。つまり、すべてのパブリックメソッドはテストです。 Junitでは、すべてのメソッドで@Test
をコピー/貼り付けする必要があります。
両方の面倒な点は、hamcrestがJUnitにバンドルされている方法と、JUnitがtestngにバンドルされている方法です。 Mavenには、この問題のない代替jarがあります。
両方のフレームワークに関する私の大きな心配は、両方が進化を止めたように見えることです。リリースの頻度はますます少なくなり、注目に値しない機能が少なくなる傾向があります。たとえば、BDD全体の動きは、どちらのフレームワークにもほとんど影響を与えていないようです。また、JUnitは、上にリストしたもののほとんどを単純に採用できたはずです。 JUnitがこれらのいずれも実装できない技術的な理由はありません。 JUnitの背後にいる人々は、これらを実装しないことを選択します。どちらのプロジェクトも同様に将来の方向性に対するビジョンを欠いているようで、過去数年間、ほんの少しの微調整を行って満足しているようです。
TestNGをJUnitに切り替える正当な理由を探していましたが、Tomek Kaczanowskiによる this スライドがこの質問に非常によく対応していることがわかりました。 Tomekは Practical Unit Testing 本の著者であり、開発者とテスターから非常に尊敬されているようです。
Java/Scalaプロジェクトで作業していて、Gradleが最適なビルドツールである場合、ScalaTest
フレームワークにはscala=テストを実行するJUnitRunner
しかありません。 。つまり、あなたには選択肢があります:
Mockitoをモックフレームワークとして使用できます。 TestNGとうまく統合します。 TestNGでMockitoを使用するためにクラスを拡張する必要はありません。この方法ではテストコードの結合が少なくなり、何らかの理由で他のモックフレームワークを使用する必要がある場合は、簡単に実行できます。
手短に..
スコープが、それらの間に依存関係のないきめ細かい詳細な単体テストに制限されている場合、JUnitを使用できます。
スコープで機能テストが必要な場合、テスト間で依存関係とデータ(パラメーター)の共有が必要な場合とそうでない場合は、TestNGを選択します。また、TestNGはJUnitと同様のユニットテストを実行できます。 SO単体テストスイートと機能テストスイートを使用できます。