JUnit - Timeout-Test

JUnit - Timeout-Test

Wenn ein Test länger als ein definiertes „Timeout“ dauert, wird einTestTimedOutException ausgelöst und der Test als fehlgeschlagen markiert. Siehe folgendes Beispiel:

P.S Tested with JUnit 4.12

1. Timeout-Beispiel

Diesestimeout-Beispiel gilt nur für eine einzelne Testmethode. Der Timeout-Wert wird in Millisekunden angegeben.

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() {
        //...
    }

}

Dieser Timeout-Test ist nützlich, um die Methodenleistung zu testen.

2. Beispiel für eine globale Timeout-Regel

Dieses Beispiel zeigt Ihnen, wie Sie eine globale Zeitüberschreitungsregel erstellen. Diese Regel gilt für alle Testmethoden in einer Klasse.

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() {
        //...
    }

}

Im obigen Beispiel wird eine globaleTimeout-Regel deklariert. SowohltestSlowMethod1() als auchtestSlowMethod2() müssen den Test innerhalb von 1 Sekunde beenden. Andernfalls schlägt der Test fehl.

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

Note
Alle Unit-Tests sollten schnell sein, und diese globale Timeout-Regel sollte Ihr bester Helfer sein.