Personnaliser, PDF et e-mail TestNG Rapports dans Selenium pilote web

Avant dโ€™examiner autre chose, comprenons dโ€™abord :

Pourquoi avons-nous besoin de rapports ?

Lorsque nous utilisons Selenium ou tout autre outil d'automatisation, nous effectuons des opรฉrations sur l'application web. Mais notre objectif en matiรจre dโ€™automatisation nโ€™est pas seulement dโ€™exercer lโ€™application sous test. En tant que testeur d'automatisation, nous sommes censรฉs tester l'application, dรฉtecter les bogues et les signaler ร  l'รฉquipe de dรฉveloppement ou ร  la direction supรฉrieure. Ici, le reporting prend de l'importance pour les logiciels Tests processus

TestNG Reporting

TestNG La bibliothรจque fournit une fonctionnalitรฉ de reporting trรจs pratique. Aprรจs exรฉcution, Tester gรฉnรฉrera un dossier de sortie de test ร  la racine du projet. Ce dossier contient deux types de rapports :

Index.html : Il s'agit du rapport complet de l'exรฉcution en cours qui contient des informations telles qu'une erreur, des groupes, l'heure, les journaux du rapporteur, les fichiers XML de test.

TestNG Reporting

rapport-e-mailable.html : Il s'agit du rapport rรฉcapitulatif de l'exรฉcution du test en cours qui contient Cas de test message en vert (pour les cas de test rรฉussis) et en rouge (pour les cas de test รฉchouรฉs).

TestNG Reporting

Comment personnaliser TestNG Rapport

TestNG les rapports sont assez pratiques, mais nous avons parfois besoin de moins de donnรฉes dans les rapports ou souhaitons afficher les rapports dans un autre format comme PDF, Excel, etc. ou souhaitons modifier la mise en page du rapport.

Il peut y avoir deux faรงons de personnaliser TestNG rapport

  • Utilisation de l'interface ITestListener :
  • Utilisation de l'interface IReporter :

Personnaliser TestNG Rapport

Interface ITestListener

Nous utilisons cette interface lorsque nous devons personnaliser un rapport en temps rรฉel. En d'autres termes, si nous exรฉcutons un ensemble de scรฉnarios de test dans une suite TetNG et que nous souhaitons obtenir le rapport de chaque scรฉnario de test, alors aprรจs chaque scรฉnario de test, nous devons implรฉmenter l'interface ITestListener. Cette interface remplacera les mรฉthodes onTestFailure, onTestStart, onTestSkipped pour envoyer l'รฉtat correct du scรฉnario de test en cours.

Interface ITestListener

Voici les รฉtapes que nous suivrons

  • Crรฉez une classe, par exemple Rรฉel.Guru99. Signalez-le et implรฉmentez iTestListener dedans.
  • Implรฉmenter les mรฉthodes d'iTestListener
  • Crรฉez une mรฉthode de test et ajoutez RealGuru99. Classe Report en tant qu'รฉcouteur dans la classe Test Method.

Interface ITestListener

Code Exemple

RรฉelsGuru99TimeReport.java est la classe de gรฉnรฉration de rapports en temps rรฉel. Elle implรฉmente l'interface ITestListener pour la gรฉnรฉration de rapports.

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 est le cas de test pour un rapport rรฉel.

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(){

        

    }

}

La sortie ressemblera ร -

Interface ITestListener

Interface IRReporter

Si nous souhaitons personnaliser le rapport de test final gรฉnรฉrรฉ par TestNG, nous devons implรฉmenter l'interface IReporter. Cette interface n'a qu'une seule mรฉthode pour implรฉmenter generateReport. Cette mรฉthode contient toutes les informations d'une exรฉcution de test complรจte dans la liste , et nous pouvons gรฉnรฉrer le rapport en l'utilisant.

Code Exemple

GuruLe fichier 99Reporter.java sert ร  personnaliser le rapport.

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 est une dรฉmonstration de reporting personnalisรฉ

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);

    }

}

La sortie sera comme-

Interface IRReporter

PDF et e-mail des rapports

La mise en ล“uvre du rapport ci-dessus est assez simple et claire pour vous permettre de dรฉmarrer avec la personnalisation des rapports.

Mais dans un environnement dโ€™entreprise, vous devrez crรฉer des rapports hautement personnalisรฉs. Voici le scรฉnario auquel nous allons faire face

  1. Crรฉer un rapport personnalisรฉ sous forme PDF
  2. Prenez des captures d'รฉcran UNIQUEMENT sur les erreurs. Lien vers les captures d'รฉcran en PDF
  3. Envoyer le PDF par email

Le rapport PDF ressemble ร  ceci

PDF et e-mail des rapports

Pour crรฉer un rapport PDF, nous avons besoin d'un Java API Je Texte. Tรฉlรฉcharge le ici . Il existe une autre classe d'รฉcoute personnalisรฉe qui implรฉmente actuellement ce pot IText et crรฉe un rapport PDF pour nous. Tรฉlรฉcharge le ici

La figure ci-dessus montre le format par dรฉfaut du rapport PDF gรฉnรฉrรฉ. Vous pouvez le personnaliser

Voici comment nous allons aborder cela

ร‰tape 1) Crรฉer une classe de base

ร‰tape 2) Personnalisez JypersionListerner.Java (Code de crรฉation PDF)

ร‰tape 3) Crรฉer un testGuruLe fichier 99PDFEmail.java exรฉcutera les cas de test et crรฉera le PDF.

ร‰tape 4) Ajouter le code au testGuru99PDFEmail.java pour envoyer un rapport PDF par e-mail

Examinons ces รฉtapes

ร‰tape 1) Crรฉer une classe de base

Cette classe de base a des fonctions pour crรฉer WebDriver et prendre une capture d'รฉcran

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);

            

    }

}

ร‰tape 2) Personnaliser JypersionListener.java

Nous nous en tiendrons au format de rapport par dรฉfaut. Mais nous ferons 2 personnalisations

  • Ajout de code pour demander ร  JypersionListener de prendre une capture d'รฉcran en cas d'erreur
  • Joindre le lien de la capture d'รฉcran prise dans le rapport PDF

PDF et e-mail des rapports

Ajouter du code pour joindre la capture d'รฉcran au rapport PDF

PDF et e-mail des rapports

ร‰tape 3) Crรฉer un testGuruLe fichier 99PDFEmail.java exรฉcutera les cas de test et crรฉera le PDF.

  • Ici, nous ajouterons JyperionListener.class comme auditeur
  • Nous exรฉcuterons 3 cas de test.
  • En utilisant Assert.assertTrue, nous รฉchouerons ร  2 cas de test en n'en rรฉussissant qu'un seul.
  • Une capture d'รฉcran sera prise pour les cas de test ayant รฉchouรฉ uniquement selon nos personnalisations
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);

    }

ร‰tape 4) Ajouter le code au testGuru99PDFEmail.java pour envoyer un rapport PDF par e-mail

  • Nous utiliserons l'annotation @AfterSuite pour envoyer par email le rapport PDF
  • Nous enverrons des e-mails via Gmail
  • Pour activer le courrier รฉlectronique, vous devez importer de nombreux fichiers de bibliothรจque tels que mail.jar, pop3.jar, smptp.jar, etc.
  • Avant d'exรฉcuter ceci, entrez l'adresse e-mail de, l'adresse e-mail et le mot de passe.
 //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();

}

}

}

Tรฉlรฉchargez le projet complet ici

Remarque : lorsque nous cliquons sur le lien de la capture d'รฉcran en pdf, la boรฎte de dialogue de sรฉcuritรฉ s'affiche. Nous devons autoriser cette boรฎte de dialogue ร  ouvrir le pdf.

PDF et e-mail des rapports

L'email ainsi gรฉnรฉrรฉ ressemblera ร  ceci

PDF et e-mail des rapports

Rรฉsumรฉ

  • TestNG a une capacitรฉ de reporting intรฉgrรฉe.
  • Aprรจs une exรฉcution complรจte des cas de tests, TestNG gรฉnรจre un dossier de sortie de test ร  la racine du projet.
  • Dans le dossier test-output, il existe deux rapports principaux, index.html et emailable-report.html.
  • Customiser TestNG rapport, nous devons implรฉmenter deux interfaces, ITestListener et IReporter.
  • Si nous avons besoin d'obtenir un rapport entre l'exรฉcution, nous avons besoin d'ITestListener.
  • Pour crรฉer un rapport final aprรจs une exรฉcution complรจte, nous devons implรฉmenter IReporter.
  • Prendre la capture d'รฉcran, dans Selenium WebDriver, nous devons taper WebDriver vers l'interface TakesScreenShot.
  • Pour gรฉnรฉrer des rapports PDF, nous devons ajouter un pot IText dans le projet.

Tรฉlรฉchargez le Selenium Fichiers de projet pour la dรฉmo de ce didacticiel

Rรฉsumez cet article avec :