Personalizza, PDF e e-mail TestNG Rapporti in Selenium webdriver
Prima di esaminare qualsiasi altra cosa, comprendiamo innanzitutto:
Perchรฉ abbiamo bisogno di reporting?
Quando stiamo usando Selenium o qualsiasi altro strumento di automazione, stiamo eseguendo operazioni sull'applicazione web. Ma il nostro scopo dellโautomazione non รจ solo quello di esercitare lโapplicazione sotto test. Noi, come tester di automazione, dovremmo testare l'applicazione, trovare bug e segnalarli al team di sviluppo o al management superiore. Qui la rendicontazione acquista importanza per il software Collaudo processi
TestNG Reportistica
TestNG la libreria fornisce una funzionalitร di reporting molto utile. Dopo l'esecuzione, Test genererร una cartella di output di test nella radice del progetto. Questa cartella contiene due tipi di report:
Indice.html: Questo รจ il report completo dell'esecuzione corrente che contiene informazioni come errore, gruppi, ora, log del reporter, file XML di test.
inviabile-per-email-report.html: Questo รจ il rapporto riepilogativo dell'esecuzione corrente del test che contiene Test Case messaggio evidenziato in verde (per casi di test superati) e rosso (per casi di test falliti).
Come personalizzare TestNG Relazione
TestNG il reporting รจ abbastanza utile, ma a volte abbiamo bisogno di meno dati nei report o vogliamo visualizzare i report in un altro formato come PDF, Excel, ecc. o vogliamo modificare il layout del report.
Ci possono essere due modi in cui possiamo personalizzare TestNG rapporto
- Utilizzo dell'interfaccia ITestListener:
- Utilizzando l'interfaccia IReporter:
Interfaccia ITestListener
Utilizziamo questa interfaccia quando dobbiamo personalizzare il report in tempo reale. In altre parole, se stiamo eseguendo un gruppo di test case in una suite TetNG e vogliamo ottenere il report di ciascun test case, dopo ciascun test case dobbiamo implementare l'interfaccia ITestListener. Questa interfaccia sovrascriverร il metodo onTestFailure, onTestStart, onTestSkipped per inviare lo stato corretto del test case corrente.
Ecco i passaggi che seguiremo
- Crea una classe, diciamo realeGuru99Report e implementa iTestListener al suo interno.
- Implementare i metodi di iTestListener
- Crea il metodo di test e aggiungi RealGuru99La classe Report funge da listener nella classe Test Method.
Code Esempio
RealGuru99TimeReport.java รจ la classe di reporting in tempo reale. Implementerร l'interfaccia ITestListener per il reporting.
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 รจ il caso di test per il report reale
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(){
}
}
L'output sarร simile a:
Interfaccia IReporter
Se vogliamo personalizzare il rapporto di prova finale generato da TestNG, dobbiamo implementare l'interfaccia IReporter. Questa interfaccia dispone di un solo metodo per implementare generateReport. Questo metodo contiene tutte le informazioni sull'esecuzione completa del test nell'elenco e possiamo generare il report utilizzandolo.
Code Esempio
Guru99Reporter.java รจ il file utilizzato per personalizzare il report
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 รจ una demo per la creazione di report personalizzati.
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);
}
}
L'output sarร come-
PDF ed e-mail dei report
L'implementazione del report di cui sopra รจ abbastanza semplice e chiara per iniziare con la personalizzazione del report.
Ma in un ambiente aziendale sarร necessario creare report altamente personalizzati. Ecco lo scenario con cui avremo a che fare
- Crea report personalizzato in formato PDF
- Acquisisci screenshot SOLO sugli errori. Collegamento agli screenshot in PDF
- Invia email del PDF
Il rapporto PDF si presenta cosรฌ
Per creare un report in formato PDF abbiamo bisogno di un file Java API IText. Scaricalo Qui. . Esiste un'altra classe listener personalizzata che sta effettivamente implementando questo jar IText e creando un report PDF per noi. Scaricalo Qui.
La figura sopra mostra il formato predefinito del report PDF generato. Puoi personalizzarlo
Ecco come affronteremo la questione
Passaggio 1) Crea una classe base
Passaggio 2) Personalizza JypersionListerner.Java (Codice di creazione PDF)
Passaggio 3) Creare un testGuru99PDFEmail.java che eseguirร i casi di test, creerร PDF
Passaggio 4) Aggiungere il codice al testGuru99PDFEmail.java per inviare il report PDF via email
Diamo un'occhiata a questi passaggi
Passaggio 1) Crea classe base
Questa classe base ha funzioni per creare WebDriver e acquisire 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 {
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);
}
}
Passaggio 2) Personalizza JypersionListener.java
Resteremo fedeli al formato di report predefinito. Ma faremo 2 personalizzazioni
- Aggiunta di codice per indicare a JypersionListener di acquisire screenshot in caso di errore
- Allegando il link dello screenshot prendi il report in PDF
Aggiungi il codice per allegare lo screenshot al report PDF
Passaggio 3) Creare un testGuru99PDFEmail.java che eseguirร i casi di test, creerร PDF
- Qui aggiungeremo JyperionListener.class come ascoltatore
- Eseguiremo 3 casi di test.
- Utilizzando Assert.assertTrue falliremo 2 casi di test superandone solo uno.
- Verranno acquisiti screenshot per i casi di test falliti solo secondo le nostre personalizzazioni
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);
}
Passaggio 4) Aggiungere il codice al testGuru99PDFEmail.java per inviare il report PDF via email
- Utilizzeremo l'annotazione @AfterSuite per inviare via email il report PDF
- Invieremo email utilizzando Gmail
- Per abilitare la posta elettronica, รจ necessario importare molti file di libreria come mail.jar, pop3.jar, smptp.jar, ecc.
- Prima di eseguire questa operazione, inserisci l'indirizzo email del mittente e del destinatario e la password.
//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();
}
}
}
Scarica qui il progetto completo
Nota: quando si fa clic sul collegamento della schermata in pdf, viene visualizzata la finestra di dialogo di sicurezza. Dobbiamo consentire a questa finestra di dialogo di aprire il pdf.
L'email cosรฌ generata apparirร cosรฌ
Sintesi
- TestNG ha una capacitร di reporting incorporata al suo interno.
- Dopo un'esecuzione completa dei casi di test, TestNG genera una cartella di output di test nella radice del progetto.
- Nella cartella test-output sono presenti due report principali: index.html e emailable-report.html.
- Personalizzare TestNG report dobbiamo implementare due interfacce, ITestListener e IReporter.
- Se abbiamo bisogno di ottenere un report tra un'esecuzione e l'altra, abbiamo bisogno di ITestListener.
- Per creare un report finale dopo l'esecuzione completa, dobbiamo implementare IReporter.
- Facendo lo screenshot, in Selenium WebDriver, dobbiamo digitare cast WebDriver nell'interfaccia TakesScreenShot.
- Per generare report PDF dobbiamo aggiungere il jar IText nel progetto.
Scarica la Selenium File di progetto per la demo in questo tutorial












