Java6サポート切れ対応で火を吹いていた時期にちょうど休職しており、難を逃れました。JUnit3というかdjUnitのテストクラスとかどうしたんだろう(一応動くには動くらしい)。
というわけで、超今さらながらTestNG使ってみました。
準備
Mavenであれば以下の依存性を追加すれば準備完了です。
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.3</version>
<scope>test</scope>
</dependency>
Maven自体ほとんど使ったことがなかったのですが、pom.xmlの記述をコピペして書き換えたりすると高確率で事故ります。実際、コピペしたらscope間違えていて、動くには動くけどデプロイするアーカイブにtestng-6.14.3.jarが入ってしまうというおかしなことになりました。必ずIDEの自動補完を使ってください。
使ったことはあるけどpom.xmlの書き方はわからないって人は結構多いかもしれませんね。
テストケースを作る
JUnitで言うところのテストクラスです。結構似ています。
JUnit4を使ったことがあれば戸惑うこともありません。
public class LogoutBeanTest {
/** テスト対象クラス */
private LogoutBean logoutBean;
@Test
public void logout() throws Exception {
String result = logoutBean.logout();
// 結果の検証
assertEquals(logoutBean.getMessage(), "ログアウトしました");
assertEquals(result, "/logout/logout.jsf");
}
@BeforeMethod
public void setUpMethod() throws Exception {
logoutBean = new LogoutBean();
}
}
assertEquals()
の引数の順番がJUnitと逆なのがちょっと気になりましたね。JUnitだと想定結果(expected)が先ですが、TestNGでは実際の結果(actual)が先になります。JUnitでも逆に書いている人結構いましたけどね……
テストスイートを作る
複数のテストクラスをXMLで管理することができます。
コマンドラインでTestNGを実行する場合は複数のテストクラスをまとめて呼べるようになって便利なのですが、IDEではその利点を見出せず。
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="cc.cress.sample">
<test name="Login">
<classes>
<class name="cc.cress.sample.login.LoginBeanTest"/>
<class name="cc.cress.sample.util.PasswordEncrypterTest"/>
</classes>
</test>
<test name="Logout">
<classes>
<class name="cc.cress.sample.logout.LogoutBeanTest"/>
</classes>
</test>
</suite>
このあとPowerMockito(モックオブジェクト)とかJacoco(カバレッジ取得)とかも導入しているのですが、かなりボリューミーになってしまったので一旦ここまで。