如何在 java 中使用 ExtentReports 侦听器打印日志?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/44542760/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-03 08:14:10  来源:igfitidea点击:

How to print logs by using ExtentReports listener in java?

javaseleniumautomationtestngextentreports

提问by Vaibhav_Sharma

Here I am using the listener for generating reports in HTML format but it is not printing the logs present in a test case.

在这里,我使用侦听器生成 HTML 格式的报告,但它不打印测试用例中存在的日志。

Sample Test Cases

示例测试用例

@Test
public void testRedirectAllControlScreen() throws Exception {

    reportLog("login using a valid IsoMetrix username and password.");
    HomePage homePage = loginPage.login("username", "password");

    reportLog("Go to All Control page");
    AllControlPage allControlPage = homePage.navigateToControlPage();

    reportLog("Verify All Control page");
    allControlPage.verifyAllControlPage();

}

Method Present in BaseClass

BaseClass 中存在的方法

 public void reportLog(String message) {
    message = BREAK_LINE + message;
    logger.info("Message: " + message);
    Reporter.log(message);
}

ExtentReport Listener

范围报告侦听器

 public class ExtentReporterNG implements IReporter {

private ExtentReports extent;

public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites, String outputDirectory) {
    extent = new ExtentReports(outputDirectory + File.separator + "ExtentReport.html", true);

    for (ISuite suite : suites) {
        Map<String, ISuiteResult> result = suite.getResults();

        for (ISuiteResult r : result.values()) {
            ITestContext context = r.getTestContext();
            buildTestNodes(context.getPassedTests(), LogStatus.PASS);
            buildTestNodes(context.getFailedTests(), LogStatus.FAIL);
            buildTestNodes(context.getSkippedTests(), LogStatus.SKIP);
        }
    }

    extent.flush();
    extent.close();
}

private void buildTestNodes(IResultMap tests, LogStatus status) {
    ExtentTest test;

    if (tests.size() > 0) {
        for (ITestResult result : tests.getAllResults()) {
            test = extent.startTest(result.getMethod().getMethodName());
            test.assignAuthor("360Log");
            test.setStartedTime(getTime(result.getStartMillis()));
            test.setEndedTime(getTime(result.getEndMillis()));

            for (String group : result.getMethod().getGroups())
                test.assignCategory(group);
            int s = result.getStatus();
            if (result.getStatus() == 1) {
                test.log(status, "Test " + status.toString().toLowerCase() + "ed");
            } else {
                String screen = BaseTest.screen;
                test.log(status, "Test " + status.toString().toLowerCase() + "ed " + test.addScreenCapture(screen));

            }
            extent.endTest(test);
        }
    }
  }

}

PFA the screenshot. It doesn't print logs step wise.

PFA截图。 它不会逐步打印日志。

回答by Ag_Yoge

The Below Code Works for me for Extent Report version : v2.41.1, Try it!!!

下面的代码适用于 Extent Report 版本:v2.41.1,试试吧!!!

Try Creating an Object of Extent Report and logger as the Below Code.

尝试创建一个范围报告和记录器的对象作为下面的代码。

// Base Class Usage
public static ExtentReports report;
public static ExtentTest logger;

report = new ExtentReports(path);       
report.loadConfig(new File("//home//.....//extent-config.xml"));

logger = report.startTest(this.getClass().getSimpleName()).assignCategory("Happy Path"));

// Test Case Usage: Using it at Every Step in Each Test Case
 logger.log(LogStatus.INFO,"String Message to Log for Each Step in Test Case");

// @AfterMethod
@AfterMethod(alwaysRun=true)
  public void TearDown_AM(ITestResult result) throws IOException
  {
      System.out.println("@After Method");
    try
    { 
        if(result.getStatus()==ITestResult.FAILURE)
        {
            String res = captureScreenshot(Driver, result.getName());
            String image= logger.addScreenCapture(res);
            System.out.println(image);
            String TestCaseName = this.getClass().getSimpleName() + " Test Case Failure and Title/Boolean Value Failed";
            logger.log(LogStatus.FAIL, TestCaseName  + logger.addScreenCapture(res));
            //  logger.log(LogStatus.FAIL, image, this.getClass().getSimpleName() + " Test Case Failure and Title/Boolean Value Failed");
        }
        else if(result.getStatus()==ITestResult.SUCCESS)
        {
            logger.log(LogStatus.PASS, this.getClass().getSimpleName() + " Test Case Success and Title Verified"); 
        }
        else if(result.getStatus()==ITestResult.SKIP)
        {
            logger.log(LogStatus.SKIP, this.getClass().getSimpleName() + " Test Case Skipped");
        }
        report.endTest(logger);
        report.flush();

    }
    catch(Throwable t)
    {
        logger.log(LogStatus.ERROR,t.fillInStackTrace());
    }

  }

Logging in Extent Report Test Case Wise

明智地登录范围报告测试用例

回答by Vaibhav_Sharma

Without using listener I am able to achieve the same thing. I implemented the extent test and extent report in Baseclass.javaas per people suggestion like this:

不使用侦听器,我也能达到同样的目的。我按照人们的建议在Baseclass.java 中实现了范围测试和范围报告,如下所示:

public static ExtentTest test;
public static ExtentReports extent;

@BeforeSuite
public void before() {
    extent = new ExtentReports("target\surefire-reports\ExtentReport.html", true);
}

@BeforeMethod
public void setUp(Method method) throws Exception {
            test = extent.startTest(method.getClass().getSimpleName(),method.getClass().getEnclosingMethod().getName());
    test.assignAuthor("Vaibhav");
//Rest code will be generic for browser initiliazion.

}

@AfterSuite
public void tearDownSuite() {
    // reporter.endReport();
    extent.flush();
    extent.close();
}

//Method for adding logs passed from test cases
 public void reportLog(String message) {    
    test.log(LogStatus.INFO, message);//For extentTest HTML report
    logger.info("Message: " + message);
    Reporter.log(message);

}

Sample Test Case

示例测试用例

@Test
public void testRedirectAllControlScreen() throws Exception {

    reportLog("login using a valid IsoMetrix username and password.");
    HomePage homePage = loginPage.login("username", "password");

    reportLog("Go to All Control page");
    AllControlPage allControlPage = homePage.navigateToControlPage();

    reportLog("Verify All Control page");
    allControlPage.verifyAllControlPage();

}
  • ExtentReport view
  • 范围报告视图

ExtentReport view

范围报告视图

回答by Harisha K P

I know this question is little old but might help someone. Use this code for buildTestNodes method to print TestNG logs - Reporter.log().

我知道这个问题有点老,但可能对某人有帮助。将此代码用于 buildTestNodes 方法以打印 TestNG 日志 - Reporter.log()。

public void buildTestNodes(IResultMap tests, LogStatus status) {
        //ExtentTest test = null;
        if (tests.size() > 0) {
            List<ITestResult> resultList = new LinkedList<ITestResult>(tests.getAllResults());
            class ResultComparator implements Comparator<ITestResult> {
                public int compare(ITestResult r1, ITestResult r2) {
                    return getTime(r1.getStartMillis()).compareTo(getTime(r2.getStartMillis()));
                }
            }
            Collections.sort(resultList , new ResultComparator ());

            for (ITestResult result : resultList) {
                test = extent.startTest(result.getMethod().getMethodName());
                test.getTest().setDescription(result.getMethod().getDescription());
                test.getTest().setStartedTime(getTime(result.getStartMillis()));
                test.getTest().setEndedTime(getTime(result.getEndMillis()));
                for(String message:Reporter.getOutput(result)){    **//This code picks the log from Reporter object.**
                    test.log(LogStatus.INFO, message);
                }
                for (String group : result.getMethod().getGroups())
                test.assignCategory(group);
                String message = "Test " + status.toString().toLowerCase() + "ed";
                if (result.getThrowable() != null)
                message = result.getThrowable().getClass() +": "+ result.getThrowable().getMessage();
                test.log(status, message);
                extent.endTest(test);
            }
        }
    }