⛄️

JUnit 4.12から入ったTestRuleを軽く見てみる

2015/02/28に公開

DisableOnDebug

DisableOnDebugは他のTestRuleをラップして、デバッグ実行されていないときのみラップしたTestRuleを適用します。

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.DisableOnDebug;
import org.junit.rules.TestRule;
import org.junit.rules.Timeout;

public class HogeTest {

    @Rule
    public TestRule timeout = new DisableOnDebug(Timeout.seconds(1)); //1秒以上かかったら失敗とみなす

    @Test
    public void testHoge() throws Exception {
        //test code
    }
}

こんな感じでTimeoutと組み合わせる事が多い気がします。

コマンドライン引数に次のいずれかが含まれていればデバッグ実行されていると判断するようです。

  • -Xdebug
  • -agentlib:jdwp

デバッグ実行かどうかの判断はDisableOnDebug.isDebuggingメソッドをオーバーライドすればカスタマイズできます。

Stopwatch

Stopwatchはテスト実行にかかった時間をSystem.nanoTimeメソッドで計測します。

import java.util.logging.Logger;

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.Stopwatch;
import org.junit.runner.Description;

public class FugaTest {

    private static Logger logger = Logger.getLogger(FugaTest.class.getName());

    @Rule
    public Stopwatch stopwatch = new Stopwatch() {
        @Override
        protected void succeeded(long nanos, Description description) {
            logger.info(() -> String.format("テストの実行に%,dナノ秒かかった", nanos));
        }
    };

    @Test
    public void test() throws Exception {
        //test code
    }
}

ロギング目的に使うのが多そうです。

Discussion