[ACCEPTED]-maven - fail build when unit test takes too long-build-process
If all your tests extend some base class, I 8 think you can stick @Rule
in there which will 7 apply to all the @Test
in the child class.
e.g.
import org.junit.rules.Timeout;
public abstract class BaseTestConfiguration {
@Rule public Timeout testTimeout = new Timeout(60000); // 60k ms = 1 minute
}
public class ThingTests extends BaseTestConfiguration {
@Test
public void testThis() {
/*will fail if not done in 1 minute*/
}
@Test
public void testThat() {
/*will fail if not done in 1 minute*/
}
}
We 6 found this to be easiest rather than messing 5 with AspectJ or secret configuration directives. Devs 4 are more likely to figure out the Java parts 3 than all the secret XML this and that.
You 2 can put @Before
@After
and any number of other junit 1 directives in the base class too.
In maven surefire, you can use forkedProcessTimeoutInSeconds, along with 4 forkMode=once
.
This will kill the forked jvm if it takes 3 too long. If you want to do this per test, you 2 can forkMode=pertest or forkMode=always 1 (which does it for each class).
Why don't add a timeout on a per test basis. I 4 assume you're programming in Java, so in 3 JUnit you can do something like this:
@Test(timeout=100) public void testQuickly()
If 2 the test doesn't end after 100 milliseconds, it 1 will fail.
Have you tried specifying the timeout for 7 the test through @Test(timeout=xx)? Find 6 the official api documentation here: http://junit.sourceforge.net/javadoc/org/junit/Test.html
EDIT---
You 5 can also consider using the timeout property 4 for the TestNg suite, you will have to move 3 all your tests to TestNg though, but this 2 will allow you to specify timeouts for groups.
This 1 is the official api documentation: http://testng.org/javadoc/org/testng/xml/XmlSuite.html#setTimeOut(java.lang.String)
I once had the same requirement, and since 3 I was using TestNG, I used the "group feature".
If you're 2 stuck with JUnit, try using the tests suite 1 (http://stackoverflow.com/questions/817135/grouping-junit-tests)
Try to use the junit Ant task with the timeout 3 parameter.
http://ant.apache.org/manual/Tasks/junit.html
EDIT:
Another thing you can 2 do is to use aspectj with someting like 1 that:
public aspect TestTimeoutChecker {
long TIMEOUT = 60000;
pointcut invokeEvent() :
execution(@Test * *(..));
Object around() : invokeEvent() {
long start = System.currentTimeMillis();
Object object = proceed();
long took = System.currentTimeMillis() - start;
if (took > TIMEOUT) {
throw new RuntimeException("timeout! it took:" + took);
}
return object;
}
}
More Related questions
We use cookies to improve the performance of the site. By staying on our site, you agree to the terms of use of cookies.