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

如何在java中使用ExtentReports侦听器打印日志?,java,selenium,automation,testng,extentreports,Java,Selenium,Automation,Testng,Extentreports,在这里,我使用侦听器生成HTML格式的报告,但它不打印测试用例中的日志 样本测试用例 @Test public void testRedirectAllControlScreen() throws Exception { reportLog("login using a valid IsoMetrix username and password."); HomePage homePage = loginPage.login("username", "password");

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

样本测试用例

@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();

}
 public void reportLog(String message) {
    message = BREAK_LINE + message;
    logger.info("Message: " + message);
    Reporter.log(message);
}
基类中存在的方法

@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();

}
 public void reportLog(String message) {
    message = BREAK_LINE + message;
    logger.info("Message: " + message);
    Reporter.log(message);
}
扩展端口侦听器

 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);
        }
    }
  }

}
公共类ExtentReporterNG实现IReporter{
私有扩展报告范围;
公共void生成器报告(列表xmlSuites、列表suites、字符串输出目录){
区段=新的ExtentReports(outputDirectory+File.separator+“ExtentReport.html”,true);
适用于(ISuite:suites){
Map result=suite.getResults();
对于(ISuiteResult r:result.values()){
ITestContext=r.getTestContext();
buildTestNodes(context.getPassedTests(),LogStatus.PASS);
buildTestNodes(context.getFailedTests(),LogStatus.FAIL);
buildTestNodes(context.getSkippedTests(),LogStatus.SKIP);
}
}
expndure.flush();
extent.close();
}
私有void buildTestNodes(IResultMap测试、日志状态){
延伸试验;
如果(tests.size()>0){
for(ITestResult结果:tests.getAllResults()){
test=extent.startTest(result.getMethod().getMethodName());
测试。分配作者(“360Log”);
test.setStartedTime(getTime(result.getStartMillis());
test.setEndedTime(getTime(result.getEndMillis());
对于(字符串组:result.getMethod().getGroups())
测试类别(组);
int s=result.getStatus();
if(result.getStatus()==1){
test.log(状态,“test”+状态.toString().toLowerCase()+“ed”);
}否则{
字符串屏幕=BaseTest.screen;
test.log(status,“test”+status.toString().toLowerCase()+“ed”+test.addScreenCapture(screen));
}
范围.结束试验(试验);
}
}
}
}

PFA的截图

以下代码适用于我的扩展报告版本:v2.41.1,请试用

尝试创建扩展报告和记录器的对象,如下代码所示

// 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());
    }

  }

如果不使用listener,我也能实现同样的效果。 我在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);

}
样本测试用例

@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();

}
  • 扩展报告视图

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

public void buildTestNodes(IResultMap测试,日志状态){
//扩展测试=null;
如果(tests.size()>0){
List resultList=新的LinkedList(tests.getAllResults());
类ResultComparator实现Comparator{
公共整数比较(ITestResult r1、ITestResult r2){
返回getTime(r1.getStartMillis()).compareTo(getTime(r2.getStartMillis());
}
}
sort(resultList,newresultcomparator());
用于(ITestResult结果:结果列表){
test=extent.startTest(result.getMethod().getMethodName());
test.getTest().setDescription(result.getMethod().getDescription());
test.getTest().setStartedTime(getTime(result.getStartMillis());
test.getTest().setEndedTime(getTime(result.getEndMillis());
对于(字符串消息:Reporter.getOutput(result)){**//此代码从Reporter对象中选取日志**
测试日志(LogStatus.INFO,消息);
}
对于(字符串组:result.getMethod().getGroups())
测试类别(组);
String message=“Test”+status.toString().toLowerCase()+“ed”;
if(result.getThrowable()!=null)
message=result.gethrowable().getClass()+“:”+result.gethrowable().getMessage();
测试日志(状态、消息);
范围.结束试验(试验);
}
}
}

这是做什么的?日志(消息)@santhoshkumar这是TestNG为日志记录提供的默认方法。然后我们需要在before方法中启动扩展测试,并以text.log(“”)的形式进行日志记录;在@test method@santhoshkumar中,如果我们使用这种方法,那么监听器需要什么呢。我不想在before方法中初始化exent测试。这就是问题所在。是的,我同意。。但是如果我们需要为每个测试添加步骤,那么这就是方法