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.