Personalizar, PDF e amp; Enviar relatórios do TestNG por e-mail no Selenium WebDriver

Índice:

Anonim

Antes de analisarmos qualquer outra coisa, vamos primeiro entender -

Por que precisamos de relatórios?

Quando estamos usando Selenium ou qualquer outra ferramenta de automação, estamos realizando operações no aplicativo da web. Mas nosso propósito de automação não é apenas exercitar o aplicativo em teste. Nós, como testadores de automação, devemos testar o aplicativo, encontrar bugs e relatá-los à equipe de desenvolvimento ou à gerência superior. Aqui, o relatório ganha importância para o processo de teste de software

Relatório TestNG

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

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

emailable-report.html: Este é o relatório resumido da execução do teste atual que contém a mensagem do Caso de Teste em destaque verde (para casos de teste de aprovação) e vermelho (para casos de teste com falha).

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. ou queremos alterar o layout do relatório.

Pode haver duas maneiras de personalizar o relatório TestNG

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

Interface ITestListener

Usamos essa interface quando precisamos personalizar o relatório em tempo real. Em outras palavras, se estivermos executando um monte de 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, precisamos implementar a interface ITestListener. Essa interface substituirá o método onTestFailure, onTestStart, onTestSkipped para enviar o status correto do caso de teste atual.

Aqui estão as etapas que seguiremos

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

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 implementa ITestListener {@Sobreporpublic void onStart (ITestContext arg0) {System.out.println ("Início da execução (TESTE) ->" + arg0.getName ());}@Sobreporpublic void onTestStart (ITestResult arg0) {System.out.println ("Teste iniciado ->" + arg0.getName ());}@Sobreporpublic void onTestSuccess (ITestResult arg0) {System.out.println ("Teste Pass ->" + arg0.getName ());}@Sobreporpublic void onTestFailure (ITestResult arg0) {System.out.println ("Teste falhou ->" + arg0.getName ());}@Sobreporpublic void onTestSkipped (ITestResult arg0) {System.out.println ("Teste ignorado ->" + arg0.getName ());}@Sobreporpublic void onFinish (ITestContext arg0) {System.out.println ("FIM da execução (TESTE) ->" + arg0.getName ());}@Sobreporpublic void onTestFailedButWithinSuccessPercentage (ITestResult arg0) {// TODO stub do método gerado automaticamente}}

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 {@Testepublic void testRealReportOne () {Assert.assertTrue (true);}@Testepublic void testRealReportTwo () {Assert.assertTrue (false);}// O caso de teste depende da falha testcase = testRealReportTwo@Test (dependsOnMethods = "testRealReportTwo")public void testRealReportThree () {}}

A saída será semelhante a

Interface IReporter

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

Exemplo de Código

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

pacote 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 implementa IReporter {@Sobreporpublic void generateReport (List  arg0, List  arg1,String outputDirectory) {// Segundo parâmetro deste método ISuite conterá todo o conjunto executado.para (ISuite iSuite: arg1) {// Obtenha um mapa de resultado de um único conjunto de cada vezMap  results = iSuite.getResults ();// Obtenha a chave do mapa de resultadosDefina  keys = results.keySet ();// Vá para cada valor do mapa um por umfor (String key: keys) {// O objeto Context do resultado atualITestContext context = results.get (key) .getTestContext ();// Detalhes do Print Suite no consoleSystem.out.println ("Suite Name ->" + context.getName ()+ ":: Report output Ditectory ->" + context.getOutputDirectory ()+ ":: Nome da suíte ->" + context.getSuite (). GetName ()+ ":: Data de início e hora de execução ->" + context.getStartDate ()+ ":: Data de término Hora de execução ->" + context.getEndDate ());// Obter mapa apenas para casos de teste com falhaIResultMap resultMap = context.getFailedTests ();// Obter detalhes do método de casos de teste com falhaColeção  failedMethods = resultMap.getAllMethods ();// Loop um por um em todos os métodos com falhaSystem.out.println ("-------- FALHA NO CASO DE TESTE ---------");para (ITestNGMethod iTestNGMethod: failedMethods) {// Imprimir detalhes de casos de teste com falhaSystem.out.println ("TESTCASE NAME ->" + iTestNGMethod.getMethodName ()+ "\ nDescrição ->" + iTestNGMethod.getDescription ()+ "\ nPriority ->" + iTestNGMethod.getPriority ()+ "\ n: Data ->" + nova Data (iTestNGMethod.getDate ()));}}}}}

TestGuru99ForReporter.java é uma demonstração para relatórios personalizados

pacote testNGReport.iReporterReport;import org.testng.Assert;import org.testng.annotations.Listeners;import org.testng.annotations.Test;// Adicionar ouvinte para ouvir o relatório e escrevê-lo quando os testcas terminarem@Listeners (value = Guru99Reporter.class)public class TestGuru99ForReporter {@Test (prioridade = 0, descrição = "testReporterOne")public void testReporterOne () {// Passar no caso de testeAssert.assertTrue (true);}@Test (prioridade = 1, descrição = "testReporterTwo")public void testReporterTwo () {// Caso de teste de falhaAssert.assertTrue (false);}}

A saída será como-

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 personalizados. Aqui está o cenário com o qual estaremos lidando

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

O relatório em PDF é parecido com este

Para criar um relatório em PDF, precisamos de uma API Java IText . Baixe aqui. Há outra classe de ouvinte personalizada que está implementando este jar IText e criando um relatório em PDF para nós. Baixe aqui

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

Aqui está como vamos abordar isso

Etapa 1) Criar uma classe base

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

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

Etapa 4) Anexe o código a TestGuru99PDFEmail.java para enviar o relatório em PDF por e-mail

Vejamos essas etapas

Etapa 1) Criar classe base

Esta classe base tem funções para criar WebDriver e tirar 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 {driver estático WebDriver;public static WebDriver getDriver () {if (driver == null) {Driver WebDriver;System.setProperty ("webdriver.gecko.driver", "C: \\ geckodriver.exe");driver = novo FirefoxDriver ();}motorista de retorno;}/ *** Esta função fará uma captura de tela* @param webdriver* @param fileWithPath* @throws Exception* /public static void takeSnapShot (WebDriver webdriver, String fileWithPath) throws Exception {// Converter o objeto do driver da web em TakeScreenshotTakesScreenshot scrShot = ((TakesScreenshot) webdriver);// Chame o método getScreenshotAs para criar o arquivo de imagemArquivo SrcFile = scrShot.getScreenshotAs (OutputType.FILE);// Mova o arquivo de imagem para o novo destinoArquivo DestFile = novo arquivo (fileWithPath);// Copiar arquivo no destinoFileUtils.copyFile (SrcFile, DestFile);}}

Etapa 2) Personalize JypersionListener.java

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

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

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

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

  • Aqui, adicionaremos JyperionListener.class como ouvinte
  • Vamos executar 3 casos de teste.
  • Usando Assert.assertTrue, falharemos em 2 casos de teste e passaremos em apenas um.
  • A captura de tela será feita para os casos de teste com falha apenas 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;// Adicionar ouvinte para geração de relatório em PDF@Listeners (JyperionListener.class)public class TestGuru99PDFReport extends BaseClass {Driver WebDriver;// O caso de teste falhou, então a captura de tela foi gerada@Testepublic void testPDFReportOne () {driver = BaseClass.getDriver ();driver.get ("http://google.com");Assert.assertTrue (false);}// O caso de teste falhou, então a captura de tela foi gerada@Testepublic void testPDFReporTwo () {driver = BaseClass.getDriver ();driver.get ("http: /guru99.com");Assert.assertTrue (false);}// O caso de teste de teste será aprovado, então nenhuma captura de tela nele@Testepublic void testPDFReportThree () {driver = BaseClass.getDriver ();driver.get ("http://demo.guru99.com");Assert.assertTrue (true);}

Etapa 4) Anexe o código a TestGuru99PDFEmail.java para enviar o relatório em PDF por e-mail

  • Usaremos a anotação @AfterSuite para enviar o email do relatório em PDF
  • Estaremos enviando e-mail pelo Gmail
  • Para habilitar o e-mail, é necessário importar muitos arquivos de biblioteca, como mail.jar, pop3.jar, smptp.jar, etc.
  • Antes de executar isso, insira o endereço de e-mail de, para e a senha
 // Após execução completa enviar relatório pdf por e-mail@AfterSuitepublic void tearDown () {sendPDFReportByGMail (" Este endereço de e-mail está protegido contra spambots. Você precisa de Javascript habilitado para vê-lo.", "senha", "This email address is being protected from spambots. You need JavaScript enabled to view it.", "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 o projeto completo aqui

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.

O e-mail gerado será assim

Resumo:

  • TestNG tem uma capacidade de relatório embutida nele.
  • Após uma execução completa dos casos de teste, TestNG gera uma pasta de saída de teste na raiz do projeto.
  • Na pasta de saída de teste, há dois relatórios principais, index.html e emailable-report.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 na interface TakesScreenShot.
  • 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