Personalizza, PDF e e-mail TestNG Rapporti in Selenium webdriver

Prima di esaminare qualsiasi altra cosa, comprendiamo innanzitutto:

Perché abbiamo bisogno di reporting?

Quando stiamo usando Selenium o qualsiasi altro strumento di automazione, stiamo eseguendo operazioni sull'applicazione web. Ma il nostro scopo dell’automazione non è solo quello di esercitare l’applicazione sotto test. Noi, come tester di automazione, dovremmo testare l'applicazione, trovare bug e segnalarli al team di sviluppo o al management superiore. Qui la rendicontazione acquista importanza per il software Testing processi

TestNG Reportistica

TestNG la libreria fornisce una funzionalità di reporting molto utile. Dopo l'esecuzione, Test genererà una cartella di output di test nella radice del progetto. Questa cartella contiene due tipi di report:

Indice.html: Questo è il report completo dell'esecuzione corrente che contiene informazioni come errore, gruppi, ora, log del reporter, file XML di test.

TestNG Reportistica

inviabile-per-email-report.html: Questo è il rapporto riepilogativo dell'esecuzione corrente del test che contiene Test Case messaggio evidenziato in verde (per casi di test superati) e rosso (per casi di test falliti).

TestNG Reportistica

Come personalizzare TestNG Relazione

TestNG il reporting è abbastanza utile, ma a volte abbiamo bisogno di meno dati nei report o vogliamo visualizzare i report in un altro formato come PDF, Excel, ecc. o vogliamo modificare il layout del report.

Ci possono essere due modi in cui possiamo personalizzare TestNG rapporto

  • Utilizzo dell'interfaccia ITestListener:
  • Utilizzando l'interfaccia IReporter:

personalizzare IL MENU TestNG Relazione

Interfaccia ITestListener

Utilizziamo questa interfaccia quando dobbiamo personalizzare il report in tempo reale. In altre parole, se stiamo eseguendo un gruppo di test case in una suite TetNG e vogliamo ottenere il report di ciascun test case, dopo ciascun test case dobbiamo implementare l'interfaccia ITestListener. Questa interfaccia sovrascriverà il metodo onTestFailure, onTestStart, onTestSkipped per inviare lo stato corretto del test case corrente.

Interfaccia ITestListener

Ecco i passaggi che seguiremo

  • Crea una classe, ad esempio RealGuru99Report, e implementa iTestListener al suo interno.
  • Implementare i metodi di iTestListener
  • Crea un metodo di test e aggiungi la classe RealGuru99Report come ascoltatore nella classe Metodo di test.

Interfaccia ITestListener

Esempio di codice

RealGuru99TimeReport.java è la classe di reporting in tempo reale. Implementerà l'interfaccia ITestListener per il reporting

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 è il caso di prova per il report reale

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(){

        

    }

}

L'output sarà simile a:

Interfaccia ITestListener

Interfaccia IReporter

Se vogliamo personalizzare il rapporto di prova finale generato da TestNG, dobbiamo implementare l'interfaccia IReporter. Questa interfaccia dispone di un solo metodo per implementare generateReport. Questo metodo contiene tutte le informazioni sull'esecuzione completa del test nell'elenco e possiamo generare il report utilizzandolo.

Esempio di codice

Guru99Reporter.java è il file utilizzato per personalizzare il report

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 è una demo per i report personalizzati

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

    }

}

L'output sarà come-

Interfaccia IReporter

PDF ed e-mail dei report

L'implementazione del report di cui sopra è abbastanza semplice e chiara per iniziare con la personalizzazione del report.

Ma in un ambiente aziendale sarà necessario creare report altamente personalizzati. Ecco lo scenario con cui avremo a che fare

  1. Crea report personalizzato in formato PDF
  2. Acquisisci screenshot SOLO sugli errori. Collegamento agli screenshot in PDF
  3. Invia email del PDF

Il rapporto PDF si presenta così

PDF ed e-mail dei report

Per creare un report in formato PDF abbiamo bisogno di un file Java API IText. Scaricalo qui . Esiste un'altra classe listener personalizzata che sta effettivamente implementando questo jar IText e creando un report PDF per noi. Scaricalo qui

La figura sopra mostra il formato predefinito del report PDF generato. Puoi personalizzarlo

Ecco come affronteremo la questione

Passaggio 1) Crea una classe base

Passaggio 2) Personalizza JypersionListerner.Java (Codice di creazione PDF)

Passaggio 3) Crea un TestGuru99PDFEmail.java che eseguirà i casi di test, creerà PDF

Passaggio 4) Aggiungere il codice a TestGuru99PDFEmail.java per inviare il report PDF tramite e-mail

Diamo un'occhiata a questi passaggi

Passaggio 1) Crea classe base

Questa classe base ha funzioni per creare WebDriver e acquisire screenshot

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

            

    }

}

Passaggio 2) Personalizza JypersionListener.java

Resteremo fedeli al formato di report predefinito. Ma faremo 2 personalizzazioni

  • Aggiunta di codice per indicare a JypersionListener di acquisire screenshot in caso di errore
  • Allegando il link dello screenshot prendi il report in PDF

PDF ed e-mail dei report

Aggiungi il codice per allegare lo screenshot al report PDF

PDF ed e-mail dei report

Passaggio 3) Crea un TestGuru99PDFEmail.java che eseguirà i casi di test, creerà PDF

  • Qui aggiungeremo JyperionListener.class come ascoltatore
  • Eseguiremo 3 casi di test.
  • Utilizzando Assert.assertTrue falliremo 2 casi di test superandone solo uno.
  • Verranno acquisiti screenshot per i casi di test falliti solo secondo le nostre personalizzazioni
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("http://demo.guru99.com");

        Assert.assertTrue(true);

    }

Passaggio 4) Aggiungere il codice a TestGuru99PDFEmail.java per inviare il report PDF tramite e-mail

  • Utilizzeremo l'annotazione @AfterSuite per inviare via email il report PDF
  • Invieremo e-mail tramite Gmail
  • Per abilitare la posta elettronica, è necessario importare molti file di libreria come mail.jar, pop3.jar, smptp.jar, ecc.
  • Prima di eseguire questa operazione, inserisci l'indirizzo email del mittente e del destinatario e la password.
 //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();

}

}

}

Scarica qui il progetto completo

Nota: quando si fa clic sul collegamento della schermata in pdf, viene visualizzata la finestra di dialogo di sicurezza. Dobbiamo consentire a questa finestra di dialogo di aprire il pdf.

PDF ed e-mail dei report

L'email così generata apparirà così

PDF ed e-mail dei report

Sommario

  • TestNG ha una capacità di reporting incorporata al suo interno.
  • Dopo un'esecuzione completa dei casi di test, TestNG genera una cartella di output di test nella radice del progetto.
  • Nella cartella test-output sono presenti due report principali: index.html e emailable-report.html.
  • Personalizzare TestNG report dobbiamo implementare due interfacce, ITestListener e IReporter.
  • Se abbiamo bisogno di ottenere un report tra un'esecuzione e l'altra, abbiamo bisogno di ITestListener.
  • Per creare un report finale dopo l'esecuzione completa, dobbiamo implementare IReporter.
  • Facendo lo screenshot, in Selenium WebDriver, dobbiamo digitare cast WebDriver nell'interfaccia TakesScreenShot.
  • Per generare report PDF dobbiamo aggiungere il jar IText nel progetto.

Scarica la Selenium File di progetto per la demo in questo tutorial