JUnit 4とTestNGはどちらもJavaで非常に普及しているユニットテストフレームワークです。
どちらのフレームワークも機能が非常によく似ています。どっちがいいですか?
どのユニットテストフレームワークをJavaプロジェクトで使用する必要がありますか?
ここでは、JUnit 4とTestNGの機能比較を行いました。
1.注釈のサポート
アノテーションのサポートは、JUnit 4とTestNGの両方で実装されています。
| =========================================== ========================================================== |機能| JUnit 4 | TestNG
|テストアノテーション| @Test | @Test
|このスイート内のすべてのテストが実行される前に実行| – | @BeforeSuite
|このスイート内のすべてのテストが実行された後に実行| – | @AfterSuite
|テストの前に実行| – | @BeforeTest
|テストの後に実行| – | @AfterTest
|これらのグループのいずれかに属する最初のテストメソッドが呼び出される前に実行されます| – | @BeforeGroups
|これらのグループのいずれかに属する最後のテストメソッドの後に実行| – | @AfterGroups
|現在のクラスの最初のテストメソッドが呼び出される前に実行される| @BeforeClass | @BeforeClass
現在のクラスのすべてのテストメソッドが実行された後に実行される| @AfterClass | @AfterClass
|各テストメソッドの前に実行| @Before | @BeforeMethod
|各テストメソッドの後に実行| @After | @AfterMethod
| ignore test | @ignore | @Test(enbale = false)
|予想される例外| @Test(ArithmeticException.classが期待される)| @Test(expectedExceptions = ArithmeticException.class)
|タイムアウト| @テスト(タイムアウト= 1000)| @テスト(タイムアウト= 1000)| ============================= ==========================
JUnit4とTestNGの主なアノテーションの違いは
{空} 1。 JUnit 4では、静的メソッドとして “@BeforeClass”と “@AfterClass”メソッドを宣言する必要があります。 TestNGはメソッド宣言の方が柔軟性があり、この制約はありません。
{空} 2。 3つの追加setUp/tearDownレベル:スイートとグループ(@ Before/AfterSuite、@ Before/AfterTest、@ Before/AfterGroup)
detailこちらをご覧ください。
JUnit 4
@BeforeClass
public static void oneTimeSetUp() {
//one-time initialization code
System.out.println("@BeforeClass - oneTimeSetUp");
}
__テストNG
@BeforeClass
public void oneTimeSetUp() {
//one-time initialization code
System.out.println("@BeforeClass - oneTimeSetUp");
}
JUnit 4では、アノテーションの命名規則は、 “Before”、 “After”、 “Expected”など少し混乱していますが、 “Before”と “After”は何か、そしてテストから “Expected”方法?
テストは分かりやすく、代わりに “BeforeMethod”、 “AfterMethod”、 “ExpectedException”を使用します。
2.例外テスト
「例外テスト」とは、単体テストから例外をスローすることを意味します。この機能は、JUnit 4とTestNGの両方で実装されています。
JUnit 4
@Test(expected = ArithmeticException.class)
public void divisionWithException() {
int i = 1/0;
}
__テストNG
@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");
}
__テストNG
@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);
}
__テストNG
@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 {
}
__テストNG
XMLファイルはスイートテストを実行するために使用されます。以下のXMLファイルは、ユニットテスト “TestNGTest1″と “TestNGTest2″の両方を一緒に実行することを意味します。
<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
<suite name="My test suite">
<test name="testing">
<classes>
<class name="com.fsecure.demo.testng.TestNGTest1"/>
<class name="com.fsecure.demo.testng.TestNGTest2"/>
</classes>
</test>
</suite>
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″だけで実行できます。
<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
<suite name="My test suite">
<test name="testing">
<groups>
<run>
<include name="method1"/>
</run>
</groups>
<classes>
<class name="com.fsecure.demo.testng.TestNGTest5__2__0"/>
</classes>
</test>
</suite>
“グループ化”テストコンセプトを使用すると、統合テストの可能性は無制限です。たとえば、すべてのユニットテストクラスから “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<Object[]> data() {
Object[][]data = new Object[][]{ { 1 }, { 2 }, { 3 }, { 4 } };
return Arrays.asList(data);
}
@Test
public void pushTest() {
System.out.println("Parameterized Number is : " + number);
}
}
ここには多くの制限があります。パラメータを宣言するためには “JUnit”の方法に従わなければなりません。テストのためのパラメータ値としてクラスメンバを初期化するために、パラメータはコンストラクタに渡されなければなりません。パラメータクラスの戻り値の型は “List[]”で、データは文字列またはテストのプリミティブ値に制限されています。
__テストNG
XMLファイルまたは “@DataProvider”は、テスト用の可変パラメータを提供するために使用されます。
単体テスト
public class TestNGTest6__1__0 {
@Test
@Parameters(value="number")
public void parameterIntTest(int number) {
System.out.println("Parameterized Number is : " + number);
}
}
XMLファイル
<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
<suite name="My test suite">
<test name="testing">
<parameter name="number" value="2"/>
<classes>
<class name="com.fsecure.demo.testng.TestNGTest6__0"/>
</classes>
</test>
</suite>
-
パラメータ化されたテストのための
@ DataProvider。
データ値をXMLファイルにプルすることは非常に便利ですが、テストでは複雑な型が必要になることがあります。複雑な型はStringやプリミティブ値として表現できません。 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 + P.S “TestNGTest6
3
0″はデモ用のget setメソッドを持つ単純なオブジェクトです。
@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フレームワークはテスト分離に重点を置いています。現時点ではこの機能をサポートしていませんでした。
__テストNG
それは依存関係テストを実装するために “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はパラメータテスト、依存テスト、スイートテスト(グループ化コンセプト)の進歩によりTestNGがJavaプロジェクトのコアユニットテストフレームワークとしてTestNGを使用することをお勧めします。 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/
JUnit —-
http://en.wikipedia.org/wiki/JUnit
http://www.ibm.com/developerworks/java/library/j-junit4.html
http://junit.sourceforge.net/doc/faq/faq.htm
http://www.devx.com/Java/Article/31983/0/page/3
http://ourcraft.wordpress.com/2008/08/27/writing-a-parameterized-junit
-テスト/