JUnitとTestNG [終了]


125

職場では、現在もJUnit 3を使用してテストを実行しています。新しいテストを作成するためにJUnit 4への切り替えを検討してきましたが、しばらくの間、TestNGに注目しています。JUnit 4またはTestNGのいずれかで、どのような経験をしましたか。これは、非常に多数のテストでうまく機能するようです。私たちの機能テストは幅広い側面をカバーしており、結果を得るにはさまざまな方法で記述する必要があるため、テストの記述に柔軟性を持たせることも重要です。

古いテストはうまく機能するため、書き直されることはありません。新しいテストで私が見たいのは、テストの記述方法の柔軟性、自然なアサーション、グループ化、簡単に配布できるテストの実行です。


10
08から今までの変更点????
some_other_guy 2012

使用するだけでTestNG、JUnitのすべての機能が利用できます。
Eric Wang

回答:


67

私は両方を使用しましたが、既存のテストを新しい形式に書き換えることを本当に考慮すべきではないというジャスティンスタンダードに同意する必要があります。決定に関係なく、両方を実行するのは非常に簡単です。TestNGは、JUnitよりもはるかに構成可能であるよう努めていますが、最終的にはどちらも同等にうまく機能します。

TestNGには、テストを特定のグループとしてマークし、特定のグループのすべてのテストを簡単に実行したり、特定のグループのテストを除外したりできる、きちんとした機能があります。したがって、実行が遅いテストを「遅い」グループのようにマークし、迅速な結果が必要な場合は無視することができます。彼らのドキュメンテーションからの提案は、新しいファイルをチェックインするたびに実行する必要がある「チェックイン」テストとして一部のサブセットをマークすることです。私はそのような機能をJUnitで見たことはありません。 t本当にお見逃しなく。

高い構成の主張については、2週間前にやりたかったことを実行できなかったコーナーケースに遭遇しました。それが何であるかを思い出せればいいのですが、それを持ち出したくなりました。あなたはそれが完璧ではないことを知っています。

TestNGの最大の利点は注釈です...とにかくJUnitはバージョン4で追加されました。


14
JUnitは、テストスイートを定義し、目的のグループのテストをそのスイートに追加することで、話しているグループ化を実行できます。次に、そのスイートのみを実行するAntスクリプトでターゲットを設定し、チェックイン時にそのターゲットを実行するようにソース管理を設定できます。
ジャスティンスタンダード

8
TestNGがJUnitよりも優れている最大の利点は、パラメーター化されたテストのテストデータを動的に生成できることです。各テストデータ要素は異なる「テスト」であるため、データ駆動型テストを簡単に作成できますtestng.org/doc/documentation-main.html#parameters
davetron5000

6
パラメータ化されたテストは、新しいバージョンのJunitに統合されているTheoriesを使用して簡単に実行できます(現時点では実験段階です)。
Mnementh 2009

9
TestNGグループは、JUnit 4.8のカテゴリ:kentbeck.github.com/junit/doc/ReleaseNotes4.8.htmlで実行できます。
海津

言及されていないいくつかのこと:TestNGの最大の利点は、各テストメソッドに渡したのと同じパラメーターを、前後のテスト構成メソッドにも渡すことができることです。これは、セットアップとティアダウンに非常に役立ち、IMHOが非常に強力です。それを理解していない場合は、それを必要としないかもしれません。また、コードでテストスイートを定義する方法も気に入っています。
djangofan 2017年

20

まず、最新の流行に合わせてすべてのテストを書き直さないでください。Junit3は完全にうまく機能し、4でのアノテーションの導入は(私の意見では)それほど買いません。皆さんテストを書くことははるかに重要であり、それはあなたが行うように聞こえます。

最も自然に見えるものを使用し、作業を完了するのに役立ちます。

TestNG b / cについてはコメントできません。使用していません。しかし、どの経路をとっても、JUnit / TestNG / DBUnit / EasyMockの優れたラッパーであるunitilsをお勧めします。(上記のすべてのフレーバーをサポートしています)


1
Unitilsはしばらく更新されていないようです。JUnit / TestNGの新しいバージョンで動作しますか?
チャイナサー

2011年にこの答えを見つけた人のために、私は確認しました。最新のunitilsバージョン(3.2)のリリース日は2011-09-29です。だから、されて積極的に維持されています。
Ogre Psalm33

18

TestNGの最大のドローカードには、サポートテストグループが含まれます。さらに重要なのは、テストグループの依存関係です(テストがグループに依存しているとマークすると、依存グループに障害が発生したときにテストの実行がスキップされます)。

TestNGの他の私にとっての大きなドローカードには、テストパラメーター、データプロバイダー、アノテーショントランスフォーマーなど、何よりも-活気があり応答性の高いユーザーコミュニティが含まれます。

表面的には、上記のTestNGs機能のすべてが必要ではないかもしれないとは思わないかもしれませんが、テストにもたらす柔軟性を理解し始めると、JUnitにどのように対処したのか不思議に思うでしょう。

(免責事項-私はJUnit 4.xをまったく使用していないため、そこでの進歩や新機能について実際にコメントすることはできません)。


3
私はJUnit4とTestNGの両方を使用していますが、TestNGは春の春とテストの統合をよりよくサポートしています。Springベースのアプリケーションのテストがはるかに簡単になります。
hidralisk

18

約1年前、同じ問題がありました。どちらの方が優れているかを検討していたところ、TestNGには「キラー機能」がないことに気付きました。それは素晴らしく、JUnit 4にはないいくつかの機能がありますが、私たちはそれらを必要としません。
たくさんのテストを書き続けてもらいたいので、TestNGについて知りながら、テストの書き方に違和感を感じたくありませんでした。
また、JUnitはJavaの世界では事実上の標準です。箱からそれをサポートしないまともなツールはありません、あなたはウェブで多くの助けを見つけることができ、彼らはそれが生きていることを示す昨年の多くの新機能を追加しました。

私たちはJUnitに固執することを決め、振り返ることはありませんでした。


私見、TestNGのキラー機能は、BeforeおよびAfterセットアップメソッドを介してコンテキスト引数を渡す機能です。そこではJunitができない多くのきちんとした手品を行うことができます。95%の人は、TestNGをよく学ぶことを気にせず、それに無知です。また、TestNGにはDataProviderを介したスレッド化の優れた方法がありますが、それを利用する場合のみです。また、testng.xmlにはBeanshellを含めることができます。
djangofan

17

上記すべてに乾杯。私がTestNGで私がもっと好きだと私が見つけた他のいくつかは次のとおりです:

  1. @BeforeClassあなたはそれだけであなたのクラスの静的メソッドを呼び出すことができることによって制約されていないので、TestNGのためには、クラスの作成後に行われます。

  2. 並列テストとパラメーター化されたテスト、たぶん私には十分な寿命がないかもしれません...しかし、ドライバー名をパラメーターとして受け入れて、Seleniumテストの1つのセットを作成するキックを手に入れました。次に、IE、FF、およびChromeドライバーごとに1つずつ、3つの並行テストグループを定義し、レースを監視します。私は最初は4を行いましたが、私が取り組んだページが多すぎるHtmlUnitため、何らかの理由でドライバーが壊れてしまいました。

ええ、おそらくその人生を見つける必要があります。;)


最後に、すべてがうーん後のいくつかの肉付きのコメントそれらは両方とも等しいです。そして、awwhing
user2412398

そう、TestNGルール:TestNG DataProviderからもテスト引数を介してドライバーインスタンスをロードします。ここで私はそれをやった方法です: github.com/djangofan/yet-another-selenium-framework/blob/master/...は
djangofan

10

今日出会ったものを共有したかった。TestNGと比較すると、Junit4では組み込みのパラメーター化されたランナーがかなり粗雑であることがわかりました(各フレームワークにはまだ長所があることはわかっていますが)。Junit4アノテーション@parametersは、1つのパラメーターセットに制限されています。同じテストクラスで機能の有効な動作と無効な動作をテストしているときにこの問題が発生しました。したがって、最初に見つかった静的なアノテーション付きのパブリックメソッドが使用されますが、それらは任意の順序で見つけることができます。これにより、さまざまなクラスが不必要に記述されます。ただし、TestNGは、すべてのメソッドに異なる種類のデータプロバイダーを提供するクリーンな方法を提供します。そのため、有効/無効データを別々に配置して、同じテストクラスで有効な方法と無効な方法で同じコードのユニットをテストできます。TestNGを使用します。


7

また、TestNGのもう1つの利点は、並列テストのサポートです。マルチコアの時代では、それは重要だと思います。

両方のフレームワークも使用しました。しかし、私はアサーションにhamcrestを使用しています。Hamcrestを使用すると、独自のassertメソッドを簡単に作成できます。だから代わりに

assertEquals(operation.getStatus(), Operation.Status.Active);

あなたは書ける

assertThat(operation, isActive());

これにより、テストでより高いレベルの抽象化を使用する機会が与えられます。これにより、テストがより堅牢になります。


7

JUnit 4対TestNG – mkyong.comによる比較(2013年更新)。

結論:TestNGは、Javaプロジェクトのコアユニットテストフレームワークとして使用することをお勧めします。TestNGは、パラメーター化テスト、依存関係テスト、スイートテスト(グループ化の概念)がより進んでいるためです。

TestNGは、機能的な高レベルのテストと複雑な統合テストを対象としています。その柔軟性は、大規模なテストスイートで特に役立ちます。

加えて、 TestNGはJUnit4のコア機能全体もカバーしています。私がJUnitをもう使う理由はありません。

簡単な言葉で、 TestNG = JUnit +たくさん。それで、なぜ議論するのですか?行き、TestNGをつかむ:-)

詳細な比較については、こちらをご覧ください


5

マイク・ストーンの返答へのいくつかの追加:

1)TestNGのグループを最も頻繁に使用するのは、テストスイートで単一のテストメソッドを実行する場合です。このテストを "phil"グループに追加して、このグループを実行するだけです。JUnit 3を使用していたとき、「suite」メソッドで実行したいメソッド以外のすべてのメソッドのエントリーをコメントアウトしましたが、チェックインする前にコメントを解除することを忘れていました。グループがあれば、この問題はもうありません。

2)テストの複雑さに応じて、JUnit3からTestNGへのテストの移行は、sedを使用していくらか自動的に実行され、基本クラスを作成して、静的にすべてのTestNGアサートメソッドをインポートするTestCaseを置き換えることができます。

JUnitからTestNGへの移行に関する情報は、こちらこちらにあります


意図していない変更のチェックインに関する問題は、実際にはチェックインしている内容を確認する必要があるためです。そして、大きなチェックインがある場合、それは言い訳にはなりません。それは別の問題です。小さなチェックインがたくさんあるはずです。
ヒドラリスク

5

JUnitの代わりにTestNGを使用する理由

  1. 宣言@BeforeClass@AfterClassメソッドは、メソッド宣言ではTestNGの中に多くの柔軟性があり、一方のJUnitで静的である必要があり、それはこれらの制約を持っていません。

  2. TestNGでは、2つの方法を使用してテストをパラメーター化できます。@Parameterまたは@DataProviderアノテーション。

    i)キー値のマッピングが必要な単純な場合の@Parameter(データはxmlファイルを通じて提供されます)

    ii)複雑なケースでは@DataProvider。2次元配列を使用して、データを提供できます。

  3. TestNGでは、@ DataProviderメソッドは静的である必要がないため、同じテストクラスで複数のデータプロバイダーメソッドを使用できます。

  4. 依存テスト: TestNGでは、最初のテストが失敗した場合、後続のすべての依存テストはスキップされ、失敗とマークされません。しかし、JUnitは失敗とマークしました。

  5. グループ化:単一のテストは複数のグループに属し、さまざまなコンテキストで実行できます(低速または高速のテストなど)。JUnitカテゴリーにも同様の機能が存在しますが、テストの初期化/破棄を可能にする@BeforeGroups / @AfterGroups TestNGアノテーションがありません。

  6. 並列処理:同じテストを複数のスレッドで並行して実行したい場合、TestNGは使いやすいアノテーションでカバーしていますが、JUnitはそのままでは簡単な方法を提供しません。

  7. TestNG @DataProviderは、データ、CSV、またはプレーンテキストファイルをフィードするためのXMLもサポートできます。

  8. TestNGを使用すると、テスト間の依存関係を宣言し、依存関係テストに合格しなかった場合はテストをスキップできます。

@Test(dependsOnMethods = {"dependOnSomething"})

この機能はJUnitには存在しません

  1. 報告:

TestNGレポートは、デフォルトで、すべてのテストデータ、合格/不合格/スキップ、実行時間、使用された入力、完全なテストログを含むHTMLレポートを含むテスト出力フォルダーに生成されます。さらに、独自のレポートテンプレートを作成するために使用できるXMLファイルにすべてをエクスポートします。

JUnitのフロントでは、このデータはすべてXMLでも利用できますが、すぐに使用できるレポートはなく、プラグインに依存する必要があります。

リソースリンク:

  1. JUnitとTestNGの簡単な比較
  2. JUnitとTestNG:どちらのテストフレームワークを選択すればよいですか?

このチュートリアルでは、良い違いが並べて示されています。TestNGとJUnit:違いは何ですか?


TestNGの最も特徴的な機能であるIHMOをリストしていませんでした。BeforeメソッドとAfterメソッドにコンテキスト引数を渡す機能で、これにより魔法をかけることができます。例として、DataProviderはこのように機能します。
djangofan

3

あなたの質問は私には二つ折りになっているようです。1つは2つのテストフレームワークを比較したい、もう1つはテストを簡単に実装したい、自然なアサーションが欲しい、などです...

わかりました。まず、JUnitは機能の点でTestNGに追いついてきました。v4とのギャップをいくつか埋めましたが、私の意見では十分ではありません。アノテーションやデータプロバイダーなどは、TestNGではさらに優れています。また、TestNGにはテストの依存関係、グループ化、および順序付けがあるため、テストの実行に関してより柔軟です。

JUnitでは、特定のbefore / afterメソッドを静的にする必要があります。これにより、テストの実行前に実行できる操作が制限されます。TestNGでこの問題が発生することはありません。

TBH、2つのフレームワークの違いのほとんどは、統合/自動化テストに焦点を当てない限り、あまり意味がありません。私の経験からのJUnitは、単体テスト用にゼロから構築され、現在はより高いレベルのテストに向けて推進されています。IMOは、このジョブに適したツールではありません。TestNGは単体テストでうまく機能し、その強力なデータ提供と優れたテスト実行能力により、統合/自動化テストレベルでさらにうまく機能します。

ここで私が別の問題であると私が信じているのは、適切に構造化され、読みやすく、保守可能なテストを作成する方法です。そのほとんどはご存じでしょうが、Factory PatternCommand PatternPageObjects(テスト用のWebサイトの場合)などは非常に重要です。テスト(SUT)と実際のテストの間に抽象層を設けることが非常に重要です。 is(ビジネスロジックのアサーション)。より優れたアサーションを取得するために、Hamcrestを使用できます。javasの継承/インターフェースを利用して、繰り返しを減らし、共通性を強化します。

ほとんど忘れて、Test Data Builder Patternも使用します。これをTestNGのデータプロバイダーアノテーションと組み合わせると、非常に便利です。


3

TestNGが本当にはるかに強力になる理由についての私の意見:

1.  JUnit still requires the before/after class methods to be static, which limits
    what you can do prior to the running of tests, TestNG never has this issue.

2.  TestNG @Configuration methods can all take an optional argument to their 
    annotated methods in the form of a ITestResult, XmlTest, Method, or 
    ITestContext.  This allows you to pass things around that JUnit wouldn't 
    provide you.  JUnit only does this in listeners and it is limited in use.

3.  TestNG comes with some pre-made report generation classes that you can copy
     and edit and make into your own beautiful test output with very little 
     effort. Just copy the report class into your project and add a listener 
     to run it.  Also, ReportNG is available.

4.  TestNG has a handful of nice listeners that you can hook onto so you can do
     additional AOP style magic at certain phases during testing.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.