JUnit - タイムアウトテスト

JUnit –タイムアウトテスト

テストが終了するまでに定義された「タイムアウト」よりも時間がかかる場合、TestTimedOutExceptionがスローされ、テストは失敗とマークされます。 次の例を参照してください。

P.S Tested with JUnit 4.12

1. タイムアウトの例

このtimeoutの例は、単一のテストメソッドにのみ適用されます。 また、タイムアウト値はミリ秒単位です。

TimeoutTest.java

package com.example;

import org.junit.Test;

public class TimeoutTest {

    //This test will always failed :)
    @Test(timeout = 1000)
    public void infinity() {
        while (true) ;
    }

    //This test can't run more than 5 seconds, else failed
    @Test(timeout = 5000)
    public void testSlowMethod() {
        //...
    }

}

このタイムアウトテストは、メソッドのパフォーマンスをテストするのに役立ちます。

2. グローバルタイムアウトルールの例

この例では、グローバルタイムアウトルールを作成する方法を示します。このルールは、クラス内のすべてのテストメソッドに適用されます。

TimeoutTest.java

package com.example;

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

import java.util.concurrent.TimeUnit;

public class TimeoutRuleTest {

    //global timeout rule
    @Rule
    public Timeout globalTimeout = Timeout.seconds(1);

    //This test will be failed, because it will take more than 1 second to finish!
    @Test
    public void testSlowMethod1() throws InterruptedException {
        //...
        TimeUnit.SECONDS.sleep(5000);
    }

    //passed
    @Test
    public void testSlowMethod2() {
        //...
    }

}

上記の例では、グローバルTimeoutルールが宣言されており、testSlowMethod1()testSlowMethod2()の両方が1秒以内にテストを終了する必要があります。そうしないと、テストは失敗します。

P.S The rule also applies on @Before and @After methods.

Note
すべての単体テストは高速である必要があり、このグローバルタイムアウトルールが最善の助けになるはずです。