JUnit 4 と TestNG は以前は同等でした。2 つのテスト フレームワークの長所と短所は何ですか?
6 に答える
今日、私は TestNG と JUnit4 を比較していましたが、テスト フレームワークでの私の限られた経験から指摘できる主な利点は、TestNG には、データ プロバイダーの概念を使用してパラメーター化されたテストを処理するより洗練された方法があることです。
JUnit4でわかる限り、テストしたいパラメータのセットごとに個別のテストクラスを作成する必要があります(で実行@RunWith(Parameterized.class)
)。TestNG を使用すると、1 つのテスト クラスに複数のデータ プロバイダーを含めることができるため、1 つのクラスのすべてのテストを 1 つのテスト クラスに保持することもできます。
これまでのところ、JUnit4 に対する TestNG の利点として指摘できるのはこれだけです。
Intellij IDEA には、すぐに使える TestNG と JUnit のサポートが含まれています。ただし、Eclipse はすぐに使用できる JUnit のみをサポートしており、それを機能させるには TestNG プラグインをインストールする必要があります。
ただし、TestNG で遭遇したさらに厄介な問題は、PowerMockTestCase
PowerMock を使用してテストの依存関係をモックする場合、テスト クラスを拡張する必要があることです。PowerMock を特別なメソッドまたはtestng.xml
スイート定義を介して使用するときに、テスト フレームワークが知る必要があるオブジェクト ファクトリを構成する方法があるようですが、それらは現時点では壊れているようです。テストクラスがテストフレームワーククラスを拡張するのは嫌いです。ハックのようです。
PowerMock を使用しない場合、これはもちろん問題ではありませんが、全体として、JUnit4 の方がサポートされているという印象を受けます。
両方のフレームワークでの私の経験に基づくと、testng には、JUnit チームが数年間実装を拒否してきた便利な機能がいくつかあります。この理由から、JUnit よりも好きです。testng への変換は簡単です。基本的には JUnit のほぼすべてをサポートするためです (Eclipse 用のコンバーター プラグインもあります)。
テスト
@BeforeClass
では、メソッドは静的ではなく、テスト クラスがロードされるときではなく、そのクラスのテストが実行される前に実行されます (JUnit の動作)。以前、すべてのデータベース テスト (数ダース) が最初にデータベースを初期化する JUnit プロジェクトがありましたが、これは非常にばかげた動作でした。JUnit コミュニティでは、これに賛否両論の議論がありました。その要点は、すべてのテスト メソッドには独自のテスト フィクスチャが必要であり、非静的な beforeAll スタイル メソッドを使用しないでください。これにより、インスタンス変数を一度こっそり設定してから、すべてのテストで使用できるようになるためです。有効ですが、統合テストには本当に面倒です。TestNG は、ここでユーザーに選択肢を提供します。Junit は設計上そうしませんが、これは煩わしいことです。テスト データ プロバイダーは、同等の JUnit よりも少し柔軟性があります。JUnit のようにクラス全体に 1 つのサイズですべてのアプローチを適用するのではなく、入力を提供するデータ プロバイダー メソッドをテストごとに指定できます。そのため、1 つのクラスでテスト用のポジティブ ケースとネガティブ ケースのデータ プロバイダーを使用できます。とても素敵です。
@Test
in testng を使用してクラスをマークアップできます。つまり、すべての public メソッドがテストです。@Test
Junitでは、すべてのメソッドをコピーして貼り付ける必要があります。
hamcrest が JUnit にバンドルされている方法と、JUnit が testng にバンドルされている方法は両方とも厄介です。Maven には、この問題のない別の jar があります。
両方のフレームワークに関する私の大きな懸念は、どちらも進化が止まっているように見えることです。リリースの頻度はますます低くなり、注目に値する機能がますます少なくなる傾向があります。たとえば、BDD の動き全体は、どちらのフレームワークにもほとんど影響を与えていないようです。また、JUnit は、私が上に挙げたもののほとんどを単純に採用できたはずです。JUnit がこれらの機能を実装できない技術的な理由はありません。JUnit の背後にいる人々は、これらを実装しないことを選択しただけです。どちらのプロジェクトも、将来の方向性についてのビジョンが欠けているようで、ここ数年は微調整を行っただけで満足しているようです。
Java/Scala プロジェクトに取り組んでおり、Gradle を選択したビルド ツールの場合、フレームワークはscala テストを実行するScalaTest
だけでよいことに注意してください。JUnitRunner
つまり、次の選択肢があります。
- Java JUnit テスト + JUnitRunner で実行される Scala テスト => Gradle 統合の改善
- Java testNG テスト + Scala テストは Scala Runner で実行されます => Gradle 統合が不十分です。これは、scala テスト ランナーが Gradle の観点からは単一の一括タスクであるためです。