【问题标题】:Skipped test is not logged as Skipped in ExtentReport4跳过的测试未在 ExtentReport4 中记录为已跳过
【发布时间】:2019-12-27 12:15:30
【问题描述】:

我得到了 2 个测试:addNewVideodeleteRecentVideo,其中第二个取决于第一个。在第一次失败后,第二次被忽略并且它没有运行。打开我的范围报告后,它看起来像这样:

我预计会有 2 次测试 - 1 次失败,1 次跳过,但报告中没有正确显示。

ExtentListener.class


import com.aventstack.extentreports.*;
import com.aventstack.extentreports.markuputils.*;
import org.testng.*;
import java.util.*;
import static constants.FileResources.REPORT_DIR;

public class ExtentListener implements ITestListener {

    private static Date d = new Date();
    private static String fileName = String.format("%s%s%s%s", d.toString().replaceAll("[: ]", "_"), "_", System.getenv("env"), ".html");
    private static ExtentReports extent = ExtentManager.createInstance(REPORT_DIR + fileName);
    public static ThreadLocal<ExtentTest> testReport = new ThreadLocal<>();

    @Override
    public void onTestStart(ITestResult result) {
        ExtentTest test = extent.createTest(result.getTestClass().getName() + "." + result.getMethod().getMethodName());
        test.assignCategory(result.getTestClass().getName());
        testReport.set(test);
    }

    @Override
    public void onTestSuccess(ITestResult result) {
        String methodName = result.getMethod().getMethodName();
        String logText = methodName + " PASSED";
        Markup m = MarkupHelper.createLabel(logText, ExtentColor.GREEN);
        testReport.get().pass(m);
    }

    @Override
    public void onTestFailure(ITestResult result) {
        String methodName = result.getMethod().getMethodName();
        String excepionMessage = Arrays.toString(result.getThrowable().getStackTrace());
        testReport.get().fail("<details>" + "<summary>" + "<b>" + "<font color=" + "red>" + "Exception occured: Expand to check details"
                + "</font>" + "</b >" + "</summary>" + excepionMessage.replaceAll(",", "<br>") + "</details>" + " \n");
        String failureLog = methodName + " FAILED";
        Markup m = MarkupHelper.createLabel(failureLog, ExtentColor.RED);
        testReport.get().log(Status.FAIL, m);
    }

    @Override
    public void onTestSkipped(ITestResult result) {
        String methodName = result.getMethod().getMethodName();
        String logText = "<b>" + methodName + " SKIPPED" + "</b>";
        Markup m = MarkupHelper.createLabel(logText, ExtentColor.ORANGE);
        testReport.get().skip(m);
    }

    @Override
    public void onTestFailedButWithinSuccessPercentage(ITestResult result) {

    }

    @Override
    public void onStart(ITestContext context) {

    }

    @Override
    public void onFinish(ITestContext context) {
        if (extent != null) {
            extent.flush();
        }
    }
}

我尝试实现IInvokedMethodListener,但没有成功。 有什么方法可以在 ExtentReport4 上正确显示跳过的测试?

【问题讨论】:

    标签: java selenium testing extentreports selenium-extent-report


    【解决方案1】:

    伙计们,我也遇到了这个问题,下面的代码对我有用。 像这样定义 testListener,然后在 Baseclass 开始之前使用 @listeners(TestListeners.class) 在 Baseclass 中调用这个 testListener 类。

    注意:我使用过 Spark Extentreport

    公共类 TestListeners 实现 ITestListener {

    @覆盖 public void onTestSkipped(ITestResult 结果) {

    Baseclass.extenttest = Baseclass.extent.createTest(result.getMethod().getDescription()).assignCategory("SkipedTest");
    Baseclass.extenttest .log(Status.SKIP, result.getThrowable());
    Baseclass.extenttest .log(Status.SKIP, result.getMethod().getDescription());
    Baseclass.extenttest .log(Status.SKIP,  MarkupHelper.createLabel(result.getName(), ExtentColor.YELLOW));
    Baseclass.extent.flush();
    

    } }

    在您的测试类中定义@Test,如下所示

    @Test(description = "测试用例名称", dependsOnMethods = { "它所依赖的方法名称" })

    【讨论】:

      【解决方案2】:

      我再次尝试IInvokeMethodListener2,但这只是一种解决方法。

      如果来自dependsOnMethods 的方法失败,则测试方法根本没有执行,因此它没有记录为skipped。我的解决方案是将依赖方法标记为description,并在调用之前检查它是否包含来自测试类的任何失败方法。

      public class MethodListener implements IInvokedMethodListener2 {
      
          @Override
          public void beforeInvocation(IInvokedMethod method, ITestResult testResult, ITestContext context) {
      
              List<String> failed = context
                              .getFailedTests()
                              .getAllMethods()
                              .stream()
                              .map(ITestNGMethod::getMethodName)
                              .collect(Collectors.toList());
      
              boolean isSkippable = false;
              if (failed.size() > 0 && method.getTestMethod().getDescription() != null) {
                  List<String> methodNames = Arrays.asList(method.getTestMethod().getDescription().split(";"));
                  isSkippable = failed
                                  .stream()
                                  .anyMatch(methodNames::contains);
              }
      
      
              if (isSkippable) {
                  throw new SkipException("Skipping " + method.getTestMethod().getMethodName());
              }
      
          }
      
          @Override
          public void afterInvocation(IInvokedMethod method, ITestResult testResult, ITestContext context) {
      
          }
      
          @Override
          public void beforeInvocation(IInvokedMethod method, ITestResult testResult) {
      
          }
      
          @Override
          public void afterInvocation(IInvokedMethod method, ITestResult testResult) {
      
          }
      }
      
      @Listeners({MethodListener.class, ExtentListener.class})
      public class SampleTest extends TestsBase {
      
          @Test(priority = 1)
          public void pass() {
              System.out.println("pass");
          }
      
          @Test(priority = 2)
          public void fail1() {
              System.out.println("fail1");
              Assert.fail();
          }
      
          @Test(priority = 3)
          public void fail2() {
              System.out.println("fail2");
              Assert.fail();
          }
      
          @Test(priority = 4)
          public void fail3() {
              System.out.println("fail3");
              Assert.fail();
          }
      
          @Test(priority = 5)
          public void fail4() {
              System.out.println("fail4");
              Assert.fail();
          }
      
          @Test(priority = 6, description = "pass;fail2")
          public void skip1() {
              System.out.println("skip1");
          }
      
          @Test(priority = 7, description = "pass;fail3")
          public void skip2() {
              System.out.println("skip2");
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-20
        • 2013-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-26
        • 1970-01-01
        • 2013-04-30
        相关资源
        最近更新 更多