Anpassa, PDF och e-post TestNG Rapporter i Selenium webbdrivrutin

Innan vi tittar på något annat, låt oss först förstå –

Varför behöver vi rapportering?

När vi använder Selenium eller något annat automationsverktyg utför vi operationer på webbapplikationen. Men vårt syfte med automatisering är inte bara att utöva Application Under Test. Vi som automationstestare är tänkta att testa applikationen, hitta buggar och rapportera den till utvecklingsteamet eller högre ledning. Här får rapporteringen betydelse för mjukvara Testning process

TestNG Rapportering

TestNG biblioteket erbjuder en mycket praktisk rapporteringsfunktion. Efter avrättningen, Testng kommer att generera en test-output-mapp i roten av projektet. Denna mapp innehåller två typer av rapporter-

Index.html: Detta är den fullständiga rapporten över aktuell körning som innehåller information som ett fel, grupper, tid, reporterloggar, testng XML-filer.

TestNG Rapportering

emailable-report.html: Detta är den sammanfattande rapporten för den aktuella testkörningen som innehåller Testfall meddelande i grönt (för godkända testfall) och rött (för misslyckade testfall) markera.

TestNG Rapportering

Hur du anpassar TestNG Rapport

TestNG rapportering är ganska praktiskt men ibland behöver vi lite mindre data i rapporter eller vill visa rapporter i något annat format som pdf, excel, etc. eller vill ändra rapportens layout.

Det kan finnas två sätt vi kan anpassa TestNG rapport

  • Använda ITestListener Interface:
  • Använda IReporter Interface:

skräddarsy TestNG Rapport

ITestListener-gränssnitt

Vi använder detta gränssnitt när vi behöver anpassa realtidsrapporten. Med andra ord, om vi kör ett gäng testfall i en TetNG-svit och vi vill få rapporten för varje testfall, måste vi efter varje testfall implementera ITestListener-gränssnittet. Detta gränssnitt kommer att åsidosätta onTestFailure, onTestStart, onTestSkipped metod för att skicka korrekt status för det aktuella testfallet.

ITestListener-gränssnitt

Här är stegen vi kommer att följa

  • Skapa en klass säg RealGuru99Report och implementera iTestListener i den.
  • Implementera metoder för iTestListener
  • Skapa testmetod och lägg till klassen RealGuru99Report som lyssnare i klassen Testmetod.

ITestListener-gränssnitt

Kodsexempel

RealGuru99TimeReport.java är realtidsrapporteringsklassen. Det kommer att implementera ITestListener-gränssnittet för rapportering

package testNGReport.realTimeReport;

import org.testng.ITestContext;

import org.testng.ITestListener;

import org.testng.ITestResult;

public class RealGuru99TimeReport implements ITestListener{

    @Override

    public void onStart(ITestContext arg0) {

         System.out.println("Start Of Execution(TEST)->"+arg0.getName());

    }

    @Override

    public void onTestStart(ITestResult arg0) {

        System.out.println("Test Started->"+arg0.getName());

    }

    @Override

    public void onTestSuccess(ITestResult arg0) {

        System.out.println("Test Pass->"+arg0.getName());

    }

    @Override

    public void onTestFailure(ITestResult arg0) {

        System.out.println("Test Failed->"+arg0.getName());

    }

    @Override

    public void onTestSkipped(ITestResult arg0) {

        System.out.println("Test Skipped->"+arg0.getName());

    }

    @Override

    public void onFinish(ITestContext arg0) {

System.out.println("END Of Execution(TEST)->"+arg0.getName());

    }

    @Override

    public void onTestFailedButWithinSuccessPercentage(ITestResult arg0) {

        // TODO Auto-generated method stub

        

    }

    

}

TestGuru99RealReport.java är testfallet för en riktig rapport

package testNGReport.realTimeReport;

import org.testng.Assert;

import org.testng.annotations.Listeners;

import org.testng.annotations.Test;

@Listeners(RealGuru99TimeReport.class)

public class TestGuru99RealReport {

    @Test

    public void testRealReportOne(){

        Assert.assertTrue(true);

    }

    

    @Test

    public void testRealReportTwo(){

        Assert.assertTrue(false);

    }

    //Test case depends on failed testcase= testRealReportTwo

    @Test(dependsOnMethods="testRealReportTwo")

    public void testRealReportThree(){

        

    }

}

Utgången kommer att se ut som-

ITestListener-gränssnitt

IReporter-gränssnitt

Om vi ​​vill anpassa sluttestrapporten genererad av TestNG, måste vi implementera IReporter-gränssnittet. Detta gränssnitt har bara en metod för att implementera genereraReport. Denna metod har all information om en fullständig testkörning i listan , och vi kan generera rapporten med den.

Kodsexempel

Guru99Reporter.java är filen som används för att anpassa rapporten

package testNGReport.iReporterReport;

import java.util.Collection;

import java.util.Date;

import java.util.List;

import java.util.Map;

import java.util.Set;

import org.testng.IReporter;

import org.testng.IResultMap;

import org.testng.ISuite;

import org.testng.ISuiteResult;

import org.testng.ITestContext;

import org.testng.ITestNGMethod;

import org.testng.xml.XmlSuite;

public class Guru99Reporter implements IReporter{

    @Override

    public void generateReport(List<XmlSuite> arg0, List<ISuite> arg1,

            String outputDirectory) {

        // Second parameter of this method ISuite will contain all the suite executed.

        for (ISuite iSuite : arg1) {

         //Get a map of result of a single suite at a time

            Map<String,ISuiteResult> results =    iSuite.getResults();

         //Get the key of the result map

            Set<String> keys = results.keySet();

        //Go to each map value one by one

            for (String key : keys) {

             //The Context object of current result

            ITestContext context = results.get(key).getTestContext();

            //Print Suite detail in Console

             System.out.println("Suite Name->"+context.getName()

                    + "::Report output Ditectory->"+context.getOutputDirectory()

                     +"::Suite Name->"+ context.getSuite().getName()

                     +"::Start Date Time for execution->"+context.getStartDate()

                     +"::End Date Time for execution->"+context.getEndDate());

            

             //Get Map for only failed test cases

            IResultMap resultMap = context.getFailedTests();

            //Get method detail of failed test cases

            Collection<ITestNGMethod> failedMethods = resultMap.getAllMethods();

            //Loop one by one in all failed methods

            System.out.println("--------FAILED TEST CASE---------");

            for (ITestNGMethod iTestNGMethod : failedMethods) {

                //Print failed test cases detail

                System.out.println("TESTCASE NAME->"+iTestNGMethod.getMethodName()

                        +"\nDescription->"+iTestNGMethod.getDescription()

                        +"\nPriority->"+iTestNGMethod.getPriority()

                        +"\n:Date->"+new Date(iTestNGMethod.getDate()));

                

            }

        }

        }

        

    }

}

TestGuru99ForReporter.java är en demo för anpassad rapportering

package testNGReport.iReporterReport;

import org.testng.Assert;

import org.testng.annotations.Listeners;

import org.testng.annotations.Test;

//Add listener to listen report and write it when testcas finished

@Listeners(value=Guru99Reporter.class)

public class TestGuru99ForReporter {

    @Test(priority=0,description="testReporterOne")

    public void testReporterOne(){

        //Pass test case

        Assert.assertTrue(true);

    }

    

    @Test(priority=1,description="testReporterTwo")

    public void testReporterTwo(){

        //Fail test case

        Assert.assertTrue(false);

    }

}

Utgången blir som-

IReporter-gränssnitt

PDF och e-post med rapporter

Ovanstående rapportimplementering är ganska enkel och tydlig för att komma igång med rapportanpassning.

Men i företagsmiljön måste du skapa mycket anpassade rapporter. Här är scenariot vi kommer att ta itu med

  1. Skapa anpassad rapport i PDF-form
  2. Ta skärmdumpar ENDAST på fel. Länk till skärmdumpar i PDF
  3. Skicka e-post till PDF-filen

PDF-rapporten ser ut så här

PDF och e-post med rapporter

För att skapa pdf-rapport behöver vi en Java API IText. Ladda ner det här. . Det finns en annan anpassad lyssnarklass som faktiskt implementerar denna IText-burk och skapar en pdf-rapport åt oss. Ladda ner det här.

Ovanstående figur visar standardformatet för den genererade PDF-rapporten. Du kan anpassa den

Så här tar vi oss an detta

Steg 1) Skapa en basklass

Steg 2) Anpassa JypersionListerner.Java (PDF skapande kod)

Steg 3) Skapa en TestGuru99PDFEmail.java som kommer att utföra testfall, skapa PDF

Steg 4) Lägg till kod till TestGuru99PDFEmail.java för att skicka PDF-rapport via e-post

Låt oss titta närmare på dessa steg

Steg 1) Skapa basklass

Den här basklassen har funktioner för att skapa WebDriver och ta skärmdump

package PDFEmail;

import java.io.File;

import org.apache.commons.io.FileUtils;

import org.openqa.selenium.OutputType;

import org.openqa.selenium.TakesScreenshot;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.firefox.FirefoxDriver;

public class BaseClass {

    static WebDriver driver;

    public static WebDriver getDriver(){

        if(driver==null){


        WebDriver driver ;
    	System.setProperty("webdriver.gecko.driver","C:\\geckodriver.exe");
    	driver = new FirefoxDriver();


        }

        return driver;

    }


    /**

     * This function will take screenshot

     * @param webdriver

     * @param fileWithPath

     * @throws Exception

     */

    public static void takeSnapShot(WebDriver webdriver,String fileWithPath) throws Exception{

        //Convert web driver object to TakeScreenshot

        TakesScreenshot scrShot =((TakesScreenshot)webdriver);

        //Call getScreenshotAs method to create image file

                File SrcFile=scrShot.getScreenshotAs(OutputType.FILE);

            //Move image file to new destination

                File DestFile=new File(fileWithPath);

                //Copy file at destination

                FileUtils.copyFile(SrcFile, DestFile);

            

    }

}

Steg 2) Anpassa JypersionListener.java

Vi kommer att hålla fast vid standardrapportformatet. Men vi kommer att göra 2 anpassningar

  • Lägger till kod för att instruera JypersionListener att ta skärmdump vid fel
  • Bifogar länken till skärmdumpen i PDF-rapporten

PDF och e-post med rapporter

Lägg till kod för att bifoga skärmdumpen till PDF-rapporten

PDF och e-post med rapporter

Steg 3) Skapa en TestGuru99PDFEmail.java som kommer att utföra testfall, skapa PDF

  • Här kommer vi att lägga till JyperionListener.class som lyssnare
  • Vi kommer att utföra 3 testfall.
  • Genom att använda Assert.assertTrue kommer vi att misslyckas med 2 testfall medan vi bara klarar ett.
  • Skärmdump kommer endast att tas för de misslyckade testfallen enligt våra anpassningar
package PDFEmail;

import java.util.Properties;

import javax.activation.DataHandler;

import javax.activation.DataSource;

import javax.activation.FileDataSource;

import javax.mail.BodyPart;

import javax.mail.Message;

import javax.mail.MessagingException;

import javax.mail.Multipart;

import javax.mail.Session;

import javax.mail.Transport;

import javax.mail.internet.AddressException;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeBodyPart;

import javax.mail.internet.MimeMessage;

import javax.mail.internet.MimeMultipart;

import org.openqa.selenium.WebDriver;

import org.testng.Assert;

import org.testng.annotations.AfterSuite;

import org.testng.annotations.Listeners;

import org.testng.annotations.Test;

import reporter.JyperionListener;

//Add listener for pdf report generation

@Listeners(JyperionListener.class)

public class TestGuru99PDFReport extends BaseClass {

    WebDriver driver;

    //Testcase failed so screen shot generate

    @Test

    public void testPDFReportOne(){

        driver = BaseClass.getDriver();

        driver.get("http://google.com");

        Assert.assertTrue(false);

    }

    

    //Testcase failed so screen shot generate

    @Test

    public void testPDFReporTwo(){

        driver = BaseClass.getDriver();

        driver.get("http:/guru99.com");

        Assert.assertTrue(false);

    }

    

    //Test test case will be pass, so no screen shot on it

    @Test

    public void testPDFReportThree(){

        driver = BaseClass.getDriver();

        driver.get("https://demo.guru99.com");

        Assert.assertTrue(true);

    }

Steg 4) Lägg till kod till TestGuru99PDFEmail.java för att skicka PDF-rapport via e-post

  • Vi kommer att använda anteckningen @AfterSuite för att skicka e-post med PDF-rapporten
  • Vi kommer att skicka e-post med Gmail
  • För att aktivera e-post måste du importera många biblioteksfiler som mail.jar, pop3.jar, smptp.jar, etc.
  • Innan du utför detta, ange från, till e-postadress och lösenord
 //After complete execution send pdf report by email

    @AfterSuite

    public void tearDown(){

        sendPDFReportByGMail("FROM@gmail.com", "password", "TO@gmail.com", "PDF Report", "");

        }

    

    /**

     * Send email using java

     * @param from

     * @param pass

     * @param to

     * @param subject

     * @param body

     */

    private static void sendPDFReportByGMail(String from, String pass, String to, String subject, String body) {

Properties props = System.getProperties();

String host = "smtp.gmail.com";

props.put("mail.smtp.starttls.enable", "true");

props.put("mail.smtp.host", host);

props.put("mail.smtp.user", from);

props.put("mail.smtp.password", pass);

props.put("mail.smtp.port", "587");

props.put("mail.smtp.auth", "true");

Session session = Session.getDefaultInstance(props);

MimeMessage message = new MimeMessage(session);

try {

    //Set from address

message.setFrom(new InternetAddress(from));

message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));

//Set subject

message.setSubject(subject);

message.setText(body);

BodyPart objMessageBodyPart = new MimeBodyPart();

objMessageBodyPart.setText("Please Find The Attached Report File!");

Multipart multipart = new MimeMultipart();

multipart.addBodyPart(objMessageBodyPart);

objMessageBodyPart = new MimeBodyPart();

//Set path to the pdf report file

String filename = System.getProperty("user.dir")+"\\Default test.pdf";

//Create data source to attach the file in mail

DataSource source = new FileDataSource(filename);

objMessageBodyPart.setDataHandler(new DataHandler(source));

objMessageBodyPart.setFileName(filename);

multipart.addBodyPart(objMessageBodyPart);

message.setContent(multipart);

Transport transport = session.getTransport("smtp");

transport.connect(host, from, pass);

transport.sendMessage(message, message.getAllRecipients());

transport.close();

}

catch (AddressException ae) {

ae.printStackTrace();

}

catch (MessagingException me) {

me.printStackTrace();

}

}

}

Ladda ner hela projektet här

Obs: När vi klickar på skärmbildslänken i pdf visar den säkerhetsdialogrutan. Vi måste tillåta den här dialogrutan att öppna pdf.

PDF och e-post med rapporter

E-postmeddelandet som genereras så kommer att se ut så här

PDF och e-post med rapporter

Sammanfattning

  • TestNG har en inbyggd rapporteringsförmåga i sig.
  • Efter en fullständig utförande av testfall, TestNG genererar en test-output-mapp i projektets rot.
  • I test-output-mappen finns det två huvudrapporter, index.html och emailable-report.html.
  • Att anpassa TestNG rapport behöver vi implementera två gränssnitt, ITestListener och IReporter.
  • Om vi ​​behöver få en rapport mellan körningarna behöver vi ITestListener.
  • För att skapa en slutrapport efter fullständigt genomförande måste vi implementera IReporter.
  • Tar skärmdumpen, in Selenium WebDriver, vi måste skriva cast WebDriver till TakesScreenShot-gränssnittet.
  • För att generera pdf-rapporter måste vi lägga till IText jar i projektet.

ladda ner Selenium Projektfiler för demon i denna handledning