JUnit 4対TestNG –比較
JUnit 4とTestNGは、どちらもJavaで非常に人気のある単体テストフレームワークです。 両方のフレームワークの機能は非常に似ています。 どっちがいいですか? Javaプロジェクトで使用するユニットテストフレームワークはどれですか?
ここでは、JUnit 4とTestNGの機能比較を行いました。
1. 注釈のサポート
アノテーションサポートは、JUnit 4とTestNGの両方で実装されています。
特徴 | JUnit 4 | TestNG |
---|---|---|
テストアノテーション |
@テスト |
@テスト |
このスイートのすべてのテストが実行される前に実行する |
— |
@BeforeSuite |
このスイートのすべてのテストが実行された後に実行する |
— |
@AfterSuite |
テストの前に実行 |
— |
@BeforeTest |
テスト後に実行 |
— |
@AfterTest |
これらのグループのいずれかに属する最初のテストメソッドが呼び出される前に実行する |
— |
@BeforeGroups |
これらのグループのいずれかに属する最後のテストメソッドが呼び出された後に実行します |
— |
@AfterGroups |
現在のクラスの最初のテストメソッドが呼び出される前に実行する |
@BeforeClass |
@BeforeClass |
現在のクラスのすべてのテストメソッドが実行された後に実行されます |
@放課後 |
@放課後 |
各テストメソッドの前に実行 |
@前 |
@BeforeMethod |
各テストメソッドの後に実行 |
@後 |
@AfterMethod |
テストを無視する |
@ignore |
@Test(enbale = false) |
予想される例外 |
@Test(expected = ArithmeticException.class) |
@Test(expectedExceptions = ArithmeticException.class) |
タイムアウト |
@Test(timeout = 1000) |
@Test(timeout = 1000) |
JUnit4とTestNGの主なアノテーションの違いは次のとおりです。
1. JUnit 4では、「@ BeforeClass」および「@AfterClass」メソッドを静的メソッドとして宣言する必要があります。 TestNGはメソッド宣言の柔軟性が高く、この制約はありません。
2. 3つの追加のセットアップ/ティアダウンレベル:スイートとグループ(@ Before / AfterSuite、@ Before / AfterTest、@ Before / AfterGroup)。 もっと見るdetail here.
JUnit 4
@BeforeClass public static void oneTimeSetUp() { // one-time initialization code System.out.println("@BeforeClass - oneTimeSetUp"); }
TestNG
@BeforeClass public void oneTimeSetUp() { // one-time initialization code System.out.println("@BeforeClass - oneTimeSetUp"); }
JUnit 4では、注釈の命名規則は少し混乱します。たとえば、「前」、「後」、「期待」などです。「前」と「後」が何であるか、テストから「期待」するものがわかりません。方法? TestiNGはわかりやすく、代わりに「BeforeMethod」、「AfterMethod」、および「ExpectedException」を使用します。
2. 例外テスト
「例外テスト」とは、単体テストからどの例外がスローされるかを意味し、この機能はJUnit 4とTestNGの両方に実装されています。
JUnit 4
@Test(expected = ArithmeticException.class) public void divisionWithException() { int i = 1/0; }
TestNG
@Test(expectedExceptions = ArithmeticException.class) public void divisionWithException() { int i = 1/0; }
3. テストを無視
「無視」は、単体テストを無視する必要があるかどうかを意味します。この機能はJUnit 4とTestNGの両方に実装されています。
JUnit 4
@Ignore("Not Ready to Run") @Test public void divisionWithException() { System.out.println("Method is not ready yet"); }
TestNG
@Test(enabled=false) public void divisionWithException() { System.out.println("Method is not ready yet"); }
4. タイムテスト
「タイムテスト」とは、ユニットテストの実行に指定されたミリ秒数よりも長い時間がかかる場合、テストが終了し、失敗としてマークされる場合、この機能はJUnit 4とTestNGの両方に実装されます。
JUnit 4
@Test(timeout = 1000) public void infinity() { while (true); }
TestNG
@Test(timeOut = 1000) public void infinity() { while (true); }
5. スイートテスト
「スイートテスト」とは、いくつかのユニットテストをまとめて実行することを意味します。 この機能は、JUnit 4とTestNGの両方に実装されています。 ただし、両方とも非常に異なる方法を使用して実装しています。
JUnit 4
「@RunWith」および「@Suite」は、スイートテストの実行に使用されます。 以下のクラスは、JunitTest5の実行後にユニットテスト「JunitTest1」と「JunitTest2」の両方が同時に実行されることを意味します。 すべての宣言はクラス内で定義されます。
@RunWith(Suite.class) @Suite.SuiteClasses({ JunitTest1.class, JunitTest2.class }) public class JunitTest5 { }
TestNG
スイートテストの実行にはXMLファイルが使用されます。 以下のXMLファイルは、ユニットテスト「TestNGTest1」と「TestNGTest2」の両方が一緒に実行されることを意味します。
TestNGは、バンドルクラスのテスト以上のことができ、メソッドテストもバンドルできます。 TestNG独自の「グループ化」コンセプトにより、すべてのメソッドはグループに結び付けられ、機能に従ってテストを分類できます。 例えば、
これは、4つのメソッド、3つのグループ(method1、method2、method3)を持つクラスです
@Test(groups="method1") public void testingMethod1() { System.out.println("Method - testingMethod1()"); } @Test(groups="method2") public void testingMethod2() { System.out.println("Method - testingMethod2()"); } @Test(groups="method1") public void testingMethod1_1() { System.out.println("Method - testingMethod1_1()"); } @Test(groups="method4") public void testingMethod4() { System.out.println("Method - testingMethod4()"); }
次のXMLファイルを使用すると、グループ「method1」のみで単体テストを実行できます。
「グループ化」テストのコンセプトにより、統合テストの可能性は無限です。 たとえば、すべての単体テストクラスの「DatabaseFuntion」グループのみをテストできます。
6. パラメータ化されたテスト
「パラメーター化されたテスト」とは、単体テストのパラメーター値を変えることを意味します。 この機能は、JUnit 4とTestNGの両方に実装されています。 ただし、両方とも非常に異なる方法を使用して実装しています。
JUnit 4
「@RunWith」と「@Parameter」は、ユニットテストのパラメーター値を提供するために使用され、@ ParametersはList []を返す必要があり、パラメーターは引数としてクラスコンストラクターに渡されます。
@RunWith(value = Parameterized.class) public class JunitTest6 { private int number; public JunitTest6(int number) { this.number = number; } @Parameters public static Collection
ここには多くの制限があります。 「JUnit」の方法に従ってパラメーターを宣言する必要があり、クラスメンバーをテスト用のパラメーター値として初期化するには、パラメーターをコンストラクターに渡す必要があります。 パラメータクラスの戻り値の型は「List []」で、データはテスト用の文字列またはプリミティブ値に制限されています。
TestNG
XMLファイルまたは「@DataProvider」は、テスト用のさまざまなパラメーターを提供するために使用されます。
XML file for parameterized test.
「@Parameters」のみがテスト用のパラメーターを必要とするメソッドで宣言します。パラメトリックデータはTestNGのXML構成ファイルで提供されます。 これを行うことにより、異なるデータセットで単一のテストケースを再利用し、異なる結果を得ることができます。 さらに、エンドユーザー、QAまたはQEでさえ、テスト用にXMLファイルで独自のデータを提供できます。
単体テスト
public class TestNGTest6_1_0 { @Test @Parameters(value="number") public void parameterIntTest(int number) { System.out.println("Parameterized Number is : " + number); } }
XMLファイル
パラメータ化されたテスト用の@DataProvider。
データ値をXMLファイルに取り込むことは非常に便利ですが、テストでは複雑な型が必要になることがあります。複雑な型は文字列やプリミティブ値として表すことができません。 TestNGは、@ DataProviderアノテーションを使用してこのシナリオを処理します。これにより、複雑なパラメータータイプのテストメソッドへのマッピングが容易になります。
パラメータとしてのVector、StringまたはIntegerの@DataProvider
@Test(dataProvider = "Data-Provider-Function") public void parameterIntTest(Class clzz, String[] number) { System.out.println("Parameterized Number is : " + number[0]); System.out.println("Parameterized Number is : " + number[1]); } //This function will provide the patameter data @DataProvider(name = "Data-Provider-Function") public Object[][] parameterIntTestProvider() { return new Object[][]{ {Vector.class, new String[] {"java.util.AbstractList", "java.util.AbstractCollection"}}, {String.class, new String[] {"1", "2"}}, {Integer.class, new String[] {"1", "2"}} }; }
@DataProvider for object as parameter
P.S“ TestNGTest6_3_0”は、デモ用のgetsetメソッドを備えた単純なオブジェクトです。
@Test(dataProvider = "Data-Provider-Function") public void parameterIntTest(TestNGTest6_3_0 clzz) { System.out.println("Parameterized Number is : " + clzz.getMsg()); System.out.println("Parameterized Number is : " + clzz.getNumber()); } //This function will provide the patameter data @DataProvider(name = "Data-Provider-Function") public Object[][] parameterIntTestProvider() { TestNGTest6_3_0 obj = new TestNGTest6_3_0(); obj.setMsg("Hello"); obj.setNumber(123); return new Object[][]{ {obj} }; }
TestNGのパラメーター化されたテストは、非常にユーザーフレンドリーで柔軟です(XMLファイルまたはクラス内)。 パラメーター値として多くの複雑なデータ型をサポートでき、可能性は無限です。 上記の例のように、パラメータ化されたテスト用に独自のオブジェクト(TestNGTest6_3_0)を渡すこともできます
7. 依存性テスト
「パラメータ化されたテスト」とは、メソッドが依存関係に基づいたテストであり、目的のメソッドの前に実行されることを意味します。 依存メソッドが失敗した場合、その後のすべてのテストはスキップされ、失敗としてマークされません。
JUnit 4
JUnitフレームワークはテストの分離に重点を置いています。現時点ではこの機能をサポートしていません。
TestNG
「dependOnMethods」を使用して、次のように依存性テストを実装します
@Test public void method1() { System.out.println("This is method 1"); } @Test(dependsOnMethods={"method1"}) public void method2() { System.out.println("This is method 2"); }
「method2()」は、「method1()」が正常に実行された場合にのみ実行されます。それ以外の場合、「method2()」はテストをスキップします。
結論
すべての機能の比較を検討した後、TestNGはJavaプロジェクトのコア単体テストフレームワークとして使用することをお勧めします。 TestNGは、高レベルのテストと複雑な統合テストを目的としています。 その柔軟性は、大規模なテストスイートで特に役立ちます。 さらに、TestNGはJUnit4のコア機能全体もカバーしています。 私がもうJUnitを使用する理由はありません。
参考文献
TestNG
————
http://en.wikipedia.org/wiki/TestNG
http://www.ibm.com/developerworks/java/library/j-testng/
http://testng.org/doc/index.html
http://beust.com/weblog/