I want to fail the build if anyone writes a test that takes longer than 1 second to run, but if I run in perTest mode it takes much, much longer.
I could probably write a custom task that parses the junit reports and fails the build based on that, but I was wondering if anyone knows or can think of a better option.
Reviving an old question since the answer doesn't provide an example.
You can specify timeout
Per test method:
@Test(timeout = 100) // Exception: test timed out after 100 milliseconds
public void test1() throws Exception {
Thread.sleep(200);
}
For all methods in a test class using Timeout
@Rule
:
@Rule
public Timeout timeout = new Timeout(100);
@Test // Exception: test timed out after 100 milliseconds
public void methodTimeout() throws Exception {
Thread.sleep(200);
}
@Test
public void methodInTime() throws Exception {
Thread.sleep(50);
}
Globally for the total time to run all test methods in the class using a static Timeout
@ClassRule
:
@ClassRule
public static Timeout classTimeout = new Timeout(200);
@Test
public void test1() throws Exception {
Thread.sleep(150);
}
@Test // InterruptedException: sleep interrupted
public void test2() throws Exception {
Thread.sleep(100);
}
And even apply timeout (either @Rule
or @ClassRule
) to all classes in your entire suite:
@RunWith(Suite.class)
@SuiteClasses({ Test1.class, Test2.class})
public class SuiteWithTimeout {
@ClassRule
public static Timeout classTimeout = new Timeout(1000);
@Rule
public Timeout timeout = new Timeout(100);
}
EDIT: timeout was deprecated recently to utilize this initialization
@Rule
public Timeout timeout = new Timeout(120000, TimeUnit.MILLISECONDS);
You should provide the Timeunit now, as this will provide more granularity to your code.