TestNGとJUnit 4の比較


JUnitは、単一のオブジェクトのテストを促進するためのユニットテストフレームワークであり、このようなタスクを極めて効果的に完了することができます.
TestNGは、より高いレベルのテスト問題を解決するために使用されるため、JUnitにはないいくつかの特性を持っています.
パラメトリックテスト
TestNGのもう一つの興味深い特性はパラメトリックテストである.JUnitでは、測定方法のパラメータグループを変更したい場合は、異なるパラメータグループごとにテスト例を作成するしかありません.多くの場合、これはあまり面倒ではありません.しかし、ビジネスロジックに対して実行する必要があるテストの数の変化範囲が大きい場合があります.
このような場合、JUnitを使用するテスト担当者は、テーブルデータでテストを駆動できるため、FITのようなフレームワークを使用することが多い.しかしTestNGは開梱即用の類似特性を提供している.TestNGのXMLプロファイルにパラメトリックデータを入れることで、異なるデータセットに対して同じテストケースを再利用でき、異なる結果が得られる可能性もあります.この技術は,すべての正常なテストを仮定するか,境界を有効に検証していない場合を完璧に回避した.
リスト5では、Java 1.4を使用して、classname sizeの2つのパラメータを受信できるTestNGテストを定義しました.この2つのパラメータは、クラスの階層を検証することができる(すなわち、java.util.Vectorが入力されると、HierarchyBuilder によって構築されたHierarchy の値は2になる).
リスト5.TestNGパラメータ化テスト
package test.com.acme.da;

import com.acme.da.hierarchy.Hierarchy;
import com.acme.da.hierarchy.HierarchyBuilder;

public class HierarchyTest {
 /**
  * @testng.test
  * @testng.parameters value="class_name, size"
  */
 public void assertValues(String classname, int size) throws Exception{
  Hierarchy hier = HierarchyBuilder.buildHierarchy(classname);
  assert hier.getHierarchyClassNames().length == size: "didn't equal!";
 }
}

リスト5には、異なるデータを繰り返し再利用できる汎用テストがリストされています.時間をかけてこの問題を考えてください.10個の異なるパラメータの組み合わせがJUnitでテストする必要がある場合は、10個のテスト例しか書けません.各試験例で完了したタスクは基本的に同じであり、測定方法のパラメータが変更されただけである.ただし、パラメトリックテストを使用する場合は、テスト例を1つだけ定義し、必要なパラメータパターンをTestNGのテストスイートファイルに追加することができます.リスト6には、この方法が示されています.
リスト6.TestNGパラメータ化テストキットファイル
<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd">
<suite name="Deckt-10">
 <test name="Deckt-10-test">

  <parameter name="class_name" value="java.util.Vector"/>
  <parameter name="size" value="2"/> 	

  <classes>  		
   <class name="test.com.acme.da.HierarchyTest"/>
  </classes>
 </test>  
</suite>

リスト6のTestNGテストキットファイルは、このテストに対して1つのパラメータグループ(class_namejava.util.Vectorであり、size2に等しい)のみを定義しているが、無限の可能性を有する.このような追加の利点は、テストデータをXMLファイルのコードレスワークに移動することは、プログラマでなくてもデータを指定できることを意味します.
トップに戻る
高度なパラメトリックテスト
1つのXMLファイルからデータを抽出するのは便利ですが、Stringまたは原語値では表現できない複雑なタイプが必要なテストもあります.TestNGは、その@DataProvider注釈によってこのような状況を処理することができる.@DataProvider注釈は、複雑なパラメータタイプをある試験方法に容易にマッピングすることができる.例えば、リスト7のverifyHierarchy 試験では、buildHierarchyの方法を再ロードし、 Classのタイプのデータを受信することができ、HierarchygetHierarchyClassNames()の方法は適切な文字列配列を返すべきだと断言する.
リスト7.TestNGでのDataProviderの使い方
package test.com.acme.da.ng;

import java.util.Vector;

import static org.testng.Assert.assertEquals;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

import com.acme.da.hierarchy.Hierarchy;
import com.acme.da.hierarchy.HierarchyBuilder;

public class HierarchyTest {

 @DataProvider(name = "class-hierarchies")
 public Object[][] dataValues(){
  return new Object[][]{
   {Vector.class, new String[] {"java.util.AbstractList", 
     "java.util.AbstractCollection"}},
   {String.class, new String[] {}}
  };
 }

 @Test(dataProvider = "class-hierarchies")
 public void verifyHierarchy(Class clzz, String[] names) 
  throws Exception{
    Hierarchy hier = HierarchyBuilder.buildHierarchy(clzz);
    assertEquals(hier.getHierarchyClassNames(), names, 
	  "values were not equal");		
 }
}
dataValues()方法は、verifyHierarchy試験方法のパラメータ値と一致するデータ値を多次元配列によって提供する.TestNGはこれらのデータ値を巡回し、データ値に基づいてverifyHierarchyを2回呼び出した.1回目の呼び出しでは、ClassパラメータがVector.class に設定され、String 配列パラメータは、「java.util.AbstractList 」および「 java.util.AbstractCollection 」の2つのStringタイプのデータを収容する.これは便利ですね.
どうして一つだけ選んだの?
私にとってTestNGのいくつかの独自の優位性を検討しましたが、JUnitが備えていない他のいくつかの特性があります.例えばTestNGではテストパケットが使用されており、実行時間などの特徴に基づいてテストを分類することができる.リスト5に示すようにJavadocスタイルの注釈でJava 1.4で使用することもできます.
私が冒頭で述べたように、JUnit 4とTestNGは表面的に似ています.しかし、設計JUnitの目的はコードユニットを分析することであり、TestNGの予想用途は高度なテストである.大規模なテストキットでは、あるテストが失敗したときに数千のテストを再実行することを望んでいません.TestNGの柔軟性はここで特に役立ちます.この2つのフレームワークには独自の利点があり、同時に使用することができます.