最近読んだ記事、"Jump into JUnit 4"
developerWorksにJUnit4の注目したい新機能をサンプルコードととももにわかりやすく解説している記事(http://www-128.ibm.com/developerworks/edu/j-dw-java-junit4.html)が掲載されていました。うまくまとまっていてとてもよい記事です。JUnit4使用前/使用後のコードが記載されているので、何がどう変わったのかもよくわかります。長そうな記事に見えますが、ソースコードや図なども含めてなので思ったより短時間で読めると思いますので目を通してはいかがでしょうか。お薦めです。
といっても概略だけまとめます。自分のためのメモでもあるので。
著者によると、JUnit 4はannotation対応になったおかげでとても使いやすくなったということです。バージョンアップに伴う数ある改良の中でも、
- 継承しなければならないクラスがなくなった
- @Test annotationを使う
- テストメソッドの中での例外処理が減った
- @Test(expected=IndexOutOfBoundsException.class)のように指定する
- テストのtimeout時間を簡単に設定できるようになった
- @Test(timeout=1)のように指定する
- テストにIgnoreを指定してテスト対象から特定のメソッドをはずせるようになった
- @Ignore annotationを使う
- fixture機能(テスト前後に必要な処理。setUp()メソッドやTestSetupクラスなど)が改良されて簡単にしかも柔軟に対応できるようになった
- @BeforeClass/@AfterClass(一回だけ実行)、@Before/@After(繰り返し実行)を使う
- テストしたいパラメータを全てCollection型のオブジェクトにセットして一気にテストできるようになった
- @Parameters annotationを使い、Collection型を返すメソッドを定義する
- その他
- @RunWith, @SuiteClasses, 配列どうしの比較テスト
を取り上げて解説しています。JUnit4使用後のコードは次のようになりますが、ここではJava 5で導入されたstatic import featureも利用しているのでさらにコードが簡潔になっているということです。
import java.util.regex.Matcher; import java.util.regex.Pattern; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertFalse; public class RegularExpressionTest { private static String zipRegEx = "^\\d{5}([\\-]\\d{4})?$"; private static Pattern pattern; @BeforeClass public static void setUpBeforeClass() throws Exception { pattern = Pattern.compile(zipRegEx); } @Ignore("this test is temporary unavailable") @Test() public void verifyZipCodeMatch() throws Exception { Matcher mtcher = pattern.matcher("22101"); boolean isValid = mtcher.matches(); assertTrue("Pattern did not validate zip code", isValid); } @Test() public void verifyZipCodeNoMatch() throws Exception { Matcher mtcher = pattern.matcher("22101"); boolean notValid = mtcher.matches(); assertFalse("Pattern did validate zip code", notValid); } @Test(expected=IndexOutOfBoundsException.class) public void verifyZipCodeGroupException() throws Exception { Matcher mtcher = pattern.matcher("22101-5051"); boolean isValid = mtcher.matches(); mtcher.group(2); } }
上記のコードをEclipse 3.2.1でJUnit Testで実行すると、このような結果になり、Igonreされたテストも表示されています。
これまで、JUnitのテストはおきまりのあれこれが多くて面倒だなぁと思うことが多かったのですが、JUnit 4はかなり簡単にしかも分かりやすくなった感じです。