public class OptimisticTestClass {
private static final int TEST_METHOD_TIMEOUT_MS = 100;
@Rule
public Timeout timeout = new Timeout(TEST_METHOD_TIMEOUT_MS, TimeUnit.MILLISECONDS) {
public Statement apply(Statement base, Description description) {
return new FailOnTimeout(base, TEST_METHOD_TIMEOUT_MS) {
@Override
public void evaluate() throws Throwable {
try {
super.evaluate();
} catch (TestTimedOutException e) {
Assume.assumeNoException("Test did not finish in the allocated time, skipping!", e);
}
}
};
}
};
// The test times out and is skipped
public void givesTimeout() throws InterruptedException {
Thread.sleep(1000);
}
}
3条答案
按热度按时间ax6ht2ek1#
问得好。实际上,您可以只使用
junit
工具来完成此操作。我的想法是反转Timeout
规则行为+使用Test
注解的expected
属性。唯一的限制是:您必须将测试放在单独类中,因为Rule
适用于其中的所有测试:erhoui1w2#
我是建立在伟大的答案由安德烈,不要忘记投票赞成他的答案,如果你喜欢这一个!
我使用了下面的修改来跳过一个没有在预期时间内完成的测试。这样做的好处是测试将被JUnit标记为Skipped而不是Successful。这对于乐观执行测试是很好的,因为有时候测试会挂起或者完成得不够快,但是你不想把它们标记为failed或者删除它们。
thigvfpy3#
在Java 9中更简单
如果方法在1秒内没有返回,它将超时。在句柄方法中,您可以确保抛出TimeoutException,否则测试失败。