我有一个基本的测试类,我的所有其他测试用例都从中继承。
在超类中,我通过以下方式设置全局计时器:
@Rule
public Timeout globalTimeout = new Timeout(30000);
但是,对于子类中的某些方法,我希望超时更长。
例如:
@test(timeout=alongtime)
private void sometTest()
但这似乎根本不会影响全局计时器,我通过设置全局非常短的超时和子类中的超长超时来测试。
有没有办法让JUnit尊重在方法上定义的超时?
答案 0 :(得分:2)
显然jUnit项目here中存在一个未解决的问题,似乎他们正在考虑在项目中重构Timeout的整个概念。
但在此期间,我一直在寻找同样的事情,发现this post不使用Timeout
规则,而是另一个就像解决方法一样。
例如在我的情况下,我有一些支持谁是快速的和其他一些慢,我只是创建了两个不同的超时的观察者:
@Rule
public TestWatcher watcher = new TestWatcher() {
@Override
public Statement apply(Statement base, Description description) {
if (description.getMethodName().toLowerCase().contains("slow")) {
return new FailOnTimeout(base, 15000);
} else {
return new FailOnTimeout(base, 5000);
}
}
};
这显然不是适合所有人的解决方案(取决于您如何命名测试)但我发现它很有趣,尤其是在“集成测试”或“持续集成”环境中使用jUnit框架时。
<强>更新强>
我找到了一种更好的方法:对缓慢的请求使用特定的自定义注释:
@Target(METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SlowRequest {
// Just for tagging a method and adapt the timeout
}
并且Watcher代码将是:
if (description.getAnnotation(SlowRequest.class) != null) {
return new FailOnTimeout(base, 60000);
} else {
return new FailOnTimeout(base, 25000);
}
并在测试中自己:
@Test
@SlowRequest
public void testSlowMethod() {
// slow test here
}
答案 1 :(得分:1)
我有一个基本的测试类,我的所有其他测试用例都从中继承。
不要那样做。
使用继承来共享测试代码不是很灵活。使用委托来共享代码。在这种情况下,只需将超时规则添加到需要它的测试类中。大多数测试应该是单元测试,不需要超时。
如果您的基类中有很多逻辑,请将其解压缩到另一个类(可能是自定义规则)。