Nur Azmina Hanis :
I want to generate an extent report but I am confused as to the difference between creating the extent report by using listener and without using listener?
I am done writing the code for both but I can`t see the difference and which one is better because it looks same and the outcome result also same. Can anyone explain to me which one is better? Below attached my sample code, when I remove listener still can get the same result :
Listener.java
package listener;
public class Listener implements ITestListener {
ExtentTest test;
public void onTestStart(ITestResult result) {
System.out.println("on test start");
}
public void onTestSuccess(ITestResult result) {
System.out.println("on test success");
}
public void onTestFailure(ITestResult result) {
System.out.println("on test failure");
result.getThrowable();
}
public void onTestSkipped(ITestResult result) {
System.out.println("on test skipped");
result.getThrowable();
}
public void onTestFailedButWithinSuccessPercentage(ITestResult result) {
System.out.println("on test sucess within percentage");
}
public void onStart(ITestContext context) {
System.out.println("on start");
}
public void onFinish(ITestContext context) {
System.out.println("on finish");
} }
BaseTest.java
public class BaseTest {
public AppiumDriver<WebElement> driver;
ExtentReports extent;
ExtentTest test;
String timeStamp = new SimpleDateFormat("EEE-d-MMM-yyyy.HH-mm-ss ").format(new Date());
String fileName = System.getProperty("user.dir") + "/result/report" + timeStamp + ".html";
ExtentHtmlReporter htmlReports;
@Parameters("deviceModel")
@BeforeTest
public void setUp() throws MalformedURLException {
htmlReports = new ExtentHtmlReporter(fileName);
extent = new ExtentReports();
extent.attachReporter(htmlReports);
htmlReports.config().setReportName("Testing");
htmlReports.config().setTheme(Theme.STANDARD);
htmlReports.config().setTestViewChartLocation(ChartLocation.BOTTOM);
htmlReports.config().setDocumentTitle("HtmlResultTest");
System.out.println("Session is creating");
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, "ios");
capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION, "10.3.3");
capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "Agmo");
capabilities.setCapability(MobileCapabilityType.BROWSER_NAME, "Safari");
driver = new IOSDriver<WebElement>(new URL("http://localhost:4723/wd/hub"), capabilities);
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
System.out.println("Session is created");
}
@AfterTest
public void tearDown() {
extent.flush();
}
@AfterMethod
public void checkResults(ITestResult testResult){
if (testResult.getStatus()==ITestResult.FAILURE){
test.log(Status.FAIL, "Test case is failed because of below problem");
test.log(Status.FAIL, testResult.getThrowable());
}else if (testResult.getStatus()==ITestResult.SUCCESS){
test.log(Status.PASS, "Test case is passed");
}else if (testResult.getStatus()==ITestResult.SKIP){
test.log(Status.SKIP, testResult.getThrowable());
}
} }
Testing.java
public class Testing extends BaseTest {
@Test(priority = 0)
public void InvalidVerificationCode() {
test = extent.createTest("Invalid code");
System.out.println("Starting test " + new Object() {}.getClass().getEnclosingMethod().getName());
driver.get("https://r2c2-staging.azurewebsites.net");
try {
driver.findElement(By.xpath("//button[@class=\"btn btn-white-green\" and @type=\"button\"]")).click();
driver.findElement(By.xpath("//input[@class=\"ng-untouched ng-pristine ng-invalid\" and @type=\"text\"]")).sendKeys("[email protected]");
driver.findElement(By.xpath("//input[@class=\"ng-untouched ng-pristine ng-invalid\" and @type=\"password\"]")).sendKeys("12345");
driver.findElement(By.xpath("//button[@class=\"signInBtn\" and @type=\"submit\"]")).click();
}catch (Exception e){
driver.findElement(By.xpath("//div[@class=\"title\"]")).click();
}
driver.findElement(By.xpath("//img[@class=\"ng-star-inserted\"]")).click();
driver.findElement(By.xpath("//div[@class=\"logout\"]")).click();
driver.findElement(By.xpath("//button[@class=\"btn btn-white-green\" and @type=\"button\"]")).click();
driver.findElement(By.xpath("//input[@class=\"ng-untouched ng-pristine ng-invalid\" and @type=\"text\"]")).sendKeys("[email protected]");
driver.findElement(By.xpath("//input[@class=\"ng-untouched ng-pristine ng-invalid\" and @type=\"password\"]")).sendKeys("12345");
driver.findElement(By.xpath("//button[@class=\"signInBtn\" and @type=\"submit\"]")).click();
try{
driver.findElement(By.xpath("//div[@class=\"logout\" and @text=\"Logout\"]"));
}catch (Exception e){
String actual_error = driver.findElement(By.xpath("//div[@class=\"modal-content\"]")).getText();
Assert.assertTrue(actual_error.contains("The user name or password provided is incorrect"));
driver.findElement(By.xpath("//button[@class=\"btn btn-primary ok\" and @type=\"button\"]")).click();
System.out.println("Tess login with invalid verification code pass!!\n");
}
}
File.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="tests">
<listeners>
<listener class-name="Listener"/>
</listeners>
<test name="Test ios">
<parameter name="deviceModel" value="Agmo" />
<classes>
<class name="Testing">
<methods>
<include name="InvalidVerificationCode"/>
</methods>
</class>
</classes>
</test>
</suite>
foursyth :
No difference, just 2 ways of creating report.
Although, looking at the code, your usage of Listener will not do anything as its just writing to console. The report is being generated from BaseTest only.