リリース候補となったJUnit 4.7は重要な新機能を含んでいる。それはルールである。
要約すると、ルールとはJUnitのもうひとつの拡張メカニズムである。ルールによりテストごとにJUnitに機能を追加することが可能となる。JUnitの初期のバージョンで利用されていていたカスタムランナのほとんどはルールで置き換えることが可能となる。最新のブログの投稿で機能に関して説明されている。
JUnit3ではテスト実行プロセスをいろいろな方法で操作することは可能でした。JUnit4ではシンプルにする対価として、この “メタテスト”を失ってしまいました。単純なテストでは影響はないのですが、より複雑なテストではこれは制約になりえます。JUnit3のオブジェクトフレームワークのスタイルはデフォルトで拡張するという方法に向いていました。しかし DSL スタイルのJUnit4は向いていません。昨夜、私たちはメタテストを再び導入することにしました。以前よりずっと整理されてシンプルな方法で。
ルールを追加できるという機能とともに、いろいろコアとなるルールも追加された。
- TemporaryFolder: テスト実行時にファイルやフォルダを作成できる機能。これらのファイルはテスト実行後に削除されることが保証されている。これはファイルシステムを操作するテストにおいて、テストをそれぞれ独立に実行したいという共通の要求から生まれた。
- ExternalResource: テスト前に必要なリソースのパターンを準備しておく機能。テスト実行後に元の状態に戻すことが保証されている。ソケット、埋め込みサーバなどに対するテストに対して有用である。
- ErrorCollector: テスト失敗後もテストを続けることができるようになる。テスト終了後にすべてのエラーが報告される。多数の独立した条件の元でのテストの評価をする場合に有用である("test smell(あまり設計されていないテスト)"である可能性もあるが)。
- ExpectedException: 期待する例外の型やメッセージをテスト内で特定できるようになる。
- Timeout: クラス内のすべてのテストに同じタイムアウト時間を適用する。
ルールをどのように使用するのか確認したい場合、以下のTemporaryFolder と ExpectedException のルールを使用したテストが参考になるだろう。
public class DigitalAssetManagerTest { @Rule public TemporaryFolder tempFolder = new TemporaryFolder(); @Rule public ExpectedException exception = ExpectedException.none(); @Test public void countsAssets() throws IOException { File icon = tempFolder.newFile("icon.png"); File assets = tempFolder.newFolder("assets"); createAssets(assets, 3); DigitalAssetManager dam = new DigitalAssetManager(icon, assets); assertEquals(3, dam.getAssetCount()); } private void createAssets(File assets, int numberOfAssets) throws IOException { for (int index = 0; index < numberOfAssets; index++) { File asset = new File(assets, String.format("asset-%d.mpg", index)); Assert.assertTrue("Asset couldn't be created.", asset.createNewFile()); } } @Test public void throwsIllegalArgumentExceptionIfIconIsNull() { exception.expect(IllegalArgumentException.class); exception.expectMessage("Icon is null, not a file, or doesn't exist."); new DigitalAssetManager(null, null); } }
また簡単にルールの開発ができるよう、ルールのベースとなるクラスがいくつか用意されている。
- Verifier: ErrorCollectorなどのルールのベースとなるクラス。照合チェックが失敗した場合でも、失敗したテストを合格に変更することができる。
- TestWatchman: テストの結果を変えずにテスト実行を観察するためのルールのベースとなるクラス。
Rules は JUnit4.7初期のビルドに最初に現れたときInterceptors と呼ばれていた。ルールに加え、JUnit 4.7 は以下の機能も含んでいる。
- matcherに対する変更
- 時間切れとなったテストのスタックトレースの表示。これによりテストのタイムアウトの原因究明の手助けとなる。
- Javdoc の改良といくつかのバグフィックス
これらの機能に関する詳細な情報はJUnit 4.7 リリースノートより確認できる。 Hamcrest 1.2 サポート は初期のリリースノートには掲載されていたが、このリリースでははずされた。
最終リリース版を待つ間、リリース 候補 をgithubからのダウンロード、 org.junit.rules ギアの閲覧、調査への参加、 Kent Beck氏のJUnit Maxの デッドプーリング の閲覧などが可能である。 ブログ、 friendfeed、twitterなどで、JUnit 4.7に対するユーザのリアクションを待とう。