【问题标题】:Close was called before test could end safely using EndTest when running the test in multiple threads在多个线程中运行测试时,在使用 EndTest 安全结束测试之前调用了 Close
【发布时间】:2019-02-28 15:22:14
【问题描述】:

当我在多线程中运行我的测试(使用 TestNG 在多线程中启动测试)时,我遇到了ExtentTestInterruptedException 异常:

com.relevantcodes.extentreports.ExtentTestInterruptedException: 
Close was called before test could end safely using EndTest.
    at com.relevantcodes.extentreports.Report.terminate(Report.java:425)
    at com.relevantcodes.extentreports.ExtentReports.close(ExtentReports.java:917)

遵循的步骤

  1. 我开始使用 @BeforeTest 方法和范围报告 startTest 方法进行测试
  2. 并以@AfterMethod 方法中的范围报告endTest 结束我的测试
  3. 我的范围报告关闭方法在@AfterSuite函数中定义。
  4. 我从@AfterSuite 中删除了close() 方法调用,但在这种情况下,少数测试用例的结果显示为未知。

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 请分享试用码。
  • 导入 com.relevantcodes.extentreports.ExtentReports;导入 com.relevantcodes.extentreports.ExtentTest;导入java.io.File;公共类 ExtentReport { 公共静态 ExtentReports 范围;公共静态 ExtentTest 测试; public static void initExtentReport() { extent = new ExtentReports( System.getProperty("user.dir") +"/test-output" + File.separator + "API.html", true); extent.loadConfig(new File(System.getProperty("user.dir") + "/reportconfig.xml")); } }
  • 仅在您的问题中包含试用代码。您需要分享您的 AfterMethod 和 AfterSuite 注释代码。
  • @NikhilIndurkar 我建议使用版本 4 API。第 2 版不再受支持,第 3 版也即将停止支持。文档:extentreports.com/docs/versions/4/java
  • @foursyth:我集成了 4.05 版本的 aventstack 范围报告,我也没有收到相同的错误消息,但在这种情况下,通过测试用例没有任何信息,即当我看到结果时通过测试用例没有日志信息(不知何故我无法为这个问题添加附件)

标签: java testng extentreports


【解决方案1】:

这与范围报告有关。我不确定你是如何编写@after 方法的,但我只能猜到你在代码中使用了reports.endTest(test);这是在旧版本的范围报告中。很可能您的问题与它有关。这是具有最新范围报告解决方案的替代,因为此处没有针对您的问题的范围报告相关代码。

@AfterMethod
public synchronized void afterMethod(ITestResult result) {

    StringBuilder inputArgs = new StringBuilder();
    Object objects[] = result.getParameters();

    for(Object obj : objects){
        if(obj==null){
            inputArgs.append("  ");
        }else{
            inputArgs.append(obj.toString());
        }
        inputArgs.append(" , ");
    }

    if (result.getStatus() == ITestResult.FAILURE)
        test.get().fail(result.getThrowable()+ "Input Parameters : "+inputArgs.toString());
    else if (result.getStatus() == ITestResult.SKIP)
        test.get().skip(result.getThrowable() + "Input Parameters : "+inputArgs.toString());
    else
        test.get().pass( " Test Passed. Input parameters : " +inputArgs.toString());
    extent.flush();
}

【讨论】:

    【解决方案2】:

    当测试失败时,如果没有为 extend.endTest() 处理,你将面临这个问题。 我使用下面的 ITestListener 方法来处理测试失败。此处将捕获原因并将其记录到报告中,并结束范围报告记录。

    public void onTestFailure(ITestResult t)
        {
            if(t.getStatus()==ITestResult.FAILURE) {
                String reason = t.getThrowable().toString();
                logger.log(LogStatus.FAIL, reason);
                extent.endTest(logger);
            }
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-08
      • 2016-08-07
      • 2018-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多