Feb 18, 2006

[Library] JUnit 4.0 にチャレンジ

長らく 3.x の時代が続いていた JUnit だけれど、遂に 4.0 がリリースされた。 というわけで、とりあえず軽く触ってみた。 4.0 がリリースされたというニュースが出ているのだが、2006/02/18 現在公式サイトには情報がなかった。 ダウンロードも 3.8.1 が最新のママ。 公式サイトで 4.0 が見つからない場合は、↓のダウンロードサイトをチェックすると良い。

JUnit 公式サイト
http://junit.org/index.htm
JUnit ダウンロードサイト
http://prdownloads.sourceforge.net/junit/
@Test でユニットテスト - 新生 JUnit 4.0 公開
http://pcweb.mycom.co.jp/news/2006/02/16/347.html

JUnit 4 の Annotation

JUnit 3 → 4 の大きな変更は Annotation の導入らしい。 というわけで、JUnit 4 で用意されている Annnotation をリストアップしてみた。

@After
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface After {
}
@AfterClass
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AfterClass {
}
@Before
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Before {
}
@BeforeClass
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface BeforeClass {
}
@Ignore
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Ignore {
  /**
   * The optional reason why the test is ignored.
   */
  String value() default ""; 
}
@Test
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Test {
  static class None extends Throwable {
    private static final long serialVersionUID= 1L;    
    private None() {
    }
  }
  /**
   * Optionally specify <code>expected</code>, a Throwable, to cause a test method to succeed iff 
   * an exception of the specified class is thrown by the method.
   */
  Class<? extends Throwable> expected() default None.class;
  /** 
   * Optionally specify <code>timeout</code> in milliseconds to cause a test method to fail if it
   * takes longer than that number of milliseconds.*/
  long timeout() default 0L; 
}
Annotation の実行タイミング

↑に挙げた Annotation は全て Target が METHOD になっている。 これら Annotation が指定されたメソッドの実行タイミングは以下の通り。

package jp.in_vitro.codelets.junit4;

import java.util.logging.Logger;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.JUnitCore;

public class Codelet {

    public static void main(String[] args) {
        JUnitCore.runClasses(new Class[] { Codelet.class });
    }

    @BeforeClass
    public static void beforeClass() {
        Logger.global.info("beforeClass");
    }

    @Before
    public void before() {
        Logger.global.info("before");
    }

    @Test
    public void mytest01() {
        Logger.global.info("mytest01");
    }

    @Test
    public void mytest02() {
        Logger.global.info("mytest02");
    }

    @Test @Ignore
    public void mytest03() {
        Logger.global.info("mytest03");
    }

    @After
    public void after() {
        Logger.global.info("after");
    }

    @AfterClass
    public static void afterClass() {
        Logger.global.info("afterClass");
    }

}
2006/02/18 17:24:32 jp.in_vitro.codelets.junit4.Codelet beforeClass
情報: beforeClass
2006/02/18 17:24:32 jp.in_vitro.codelets.junit4.Codelet before
情報: before
2006/02/18 17:24:32 jp.in_vitro.codelets.junit4.Codelet mytest01
情報: mytest01
2006/02/18 17:24:32 jp.in_vitro.codelets.junit4.Codelet after
情報: after
2006/02/18 17:24:32 jp.in_vitro.codelets.junit4.Codelet before
情報: before
2006/02/18 17:24:32 jp.in_vitro.codelets.junit4.Codelet mytest02
情報: mytest02
2006/02/18 17:24:32 jp.in_vitro.codelets.junit4.Codelet after
情報: after
2006/02/18 17:24:32 jp.in_vitro.codelets.junit4.Codelet afterClass
情報: afterClass

Assert

JUnit 4 ではテストケースが TestCase クラスを継承する必要は無くなった。 そのため、assert* メソッドは Assert クラスで定義されているものを使用する。 Assert クラスには↓のメソッドが用意されている。 これくらいの数なら static import を使っても良さそう。

static public void assertTrue(String message, boolean condition)
static public void assertTrue(boolean condition)
static public void assertFalse(String message, boolean condition)
static public void assertFalse(boolean condition)
static public void fail(String message)
static public void fail()
static public void assertEquals(String message, Object expected, Object actual)
static public void assertEquals(Object expected, Object actual)
public static void assertEquals(String message, Object[] expecteds, Object[] actuals)
public static void assertEquals(Object[] expecteds, Object[] actuals)
static public void assertEquals(String message, double expected, double actual, double delta)
static public void assertEquals(double expected, double actual, double delta)
static public void assertEquals(String message, float expected, float actual, float delta)
static public void assertEquals(float expected, float actual, float delta)
static public void assertNotNull(String message, Object object)
static public void assertNotNull(Object object)
static public void assertNull(String message, Object object)
static public void assertNull(Object object)
static public void assertSame(String message, Object expected, Object actual)
static public void assertSame(Object expected, Object actual)
static public void assertNotSame(String message, Object expected, Object actual)
static public void assertNotSame(Object expected, Object actual)

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |