In this post we will learn how to configure TestNG Tests to timeout after certain time, using TestNG timeout feature with help of @Test(timeOut = 1000). A @Test is supposed to complete its execution within very short time. In case a @Test is taking unreasonably long-time than expected, it’s something to investigate. In those situations, we can run that @Test with applying a timeout(in milliSeconds) like @Test(timeOut = 1000). With this way, if the test does not complete it’s execution within applied timeout, it will fail. Let’s get going.
Let’s take a simple Calculator class to demonstrate this feature.
package com.websystique.testng;
public class Calculator {
public double add(double a, double b){
return a+b;
}
public double subtract(double a, double b) throws InterruptedException{
Thread.sleep(5000);
return a-b;
}
}
For demonstration purpose, we have included Thread.sleep(5000) in subtract method. That means subtract method will take little more than 5000 milliseconds to complete it’s executions.
Let’s write a trivial test class with two test methods add & subtract.
package com.websystique.testng;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
public class TestNGTimeOutExample {
Calculator calculator;
@BeforeClass
public void setup() {
System.out.println("setup()");
calculator = new Calculator();
}
@AfterClass
public void tearDown() {
System.out.println("tearDown()");
calculator = null;
}
@BeforeMethod
public void beforeMethod() {
System.out.println("beforeMethod()");
}
@AfterMethod
public void afterMethod() {
System.out.println("afterMethod()");
}
@Test
public void testAdd() {
System.out.println("testAdd()");
Assert.assertEquals(calculator.add(3, 4), 7.0);
}
@Test(timeOut = 3000)//timeout in milliseconds
public void testSubtract() throws InterruptedException {
System.out.println("testSubtract()");
Assert.assertEquals(calculator.subtract(5, 2), 3.0);
}
}
We have also included the @BeforeClass & @BeforeMethod to see the overall effect.
Run above test class using TestNG Eclipse plugin or maven (mvn clean test). Following is the outcome:
setup()
beforeMethod()
testAdd()
afterMethod()
beforeMethod()
testSubtract()
afterMethod()
tearDown()
PASSED: testAdd
FAILED: testSubtract
org.testng.internal.thread.ThreadTimeoutException: Method org.testng.internal.TestNGMethod.testSubtract() didn't finish within the time-out 3000
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.doSignalAll(AbstractQueuedSynchronizer.java:1890)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.signalAll(AbstractQueuedSynchronizer.java:1959)
at java.util.concurrent.ThreadPoolExecutor.tryTerminate(ThreadPoolExecutor.java:707)
at java.util.concurrent.ThreadPoolExecutor.processWorkerExit(ThreadPoolExecutor.java:1006)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1163)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
===============================================
Default test
Tests run: 2, Failures: 1, Skips: 0
===============================================
You can see that @Test method for subtract failed as it took more than 3 seconds(timeout limit) to finish it’s execution.
Additional noticeable points are :
- @BeforeClass/@AfterClass was called as there is at least one @Test method in this class which got executedI. In our case both were executed.
- @BeforeMethod/@AfterMethod was called for both methods. Even if subtract @Test failed, it was nonetheless executed, so @BeforeMethod/@AfterMethod was called for this as well.
That’s it.
References
If you like tutorials on this site, why not take a step further and connect me on Facebook , Google Plus & Twitter as well? I would love to hear your thoughts on these articles, it will help improve further our learning process.