Personalizar, PDF e Email Relatórios TestNG no Selenium WebDriver

Antes de examinarmos qualquer outra coisa, vamos primeiro entender –

Por que precisamos de relatórios?

Quando usamos Selenium ou qualquer outra ferramenta de automação, estamos realizando operações na aplicação web. Mas nosso propósito de automação não é apenas exercitar a Aplicação em Teste. Nós, como testadores de automação, devemos testar o aplicativo, encontrar bugs e reportá-los à equipe de desenvolvimento ou à gerência superior. Aqui o reporte ganha importância para software ensaio processo

Relatórios de testeNG

A biblioteca TestNG fornece um recurso de relatório muito útil. Após a execução, Teste irá gerar uma pasta de saída de teste na raiz do projeto. Esta pasta contém dois tipos de relatórios-

Índice.html: Este é o relatório completo da execução atual que contém informações como erro, grupos, hora, logs do repórter e arquivos XML de teste.

Relatórios de testeNG

emailrelatório capaz.html: Este é o relatório resumido da execução de teste atual que contém Caso de teste mensagem em destaque verde (para casos de teste aprovados) e vermelho (para casos de teste reprovados).

Relatórios de testeNG

Como personalizar o relatório TestNG

Os relatórios TestNG são bastante úteis, mas ainda assim, às vezes precisamos de menos dados nos relatórios ou queremos exibir relatórios em algum outro formato como PDF, Excel, etc.

Pode haver duas maneiras de personalizar o relatório TestNG

  • Usando a interface ITestListener:
  • Usando a interface IReporter:

Personalizar relatório TestNG

Interface ITestListener

Usamos essa interface quando precisamos personalizar o relatório em tempo real. Em outras palavras, se estivermos executando vários casos de teste em um conjunto TetNG e quisermos obter o relatório de cada caso de teste, então, após cada caso de teste, precisaremos implementar a interface ITestListener. Esta interface substituirá os métodos onTestFailure, onTestStart, onTestSkipped para enviar o status correto do caso de teste atual.

Interface ITestListener

Aqui estão os passos que seguiremos

  • Crie uma classe como RealGuru99Report e implemente iTestListener nela.
  • Implementar métodos de iTestListener
  • Crie o método de teste e adicione a classe RealGuru99Report como ouvinte na classe Test Method.

Interface ITestListener

Exemplo de Código

RealGuru99TimeReport.java é a classe de relatórios em tempo real. Ele implementará a interface ITestListener para relatórios

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 é o caso de teste para relatório 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(){

        

    }

}

A saída será semelhante a-

Interface ITestListener

Interface do IReporter

Se quisermos customizar o relatório de teste final gerado pelo TestNG, precisamos implementar a interface IReporter. Esta interface possui apenas um método para implementar generateReport. Este método possui todas as informações de uma execução de teste completa na Lista , e podemos gerar o relatório usando-o.

Exemplo de Código

Guru99Reporter.java é o arquivo usado para customizar o relatório

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 é uma demonstração para relatórios 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);

    }

}

A saída será como-

Interface do IReporter

PDF e Email de relatórios

A implementação do relatório acima é bastante simples e clara para você começar a personalizar o relatório.

Mas no ambiente corporativo, você precisará criar relatórios altamente customizados. Aqui está o cenário com o qual estaremos lidando

  1. Crie um relatório personalizado em formato PDF
  2. Faça capturas de tela SOMENTE de erros. Link para capturas de tela em PDF
  3. Enviar Email do PDF

O relatório em PDF tem esta aparência

PDF e Email de relatórios

Para criar um relatório em PDF, precisamos de um Java API Texto. Baixe plítica de privacidade . Há outra classe de ouvinte personalizada que está implementando esse jar IText e criando um relatório em PDF para nós. Baixe plítica de privacidade

A figura acima mostra o formato padrão do relatório PDF gerado. Você pode personalizá-lo

Aqui está como abordaremos isso

Etapa 1) Crie uma classe base

Etapa 2) Personalize JypersionListerner.Java (código de criação de PDF)

Etapa 3) Crie um TestGuru99PDFEmail.java que irá executar casos de teste, criar PDF

Etapa 4) Anexar código ao TestGuru99PDFEmail.java para enviar relatório em PDF via email

Vejamos essas etapas

Etapa 1) Criar classe base

Esta classe base possui funções para criar WebDriver e tirar captura de tela

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

            

    }

}

Etapa 2) Personalizar JypersionListener.java

Manteremos o formato de relatório padrão. Mas faremos 2 customizações

  • Adicionando código para instruir JypersionListener a fazer uma captura de tela em caso de erro
  • Anexando o link da captura de tela no relatório em PDF

PDF e Email de relatórios

Adicione o código para anexar a captura de tela ao relatório em PDF

PDF e Email de relatórios

Etapa 3) Crie um TestGuru99PDFEmail.java que irá executar casos de teste, criar PDF

  • Aqui adicionaremos JyperionListener.class como ouvinte
  • Executaremos 3 casos de teste.
  • Usando Assert.assertTrue, falharemos em 2 casos de teste e passaremos em apenas um.
  • A captura de tela será tirada apenas para os casos de teste com falha, de acordo com nossas personalizações
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);

    }

Etapa 4) Anexar código ao TestGuru99PDFEmail.java para enviar relatório em PDF via email

  • Usaremos a anotação @AfterSuite para enviar email do relatório em PDF
  • Estaremos enviando email usando Gmail
  • Para ativar Email, precisa importar muitos arquivos de biblioteca como mail.jar, pop3.jar, smptp.jar, etc.
  • Antes de executar isso, insira de, para email endereço e senha
 //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();

}

}

}

Baixe aqui o projeto completo

Nota: Quando clicamos no link da captura de tela em pdf, ele mostra uma caixa de diálogo de segurança. Temos que permitir que esta caixa de diálogo abra o PDF.

PDF e Email de relatórios

Oemail tão gerado ficará assim

PDF e Email de relatórios

Resumo

  • TestNG possui uma capacidade de geração de relatórios integrada.
  • Após a execução completa dos casos de teste, TestNG gera uma pasta de saída de teste na raiz do projeto.
  • Na pasta test-output, existem dois relatórios principais, index.html e emailrelatório capaz.html.
  • Para personalizar o relatório TestNG, precisamos implementar duas interfaces, ITestListener e IReporter.
  • Se precisarmos obter um relatório entre a execução, precisamos do ITestListener.
  • Para criar um relatório final após a execução completa, precisamos implementar o IReporter.
  • Fazendo a captura de tela, no Selenium WebDriver, precisamos digitar cast WebDriver to TakesScreenShot interface.
  • Para gerar relatórios em PDF, precisamos adicionar o jar IText no projeto.

Baixe os arquivos do projeto Selenium para a demonstração neste tutorial