Personalizar, PDF e e-mail TestNG Relatórios em Selenium webdriver
Antes de examinarmos 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 um testador de automação, devemos testar o aplicativo, encontrar bugs e relatá-los à equipe de desenvolvimento ou à alta gerência. Aqui, o relatório ganha importância para o software Ensaios processo
TestNG Relatórios
TestNG biblioteca 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ório-e-mail.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).
Como personalizar TestNG Report
TestNG os relatórios 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 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 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.
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.
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 do IReporter
Se quisermos personalizar o relatório de teste final gerado por 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-
PDF e e-mail 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
- Crie um relatório personalizado em formato PDF
- Faça capturas de tela SOMENTE de erros. Link para capturas de tela em PDF
- Enviar e-mail do PDF
O relatório em PDF tem esta aparência
Para criar um relatório em PDF, precisamos de um Java API Texto. Baixe aqui . Há outra classe de ouvinte personalizada que está implementando esse 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 abordaremos isso
Etapa 1) Crie uma classe base
Etapa 2) Personalize o JypersionListerner.Java (código de criação de PDF)
Etapa 3) Crie um TestGuru99PDFEmail.java que executará casos de teste, criará 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 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
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, 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) Anexe o código a TestGuru99PDFEmail.java para enviar o relatório em PDF por e-mail
- Usaremos a anotação @AfterSuite para enviar email do relatório em PDF
- Estaremos enviando e-mail usando o Gmail
- Para ativar 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 e a senha de origem, para
//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.
O email assim gerado ficará assim
Resumo
- TestNG tem uma capacidade de relatório embutida.
- 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 test-output, existem dois relatórios principais, index.html e emailable-report.html.
- Para customizar TestNG relatório, 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, em Selenium WebDriver, precisamos digitar cast WebDriver para a interface TakesScreenShot.
- Para gerar relatórios em PDF, precisamos adicionar o jar IText no projeto.
Faça o download do Selenium Arquivos de projeto para demonstração neste tutorial