Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I include a failure screenshot to the testNG report

currently I am taking screenshots of my test failures this way:

@AfterMethod(alwaysRun=true)
public void catchExceptions(ITestResult result){
    Calendar calendar = Calendar.getInstance();
    SimpleDateFormat formater = new SimpleDateFormat("dd_MM_yyyy_hh_mm_ss");
    String methodName = result.getName();
    if(!result.isSuccess()){
        File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
        try {
            FileUtils.copyFile(scrFile, new File((String) PathConverter.convert("failure_screenshots/"+methodName+"_"+formater.format(calendar.getTime())+".png")));
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }
}

Can I include my own screenshots into the TestNG report link or pic? If yes how?

All I found on that online is the FEST framework. But since I am already taking the screenshots I dont want to use another framework.

like image 416
Tarken Avatar asked Jan 20 '12 09:01

Tarken


People also ask

How are you doing screenshot of failed test cases?

To achieve this, we could place the entire code in try-catch block. Which means placing the test steps in try block and screen capture statement in catch block. If a test step fails in the try block then it goes to the catch block and capture a screenshot of the web page.

How do I run a failed test case in TestNG?

Right click on the project and choose Refresh. On refreshing, the tester will see a test-output folder as shown below.

How do I insert a screenshot into Reportng report?

Once you have taken a screenshot and stored at some location, you can insert it as a link in the test report as the testng report is a html document. Then my reporter shows: <a href="someUrl">click to open screenshot</a> instead of a clickable link.


2 Answers

Yes, you can include the link to your screenshot in testng report.

You need to call org.testng.Reporter.log method to write the hyperlink to the testng report either by annotating your test class or parent of all testclasses with @Listeners({yourListener.class}) or by adding the listener to your testng.xml.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="default">
  <listeners>
    <listener class-name="ScreenshotListener" />
  </listeners>
  <test name="Test">
    <packages>
      <package name="someTests.*"/>
    </packages>
  </test>
</suite>

You need to first create a Listener class and add it to testng. You can get details for that from testng.org. Search for listener.

Once you create that class, you should write a method in it which overrides the ontestfailure method. The code inside this method will be executed whenever testng identifies a failure.

You can call your screenshot grabbing method and use Reporter.log to put the hyperlink to that screenshot. Then you can find this link under the failed testcases details.

import java.io.*;
import java.util.*;
import java.text.*;
import org.apache.commons.io.FileUtils;

import org.openqa.selenium.*;

import org.testng.*;

public class ScreenshotListener extends TestListenerAdapter {
    @Override
    public void onTestFailure(ITestResult result) {
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat formater = new SimpleDateFormat("dd_MM_yyyy_hh_mm_ss");
        String methodName = result.getName();
        if(!result.isSuccess()){
            File scrFile = ((TakesScreenshot)SomeStaticWebDriver.driver).getScreenshotAs(OutputType.FILE);
            try {
                String reportDirectory = new File(System.getProperty("user.dir")).getAbsolutePath() + "/target/surefire-reports";
                File destFile = new File((String) reportDirectory+"/failure_screenshots/"+methodName+"_"+formater.format(calendar.getTime())+".png");
                FileUtils.copyFile(scrFile, destFile);
                Reporter.log("<a href='"+ destFile.getAbsolutePath() + "'> <img src='"+ destFile.getAbsolutePath() + "' height='100' width='100'/> </a>");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
like image 90
A.J Avatar answered Oct 24 '22 12:10

A.J


Customizing a bit of ExtentReport can give extremely useful report having exception+screenshot captured exactly at time of test failure . Screenshot can be placed alongside exception which user can use to know what was website doing when error occurred.

Report Example enter image description here Test

      @Test (enabled=true)                           
        public void verifySearch() {
       extentlogger = extent.createTest("To verify verifySearch");
      //Your other code here.....
        soft.assertEquals("xxx", "xxxx");
        soft.assertAll();
      }

AfterMethod

     @AfterMethod
     public void getResult(ITestResult result) throws Exception{
      if(result.getStatus() == ITestResult.FAILURE)
     {
        extentlogger.log(Status.FAIL, MarkupHelper.createLabel(result.getThrowable() + 
        " - Test Case Failed", ExtentColor.RED));
    
        try {
        // get path of captured screenshot using custom failedTCTakeScreenshot method
        String screenshotPath = failedTCTakeScreenshot( result);
        extentlogger.fail("Test Case Failed Snapshot is below " + 
      extentlogger.addScreenCaptureFromPath(screenshotPath));
       } catch (InterruptedException e) {
        e.printStackTrace();
        }
      }
     }
like image 33
Vikas Piprade Avatar answered Oct 24 '22 12:10

Vikas Piprade