Java 如何让TestNG方法在达到超时时立即终止?

Java 如何让TestNG方法在达到超时时立即终止?,java,testng,Java,Testng,我必须为一个有时在加载页面时无限期挂起的网站编写测试。我想写一个方法,在它开始运行20分钟后超时 但是当我试着写这样的代码时- @测试(超时=4000) 公开无效测试(){ 试试{Thread.sleep(5000);}catch(InterruptedException e){} System.out.println(“我不想打印这个。”); } 测试打印“我不想打印此内容。”然后失败,出现预期的异常-org.testng.internal.thread.ThreadTimeoutExcep

我必须为一个有时在加载页面时无限期挂起的网站编写测试。我想写一个方法,在它开始运行20分钟后超时

但是当我试着写这样的代码时-

@测试(超时=4000)
公开无效测试(){
试试{Thread.sleep(5000);}catch(InterruptedException e){}
System.out.println(“我不想打印这个。”);
}
测试打印“我不想打印此内容。”然后失败,出现预期的异常-
org.testng.internal.thread.ThreadTimeoutException:方法未在超时4000内完成


如何在达到时间限制后立即使测试失败?

TLDR
不要捕获
InterruptedException
just-put-in-throws子句

当TestNG工作时(在本例中),框架将创建一个新的单线程executorService,提交一个等待终止的worker。如果测试运行未完成,工作进程将抛出
org.testng.internal.thread.ThreadTimeoutException
。 相关源代码为:

org.testng.internal.MethodInvocationHelper

private static void调用WithTimeOutWithNewExecutor(
ITestngTM方法,
对象实例,
对象[]参数值,
ITestResult测试结果,
IHookable(可挂钩)
引发InterruptedException、ThreadExecutionException{
ExecutorService exec=ThreadUtil.createExecutor(1,tm.getMethodName());
InvokeMethodRunnable imr=
新的InvokeMethodRunTable(tm、实例、参数值、可挂接、testResult);
未来=执行提交(imr);
exec.shutdown();
long realTimeOut=MethodHelper.calculateTimeOut(tm);
boolean finished=执行等待终止(realTimeOut,TimeUnit.ms);
如果(!完成){
exec.shutdownNow();
ThreadTimeoutException异常=
新的ThreadTimeoutException(
“方法”
+tm.getQualifiedName()
+“()未在超时时间内完成”
+实时输出);
testResult.setThrowable(异常);
testResult.setStatus(ITestResult.FAILURE);
}否则{
Utils.log(
“调用程序”+线程.currentThread().hashCode(),
3.
“方法”+tm.getMethodName()+“在超时时间内完成”+tm.getTimeOut());
//我们不需要来自未来的结果,但需要对其调用get()
//将触发引发的异常(如果有)
试一试{
future.get();
}捕获(执行例外){
抛出新的ThreadExecutionException(例如getCause());
}
testResult.setStatus(ITestResult.SUCCESS);//如果在此之前没有异常,则为SUCCESS。
}
}
重点是:

ExecutorService exec=ThreadUtil.createExecutor(1,tm.getMethodName()); // ... 和 boolean finished=执行等待终止(realTimeOut,TimeUnit.ms);
java.util.concurrent.ExecutorService.awaitTermination(…)
方法抛出测试方法中处理的
InterruptedException
。因此,测试方法不会终止,但
finished
标志将为false

因此,这将有助于:

@测试(超时=4000)
public void test()引发InterruptedException{
睡眠(5000);
System.out.println(“我不想打印这个”);
}

谢谢!我真的很欣赏深入的源代码。虽然这个例子是通过抛出异常来解决的,但事实证明我的问题是因为我使用的TestNG版本-。更新TestNG修复了我的问题。