88

JUnit 4 と TestNG は以前は同等でした。2 つのテスト フレームワークの長所と短所は何ですか?

4

6 に答える 6

29

今日、私は TestNG と JUnit4 を比較していましたが、テスト フレームワークでの私の限られた経験から指摘できる主な利点は、TestNG には、データ プロバイダーの概念を使用してパラメーター化されたテストを処理するより洗練された方法があることです。

JUnit4でわかる限り、テストしたいパラメータのセットごとに個別のテストクラスを作成する必要があります(で実行@RunWith(Parameterized.class))。TestNG を使用すると、1 つのテスト クラスに複数のデータ プロバイダーを含めることができるため、1 つのクラスのすべてのテストを 1 つのテスト クラスに保持することもできます。

これまでのところ、JUnit4 に対する TestNG の利点として指摘できるのはこれだけです。

Intellij IDEA には、すぐに使える TestNG と JUnit のサポートが含まれています。ただし、Eclipse はすぐに使用できる JUnit のみをサポートしており、それを機能させるには TestNG プラグインをインストールする必要があります。

ただし、TestNG で遭遇したさらに厄介な問題は、PowerMockTestCasePowerMock を使用してテストの依存関係をモックする場合、テスト クラスを拡張する必要があることです。PowerMock を特別なメソッドまたはtestng.xmlスイート定義を介して使用するときに、テスト フレームワークが知る必要があるオブジェクト ファクトリを構成する方法があるようですが、それらは現時点では壊れているようです。テストクラスがテストフレームワーククラスを拡張するのは嫌いです。ハックのようです。

PowerMock を使用しない場合、これはもちろん問題ではありませんが、全体として、JUnit4 の方がサポートされているという印象を受けます。

于 2013-04-20T11:07:58.987 に答える
17

両方のフレームワークでの私の経験に基づくと、testng には、JUnit チームが数年間実装を拒否してきた便利な機能がいくつかあります。この理由から、JUnit よりも好きです。testng への変換は簡単です。基本的には JUnit のほぼすべてをサポートするためです (Eclipse 用のコンバーター プラグインもあります)。

  • テスト@BeforeClassでは、メソッドは静的ではなく、テスト クラスがロードされるときではなく、そのクラスのテストが実行される前に実行されます (JUnit の動作)。以前、すべてのデータベース テスト (数ダース) が最初にデータベースを初期化する JUnit プロジェクトがありましたが、これは非常にばかげた動作でした。JUnit コミュニティでは、これに賛否両論の議論がありました。その要点は、すべてのテスト メソッドには独自のテスト フィクスチャが必要であり、非静的な beforeAll スタイル メソッドを使用しないでください。これにより、インスタンス変数を一度こっそり設定してから、すべてのテストで使用できるようになるためです。有効ですが、統合テストには本当に面倒です。TestNG は、ここでユーザーに選択肢を提供します。Junit は設計上そうしませんが、これは煩わしいことです。

  • テスト データ プロバイダーは、同等の JUnit よりも少し柔軟性があります。JUnit のようにクラス全体に 1 つのサイズですべてのアプローチを適用するのではなく、入力を提供するデータ プロバイダー メソッドをテストごとに指定できます。そのため、1 つのクラスでテスト用のポジティブ ケースとネガティブ ケースのデータ プロバイダーを使用できます。とても素敵です。

  • @Testin testng を使用してクラスをマークアップできます。つまり、すべての public メソッドがテストです。@TestJunitでは、すべてのメソッドをコピーして貼り付ける必要があります。

hamcrest が JUnit にバンドルされている方法と、JUnit が testng にバンドルされている方法は両方とも厄介です。Maven には、この問題のない別の jar があります。

両方のフレームワークに関する私の大きな懸念は、どちらも進化が止まっているように見えることです。リリースの頻度はますます低くなり、注目に値する機能がますます少なくなる傾向があります。たとえば、BDD の動き全体は、どちらのフレームワークにもほとんど影響を与えていないようです。また、JUnit は、私が上に挙げたもののほとんどを単純に採用できたはずです。JUnit がこれらの機能を実装できない技術的な理由はありません。JUnit の背後にいる人々は、これらを実装しないことを選択しただけです。どちらのプロジェクトも、将来の方向性についてのビジョンが欠けているようで、ここ数年は微調整を行っただけで満足しているようです。

于 2014-06-24T15:44:36.620 に答える
1

Java/Scala プロジェクトに取り組んでおり、Gradle を選択したビルド ツールの場合、フレームワークはscala テストを実行するScalaTestだけでよいことに注意してください。JUnitRunnerつまり、次の選択肢があります。

  • Java JUnit テスト + JUnitRunner で実行される Scala テスト => Gradle 統合の改善
  • Java testNG テスト + Scala テストは Scala Runner で実行されます => Gradle 統合が不十分です。これは、scala テスト ランナーが Gradle の観点からは単一の一括タスクであるためです。
于 2015-04-30T12:45:01.543 に答える