TestNG Features List [Test]
■はじめに
しばらく使ってなかったので、バージョンアップに伴い機能を復習してみます。
TOC
- TestNGの特徴
- テストスイートの実行
- テストケースの前後処理の設定
- 例外のチェック
- ファクトリ
- JUnitテストケースの変換
- References
■TestNGの特徴
- アノテーションベースのテストケース
- JSR 175 のアノテーションを利用したテストケース(JDK5.0の場合)
- JDK 1.4の場合はJavadoc アノテーションとしてテストケースを記述可能 - 柔軟なテストの設定
- setUp, tearDown の実行単位を制御可能(スイート、テストクラス、テストメソッドの単位) - テストケースのカテゴライズ
- メソッドグループ
- グループのグループ
- 部分的にグループを混在(クラスレベルとメソッドレベルのグループの混在)
- 包含と排他
- テストケースの無効化 - テストケースに対するパラメータ渡しを可能に
- ファクトリ(動的に(パラメータを生成し)テストを生成することを可能に)
- テストケースの依存関係を定義可能に
- antとの統合
- マルチスレッドテストおよびタイムアウトの定義
- 繰り返し実行
- 失敗したテストのみを再実行可能
- TestNG から JUnit Test を実行可能
- JUnit テストケースを TestNGテストケースに変換可能
- プログラムからTestNGを呼び出し可能
- ロギング
- 他の開発ツールとの親和性
- Eclipse Plugin
- Maven Plugin (開発中?) - JDK 1.4 and 1.5 で動作します。
TestNGでテストスイートは以下のようにXMLで定義されます。
グループを指定して実行することも可能です。
■テストケースの前後処理の設定
JUnitでは、各テストメソッドの開始前後に実行する定型処理を定義することができました。定型処理の場所を他の場所に配置したい場合には、テストケースのベースクラスや、 template method pattern を用いプログラミングする必要がありました。
TestNGでは、アノテーションにより定型処理の場所を定義することができます。以下のように、定型処理の場所をより柔軟に選択することが可能です。また、複数のメソッドを前後処理として定義することも可能です。
○テストスイートタグに含まれる全てのクラスの実行前後で実施される動作
- @Configuration(beforeSuite = true)
- @Configuration(afterSuite = true)
- @Configuration(beforeTest = true)
- @Configuration(afterTest = true)
- @Configuration(beforeTestClass = true)
- @Configuration(afterTestClass = true)
- @Configuration(beforeTestMethod = true)
- @Configuration(afterTestMethod = true)
TestNGでは、期待される例外をアノテーションを用いて検証します。下のテストケースの場合では、テストケース実行時に NumberFormatException が throw されることを期待しています。
public class NumberUtilsTest { @Test(groups = {"tests.math"}) @ExpectedExceptions(NumberFormatException.class) public void test() { NumberUtils.createDouble("12.23.45"); assert false; //shouldn't be invoked } }
私見になりますが、どの例外クラスがthrowされるかを検証するだけでよければ、このアノテーションが利用できますが、テストケースの結果、throw される例外クラスの状態を検証する必要があるならば、例外クラスを catch し、例外クラスの状態を検証する必要があると考えられます。よって、アノテーションが利用できるケースは制限された範囲になると考えております。
■ファクトリファクトリは、テストを動的に生成することを可能とします。以下がファクトリの例です。WebTestに与えられたパラメータを10, 20, 30...と増加させた場合、テストケースにどのような影響を及ぼすかを検証しています。
public class WebTestFactory { @Factory public Object[] createInstances() { Object[] result = new Object[10]; for (int i = 1; i < 10; i++) { result[i] = new WebTest(i * 10); } return result; } }
ファクトリメソッドは、@Test, @Configuration のようなパラメータを受け取り、 Object[]を返す必要があります。オブジェクトは、どんなクラスをも返却することができます。そして、TestNG annotation を含む必要もありません。
public class WebTest { private int m_numberOfTimes; public WebTest(int numberOfTimes) { m_numberOfTimes = numberOfTimes; } @Test public void testServer() { for (int i = 0; i < m_numberOfTimes; i++) { // access the web page } } }
test.xml には、factory method を含むクラスに対する参照を持てばよいだけです。テストクラス自身のインスタンスは実行時に生成されます。
■JUnitテストケースの変換
JUnit のテストケースクラスをTestNGのテストケースに変換するorg.testng.JUnitConverterクラスを用意しています。以下のようなオプションを用意しています。
- 出力形式:JDK1.4(javadoc annotation)、JDK5.0(JDK5.0 annotation)
- 元のソースを上書きするか?
antのサンプルは以下のとおりです。
■References
- TestNGでJavaユニット・テストを楽々行う
http://www-6.ibm.com/jp/developerworks/java/050121/j_j-testng.html - TestNG: The next generation of unit testing
http://www.javaworld.com/javaworld/jw-04-2005/jw-0404-testng_p.html - TestNG
http://testng.org/
http://testng.org/main.html#news
コメント 0