How to display test name under Extent Report instead of Method Name?

user2560019 picture user2560019 · Dec 30, 2017 · Viewed 16k times · Source

In the Extent Report, I want to display the name of test instead of method name. So I found a solution, added a test name attribute for @Test annotation

Problem 1: In the report I see null being returned for getTestName method.

Problem 2: I am not able to create a test under 'Tests' column in the report with the test name. Here is the line which does that:

test = extent.createTest(Thread.currentThread().getStackTrace()1.getMethodName().toString());

I have added my test case and the Extent Report code. Please suggest.

My code for Extent Report:

package com.gale.precision.FundVisualizer.core;

import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebElement;
import org.testng.ITestContext;
import org.testng.ITestResult;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeSuite;

import com.aventstack.extentreports.ExtentReports;
import com.aventstack.extentreports.ExtentTest;
import com.aventstack.extentreports.Status;
import com.aventstack.extentreports.markuputils.ExtentColor;
import com.aventstack.extentreports.markuputils.MarkupHelper;
import com.aventstack.extentreports.reporter.ExtentHtmlReporter;
import com.aventstack.extentreports.reporter.configuration.ChartLocation;
import com.aventstack.extentreports.reporter.configuration.Theme;
import com.gale.precision.FundVisualizer.utility.SendEmail;

public class ExtentReport {
	public static ExtentHtmlReporter htmlReporter;
	public static ExtentReports extent;
	public static ExtentTest test;
	public static String suiteName;

	@BeforeSuite
	public static void setUp(ITestContext ctx) {

		// String currentDate=getDateTime();
		suiteName = ctx.getCurrentXmlTest().getSuite().getName();
		htmlReporter = new ExtentHtmlReporter(System.getProperty("user.dir") + "/Reports/" + suiteName + ".html");
		extent = new ExtentReports();
		extent.attachReporter(htmlReporter);

		extent.setSystemInfo("OS", "Windows");
		extent.setSystemInfo("Host Name", "CI");
		extent.setSystemInfo("Environment", "QA");
		extent.setSystemInfo("User Name", "QA_User");

		htmlReporter.config().setChartVisibilityOnOpen(true);
		htmlReporter.config().setDocumentTitle("AutomationTesting Report");
		htmlReporter.config().setReportName("testReport");
		htmlReporter.config().setTestViewChartLocation(ChartLocation.TOP);
		htmlReporter.config().setTheme(Theme.STANDARD);
	}

	@AfterMethod
	public void getResult(ITestResult result) throws IOException {
		if (result.getStatus() == ITestResult.FAILURE) {
			String screenShotPath = GetScreenShot.capture(Base.driver, "screenShotName", result);
			test.log(Status.FAIL, MarkupHelper.createLabel(result.getTestName() + " Test case FAILED due to below issues:",
					ExtentColor.RED));
			test.fail(result.getThrowable());
			test.fail("Snapshot below: " + test.addScreenCaptureFromPath(screenShotPath));
		} else if (result.getStatus() == ITestResult.SUCCESS) {
			test.log(Status.PASS, MarkupHelper.createLabel(result.getTestName() + " Test Case PASSED", ExtentColor.GREEN));
		} else {
			test.log(Status.SKIP,
					MarkupHelper.createLabel(result.getTestName()+ " Test Case SKIPPED", ExtentColor.ORANGE));
			test.skip(result.getThrowable());
		}
		extent.flush();
	}

	@AfterSuite 
	public void tearDown() throws Exception {
		System.out.println("In After Suite");
		SendEmail.execute(SendEmail.path);
	}

	public static String getDateTime() {

		// Create object of SimpleDateFormat class and decide the format
		DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");

		// get current date time with Date()
		Date date = new Date();

		// Now format the date
		String currentDate = dateFormat.format(date);

		String newDate = currentDate.replace('/', '_');
		String newCurrentDate = newDate.replace(':', '.');
		return newCurrentDate;

	}
	public void elementHighlight(WebElement element) {
		for (int i = 0; i < 2; i++) {
			JavascriptExecutor js = (JavascriptExecutor) Base.driver;
			js.executeScript(
					"arguments[0].setAttribute('style', arguments[1]);",
					element, "color: red; border: 3px solid red;");
			js.executeScript(
					"arguments[0].setAttribute('style', arguments[1]);",
					element, "");
		}
	}
	
}

I want to display test name in the report at the selected area. Please refer the imagescreenshot

Thanks in advance!!

Answer

Harish picture Harish · Dec 31, 2017

For Problem 1, you should be using result.getMethod().getMethodName() to get the test method name.

For Problem 2, a cleaner way of doing this would be to add a BeforeMethod and initialize the Extent test here instead of initializing it in every test method. You can get the testname or any other annotation value using the below technique inside BeforeMethod:

@BeforeMethod
public void setup(Method method) {
    String testMethodName = method.getName(); //This will be:verifySaveButtonEnabled
    String descriptiveTestName = method.getAnnotation(Test.class).testName(); //This will be: 'Verify if the save button is enabled'
    test = extent.createTest(descriptiveTestName);
}