Personalizar, PDF y correo electrónico TestNG Informes en Selenium Controlador web

Antes de analizar cualquier otra cosa, primero comprendamos:

¿Por qué necesitamos informes?

Cuando estamos usando Selenium o cualquier otra herramienta de automatización, estamos realizando operaciones en la aplicación web. Pero nuestro propósito de la automatización no es solo ejercitar la aplicación bajo prueba. Nosotros, como probadores de automatización, se supone que debemos probar la aplicación, encontrar errores e informarlo al equipo de desarrollo o a la alta dirección. Aquí los informes adquieren importancia para el software. Pruebas

TestNG Informes

TestNG La biblioteca proporciona una función de informes muy útil. Después de la ejecución, Prueba generará una carpeta de salida de prueba en la raíz del proyecto. Esta carpeta contiene dos tipos de informes:

Índice.html: Este es el informe completo de la ejecución actual que contiene información como errores, grupos, tiempo, registros de reporteros y archivos XML de prueba.

TestNG Informes

informe-enviable-por-correo.html: Este es el informe resumido de la ejecución de la prueba actual que contiene Caso de prueba mensaje resaltado en verde (para casos de prueba aprobados) y rojo (para casos de prueba fallidos).

TestNG Informes

Cómo personalizar TestNG Informes

TestNG Los informes son bastante útiles, pero aún así, a veces necesitamos menos datos en los informes o queremos mostrarlos en algún otro formato como PDF, Excel, etc. o queremos cambiar el diseño del informe.

Puede haber dos formas en que podemos personalizar TestNG (reporte)

  • Usando la interfaz ITestListener:
  • Usando la interfaz IReporter:

Personalizar TestNG Informes

Interfaz ITestListener

Usamos esta interfaz cuando necesitamos personalizar el informe en tiempo real. En otras palabras, si estamos ejecutando un conjunto de casos de prueba en una suite TetNG y queremos obtener el informe de cada caso de prueba, luego de cada caso de prueba debemos implementar la interfaz ITestListener. Esta interfaz anulará los métodos onTestFailure, onTestStart y onTestSkipped para enviar el estado correcto del caso de prueba actual.

Interfaz ITestListener

Estos son los pasos que seguiremos.

  • Cree una clase, digamos RealGuru99Report e implemente iTestListener en ella.
  • Implementar métodos de iTestListener
  • Cree un método de prueba y agregue la clase RealGuru99Report como oyente en la clase Método de prueba.

Interfaz ITestListener

Ejemplo de código

RealGuru99TimeReport.java es la clase de informes en tiempo real. Implementará la interfaz ITestListener para informes.

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 es el caso de prueba para un informe real

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

        

    }

}

La salida se verá así:

Interfaz ITestListener

Interfaz IReporter

Si queremos personalizar el informe de prueba final generado por TestNG, necesitamos implementar la interfaz IReporter. Esta interfaz tiene solo un método para implementar generateReport. Este método tiene toda la información de una ejecución de prueba completa en la Lista , y podemos generar el informe usándolo.

Ejemplo de código

Guru99Reporter.java es el archivo utilizado para personalizar el informe.

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 es una demostración de informes personalizados

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

    }

}

La salida será como-

Interfaz IReporter

Informes en formato PDF y correo electrónico

La implementación del informe anterior es bastante simple y clara para comenzar con la personalización del informe.

Pero en un entorno corporativo, necesitarás crear informes altamente personalizados. Este es el escenario con el que nos ocuparemos.

  1. Crear informe personalizado en formato PDF
  2. Tome capturas de pantalla SÓLO en caso de errores. Enlace a capturas de pantalla en PDF
  3. Enviar correo electrónico del PDF

El informe en PDF se ve así

Informes en formato PDF y correo electrónico

Para crear un informe en PDF necesitamos un Java API Yo texteo. Descargalo aquí . Hay otra clase de escucha personalizada que en realidad está implementando este jar de IText y creando un informe en PDF para nosotros. Descargalo aquí

La figura anterior muestra el formato predeterminado del informe PDF generado. Puedes personalizarlo

Así es como abordaremos esto

Paso 1) Crear una clase base

Paso 2) Personaliza JypersionListerner.Java (Código de creación PDF)

Paso 3) Cree un TestGuru99PDFEmail.java que ejecutará casos de prueba y creará PDF

Paso 4) Agregue código a TestGuru99PDFEmail.java para enviar un informe en PDF por correo electrónico

Analicemos estos pasos

Paso 1) Crear clase base

Esta clase base tiene funciones para crear WebDriver y tomar captura de pantalla.

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

            

    }

}

Paso 2) Personaliza JypersionListener.java

Nos quedaremos con el formato de informe predeterminado. Pero haremos 2 personalizaciones.

  • Agregar código para indicarle a JypersionListener que tome una captura de pantalla en caso de error
  • Adjuntando el enlace de la captura de pantalla del informe en PDF

Informes en formato PDF y correo electrónico

Agregue código para adjuntar la captura de pantalla al informe PDF

Informes en formato PDF y correo electrónico

Paso 3) Cree un TestGuru99PDFEmail.java que ejecutará casos de prueba y creará PDF

  • Aquí agregaremos JyperionListener.class como oyente.
  • Ejecutaremos 3 casos de prueba.
  • Al usar Assert.assertTrue, fallaremos en 2 casos de prueba y solo aprobaremos uno.
  • Se tomarán capturas de pantalla para los casos de prueba fallidos solo según nuestras personalizaciones.
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);

    }

Paso 4) Agregue código a TestGuru99PDFEmail.java para enviar un informe en PDF por correo electrónico

  • Usaremos la anotación @AfterSuite para enviar el informe PDF por correo electrónico
  • Enviaremos correos electrónicos mediante Gmail.
  • Para habilitar el correo electrónico, es necesario importar muchos archivos de biblioteca como mail.jar, pop3.jar, smptp.jar, etc.
  • Antes de ejecutar esto, ingrese la dirección de correo electrónico del remitente y del destinatario y la contraseña.
 //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();

}

}

}

Descarga el proyecto completo aquí

Nota: Cuando hacemos clic en el enlace de la captura de pantalla en pdf, se muestra el cuadro de diálogo de seguridad. Tenemos que permitir que este cuadro de diálogo se abra en formato PDF.

Informes en formato PDF y correo electrónico

El correo electrónico generado tendrá este aspecto

Informes en formato PDF y correo electrónico

Resumen

  • TestNG tiene una capacidad de generación de informes incorporada.
  • Después de una ejecución completa de los casos de prueba, TestNG genera una carpeta de salida de prueba en la raíz del proyecto.
  • En la carpeta de salida de prueba, hay dos informes principales, index.html y emailable-report.html.
  • Personalizar TestNG informe necesitamos implementar dos interfaces, ITestListener e IReporter.
  • Si necesitamos obtener un informe entre ejecuciones, necesitamos ITestListener.
  • Para crear un informe final después de la ejecución completa, necesitamos implementar IReporter.
  • Tomando la captura de pantalla, en Selenium WebDriver, debemos escribir transmitir WebDriver a la interfaz TakesScreenShot.
  • Para generar informes en PDF necesitamos agregar IText jar en el proyecto.

Descargue nuestra Selenium Archivos de proyecto para la demostración en este tutorial