从断言中获取日志消息

Get log message from Assertions

我正在使用范围报告库(版本 4)将 html-报告集成到我们的测试框架中。

为此我写了一个包装器,它封装了我们默认的 TestNG 记录器(用于控制台输出)和 ExtentReport 记录器(ExtentTest.log,为 html-报告收集数据)。 我们使用 TestNg 作为我们的测试框架。

从失败的断言(软断言和硬断言)中捕获日志消息以将其显示在 html-报告中时遇到问题,它们只会进入控制台日志。 捕获这些 Assert 日志消息以在 html-report 中显示它们的可能解决方案是什么?

我无法扩展 Assert(或 SoftAssert)类 并添加我自己的实现(通过在其中添加 ExtentTest.log 的实例),因为我必须替换数十个中的所有断言测试。

public class Loggers {
  private static final Loggers instance = new Loggers();
  private static ExtentTest test;
  private static ExtentReports extent;
  private static Logger LOG;
  private static final String REPORT_LOCATION = "test-output/reports.extent.html";

  /**
   * Returns an instance of {@link ExtentReports} object. If it doesn't exist creates a new instance and returns it
   */
  public static ExtentReports getLogger() {
    if ( extent == null ) {
      createInstance();
    }
    return extent;
  }

  /**
   * Create ExtentReport and attaches htmlReporter to it
   */
  public static void createInstance() {
    ExtentHtmlReporter htmlReporter = getHTMLReporter();
    extent = new ExtentReports();
    extent.attachReporter( htmlReporter );
  }

  /**
   * This method creates, configures and returns an instance of ExtentHtmlReporter
   *
   */
  public static ExtentHtmlReporter getHTMLReporter() {
    ExtentHtmlReporter htmlReporter = new ExtentHtmlReporter( REPORT_LOCATION );
     return htmlReporter;
  }

  /**
   * This method logs a message with the INFO level for both instances of TestNG Logger and ExtentTest
   */
  public void info( String message ) {
    LOG.info( message );
    test.log( Status.INFO, message );
  }

找到解决方案。如果有人有类似的问题,请 post 在这里。

如果您在侦听器 class 中找到您的记录器,您可以将您的记录器放在那里并使用 ITestResult 作为参数,特别是它的方法 getThrowable(它 returns 在运行方法)

 /**
   * Triggered upon the failure of a test
   */
  public void onTestFailure( ITestResult testResult ) {
      LOG.fail( testResult.getThrowable() );
 }

它将在报告中打印失败的断言或抛出的异常。

下面的代码适用于我的范围报告试试吧!

1) 初始化范围报告和记录器

public static Logger log = Logger.getLogger("devpinoyLogger");
public ExtentReports rep = ExtentManager.getInstance();
public static ExtentTest test;

2) 将配置文件 ReportsConfig.xml 用于可从 extentreports 官方网站获取的范围报告。

3) 创建 class ExtentManager 加载配置文件并设置 Extent 报告文件的输出。

   public class ExtentManager {

        private static ExtentReports extent;
        public static ExtentReports getInstance(){

            if(extent==null){
                System.out.println("Path of user DIR"+System.getProperty("user.dir"));
                extent = new ExtentReports(System.getProperty("user.dir")+"\target\surefire-reports\ExecutionReport.html",true,DisplayOrder.OLDEST_FIRST);
                extent.loadConfig(new File(System.getProperty("user.dir")+"\src\main\java\extentconfig\ReportsConfig.xml"));       
            }
            return extent;
        }
    }

4) 使用您正在创建的 INFO 和 ERROR 登录方法在 Extent 报告中显示日志。

public void click(String xpath) {

    try {
        driver.findElement(By.xpath(Variables.OR.getProperty(xpath))).click();
        System.out.println(xpath + "Button clicked");
        test.log(LogStatus.INFO, xpath + " Button clicked");
        Thread.sleep(1000);
    } catch (Exception e) {
        System.err.println("Cannot Click " + e.getMessage());
        test.log(LogStatus.ERROR,"Unable to click on :: " + xpath + " Button");
        throw new AssertionError("Unable to click on ::  " + xpath + " Button", e);
    }
}

5) 使用自定义侦听器 class CustomListeners

public class CustomListeners extends TestBase implements ITestListener, ISuiteListener {

public boolean flag;

..implement all methods of CustomListeners class and use logs in onTestSuccess and onTestFailure Methods.

public void onTestSuccess(ITestResult arg0) {

    test.log(LogStatus.PASS, arg0.getName().toUpperCase() + " PASS");
    rep.endTest(test);
    rep.flush();

}


public void onTestFailure(ITestResult arg0) {
    System.out.println(arg0 + " =================Test Case Failed===========================");
    flag = true;
    System.out.println("Flag is inside onTestFailure " + flag);
    System.setProperty("org.uncommons.reportng.escape-output", "false");

    try {
        test.log(LogStatus.FAIL, arg0.getName().toUpperCase() + " Failed with exception : " + arg0.getThrowable());
        rep.endTest(test);
        rep.flush();
    } catch (IOException e) {
        System.err.println("IOException occurs " + e.getMessage());
        e.printStackTrace();
    }

}

}

  • 通过测试用例的 ExtentReport 视图

  • FAIL 测试用例的 ExtentReport 视图