我希望我的测试重试5次且不超过x分钟。在最后一次调用之后,它将在@Aftermethod中调用mergeReport方法。这是我的示例代码:

@Test(priority = 1, invocationCount = 5, invocationTimeOut = 6000, expectedExceptions = ThreadTimeoutException.class)
public void test() throws Exception {
    while (true) {
        Thread.sleep(1000);
    }
}

@AfterMethod(lastTimeOnly = true, alwaysRun = true)
public void mergeReport(ITestResult result) throws Exception {
    System.out.println("Report");
}


测试结果为空。但是,当我将invocationCount更改为2时,测试结果将是:

Report


我在互联网上搜索并发现了与2014年类似的问题,但仍然没有答案:https://github.com/cbeust/testng/issues/325

有人遇到过这个问题吗?

最佳答案

您是否尝试过使用timeOut而不是invocationTimeout?

@Test(priority = 1, invocationCount = 5, invocationTimeout= 20000, expectedExceptions = ThreadTimeoutException.class)
public void test() throws Exception {
    while (true) {
        Thread.sleep(1000);
    }
}


从testng doc:


  invocationTimeOut->此测试的最大毫秒数
  应该占用所有调用计数的累积时间。这个
  如果未指定invocationCount,则将忽略该属性。
  
  timeOut->此测试应花费的最大毫秒数。


我认为您超时之后想要您想要的东西!

再说一次,您在解密时提到要运行X分钟。关键字是“累计”。顺便说一句,6000毫秒是6秒,所以例如6分钟需要360000(很傻,我知道,但是也许这就是为什么你没有得到想要的效果)。


  因此,我的猜测是您设置时,程序会生成“报告”
  调用2;仅仅是因为它有足够的时间来完成(即
  执行2次调用,如果您愿意在6次中调用两次,则调用两次
  秒余量)。当您将其设置为5时,它还不够
  时间完成! :)


为了确定是尝试使用timeOut参数还是使用invocationTimeOut参数,然后将其设置为更高的值,以便测试可以在所需的时间范围内完成。从成功的示例设置来看,invocationTimeOut = 20000应该足够了;)

祝你好运!

09-26 18:03