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 Testes 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 Relatório
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, digamos, Real.Guru99Reporte e implemente o iTestListener nele.
- Implementar métodos de iTestListener
- Crie um método de teste e adicione um Real.GuruA classe 99Report como ouvinte na classe Test Method.
Code Exemplo
RealGuruO arquivo 99TimeReport.java é a classe de relatório em tempo real. Ele implementa a interface ITestListener para gerar 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
}
}
TestarGuru99RealReport.java é o caso de teste para um 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.
Code Exemplo
GuruO arquivo 99Reporter.java é usado para personalizar 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()));
}
}
}
}
}
TestarGuru99ForReporter.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) Criar um testeGuruO arquivo 99PDFEmail.java executará casos de teste e criará um PDF.
Etapa 4) Adicione o código ao testeGuru99PDFEmail.java para enviar 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) Criar um testeGuruO arquivo 99PDFEmail.java executará casos de teste e criará um 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("https://demo.guru99.com");
Assert.assertTrue(true);
}
Etapa 4) Adicione o código ao testeGuru99PDFEmail.java para enviar relatório em PDF por e-mail
- Usaremos a anotação @AfterSuite para enviar email do relatório em PDF
- Enviaremos e-mails usando 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












