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 Testing 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, ad esempio RealGuru99Report, e implementa iTestListener al suo interno.
- Implementare i metodi di iTestListener
- Crea un metodo di test e aggiungi la classe RealGuru99Report come ascoltatore nella classe Metodo di test.
Esempio di codice
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 prova 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.
Esempio di codice
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 i 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) Crea un TestGuru99PDFEmail.java che eseguirà i casi di test, creerà PDF
Passaggio 4) Aggiungere il codice a TestGuru99PDFEmail.java per inviare il report PDF tramite e-mail
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) Crea 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("http://demo.guru99.com"); Assert.assertTrue(true); }
Passaggio 4) Aggiungere il codice a TestGuru99PDFEmail.java per inviare il report PDF tramite e-mail
- Utilizzeremo l'annotazione @AfterSuite per inviare via email il report PDF
- Invieremo e-mail tramite 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ì
Sommario
- 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