在TestNG中将方法与超时事件绑定

时间:2018-11-13 12:05:37

标签: testng

在TestNG项目中,我在xml文件的套件标签中添加了超时。

<suite name="Acceptance test suite" verbose="1" time-out="5400000" parallel="instances" thread-count="15">

此超时工作正常。

我想绑定一个方法,该方法将在每次测试超时时执行。实际上,我想记录一下这个特定的测试是由TestNG框架终止的,并且通过使用刚刚终止的测试信息终止了其他一些任务。

我已经检查了注释@AfterTest,但是在所有测试完成后它就会执行。我想以个人测试级别登录。

我该如何实现?

1 个答案:

答案 0 :(得分:0)

从今天开始,您应该可以使用TestNG进行操作。您只需要从特定测试方法的Throwable中提取ITestResult对象,检查它是否是超时异常,如果是,则单独记录它。

到目前为止,还没有通过TestNG侦听器执行此操作的直接方法。我已经记录了一个跟踪此(https://github.com/cbeust/testng/issues/1952)的新问题,我将尝试尽早解决此问题,并将在下一个即将发布的主要TestNG版本中提供。请随时观看此问题以获取更新。

这里有一个示例,展示了如何做。

import com.rationaleemotions.stackoverflow.qn53280681.TimeoutListener;
import java.util.concurrent.TimeUnit;
import org.testng.ITestListener;
import org.testng.ITestResult;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
import org.testng.internal.thread.ThreadTimeoutException;

@Listeners(TimeoutListener.class)
public class qn53280681 {
  @Test(timeOut = 500)
  public void timedMethod() throws InterruptedException {
    TimeUnit.SECONDS.sleep(1);
  }

  public static class TimeoutListener implements ITestListener {

    @Override
    public void onTestFailure(ITestResult result) {
      Throwable t = result.getThrowable();
      if (t instanceof ThreadTimeoutException) {
        System.err.println("The test timedout and caused a failure");
      }
    }
  }
}

这是输出

The test timedout and caused a failure

org.testng.internal.thread.ThreadTimeoutException: Method com.rationaleemotions.stackoverflow.qn53280681.timedMethod() didn't finish within the time-out 500

    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1150)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:748)


===============================================
Default Suite
Total tests run: 1, Passes: 0, Failures: 1, Skips: 0
===============================================