Testing timeouts with JUnit 4
Overview
In this post, we will discuss the timeout attribute of the @Test method annotation. Testing timeouts in JUnit 4 we need to use the attribute timeout in the @Test(timeout=<value>) annotation. There are other ways to test if the method executes within the specified time, but we will stick to the method-level ( per-test) annotation-based approach here.
Let’s consider that we gonna test whether a method executes within the specified time or not.
Sample Listing
package com.testingdocs.sample; import org.junit.Test; public class JUnit4TestClass { Â Â Â /* set timeout 3 secs for the method */ Â Â Â @Test(timeout=3000) Â Â Â public void timeOutTest() throws InterruptedException { Â Â Â Â Â Â Â /* Simulate a task that takes 2 secs. Â Â Â Â Â Â Â * 2 < 3 so this method should pass */ Â Â Â Â Â Â Thread.sleep(2000); Â Â Â } }
In the annotation, we have specified 3 secs timeout and simulated a method that takes only 2 secs to complete. Hence, the method should pass in the test result.
Failure method that exceeds timeout
Now, let us simulate a test failure. We would specify a timeout less than that of the method completion time and check. We have specified timeout as 2 secs and method task 3 secs. The method takes longer tom complete than the timeout.
package com.testingdocs.sample; import org.junit.Test; public class JUnit4TestClass { /* set timeout 3 secs for the method */ @Test(timeout=2000) public void timeOutTest() throws InterruptedException { /* Simulate a task that takes 3 secs. * 2 (timeout) < 3 so this method should be marked as * a failure */ Thread.sleep(3000); } }
Class level
To apply the timeout to all the methods you can create a rule as shown below:
package com.testingdocs.sample; import org.junit.Rule; import org.junit.Test; import org.junit.rules.Timeout; import java.util.concurrent.TimeUnit; public class JUnit4TestClass { @Rule public Timeout timeout = new Timeout(3000); @Test public void timeOutTest1() throws InterruptedException { Thread.sleep(4000); } @Test public void timeOutTest2() throws InterruptedException { Thread.sleep(1000); } }