Aanpassen, PDF & E-mail TestNG Rapporteert binnen Selenium webdriver

Voordat we naar iets anders kijken, laten we eerst begrijpen:

Waarom hebben we rapportage nodig?

Wanneer we gebruiken Selenium of een andere automatiseringstool, voeren we bewerkingen uit op de webapplicatie. Maar ons doel van automatisering is niet alleen om de Application Under Test uit te voeren. Wij, als automatiseringstester, moeten de applicatie testen, bugs vinden en deze rapporteren aan het ontwikkelteam of hogere management. Hier wordt de rapportage belangrijk voor software Testen

TestNG Rapportage

TestNG bibliotheek biedt een zeer handige rapportagefunctie. Na executie, Testen genereert een test-uitvoermap in de hoofdmap van het project. Deze map bevat twee soorten rapporten:

Index.html: Dit is het volledige rapport van de huidige uitvoering, dat informatie bevat zoals fouten, groepen, tijd, reporterlogboeken en test-XML-bestanden.

TestNG Rapportage

emailbaar-rapport.html: Dit is het samenvattende rapport van de huidige testuitvoering, dat het volgende bevat: Testgeval bericht in groen (voor geslaagde testgevallen) en rood (voor mislukte testgevallen) gemarkeerd.

TestNG Rapportage

Aanpassen TestNG Rapport

TestNG Rapportage is best handig, maar toch hebben we soms wat minder gegevens nodig in rapporten of willen we rapporten in een ander formaat weergeven, zoals pdf, Excel, enz., of willen we de lay-out van het rapport wijzigen.

Er zijn twee manieren waarop we maatwerk kunnen leveren TestNG verslag

  • De ITestListener-interface gebruiken:
  • De IReporter-interface gebruiken:

Personaliseer TestNG Rapport

ITestListener-interface

We gebruiken deze interface wanneer we het realtime rapport moeten aanpassen. Met andere woorden, als we een hele reeks testcases in een TetNG-suite uitvoeren en we het rapport van elke testcase willen ontvangen, dan moeten we na elke testcase de ITestListener-interface implementeren. Deze interface overschrijft de methoden onTestFailure, onTestStart en onTestSkipped om de juiste status van de huidige testcase te verzenden.

ITestListener-interface

Dit zijn de stappen die we zullen volgen

  • Maak een klasse, bijvoorbeeld RealGuru99Report, en implementeer iTestListener daarin.
  • Implementeer methoden van iTestListener
  • Maak een testmethode en voeg de klasse RealGuru99Report toe als luisteraar in de klasse Testmethode.

ITestListener-interface

Code Voorbeeld

RealGuru99TimeReport.java is de realtime rapportageklasse. Het zal de ITestListener-interface voor rapportage implementeren

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 is de testcase voor een echt rapport

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

        

    }

}

De uitvoer ziet er als volgt uit:

ITestListener-interface

IReporter-interface

Als we het definitieve testrapport willen aanpassen dat is gegenereerd door TestNG, moeten we de IReporter-interface implementeren. Deze interface heeft slechts één methode om genereport te implementeren. Deze methode heeft alle informatie van een volledige testuitvoering in de lijst , en we kunnen er het rapport mee genereren.

Code Voorbeeld

Guru99Reporter.java is het bestand dat wordt gebruikt om het rapport aan te passen

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 is een demo voor aangepaste rapportage

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

    }

}

De uitvoer zal zijn als-

IReporter-interface

PDF en e-mail van rapporten

De bovenstaande rapportimplementatie is vrij eenvoudig en duidelijk, zodat u aan de slag kunt met het aanpassen van rapporten.

Maar in een bedrijfsomgeving moet u zeer aangepaste rapporten maken. Dit is het scenario waarmee we te maken zullen krijgen

  1. Maak een aangepast rapport in PDF-vorm
  2. Maak ALLEEN screenshots van fouten. Link naar schermafbeeldingen in PDF
  3. E-mail verzenden van de PDF

Het PDF-rapport ziet er als volgt uit

PDF en e-mail van rapporten

Om een ​​pdf-rapport te maken hebben we een Java API ITekst. Download het hier . Er is nog een aangepaste luisteraarklasse die deze IText-jar daadwerkelijk implementeert en een pdf-rapport voor ons maakt. Download het hier

Bovenstaande afbeelding toont het standaardformaat van het gegenereerde PDF-rapport. Je kunt het aanpassen

Hier ziet u hoe we dit zullen aanpakken

Stap 1) Creëer een basisklasse

Stap 2) Pas JypersionListerner aan.Java (PDF-aanmaakcode)

Stap 3) Maak een TestGuru99PDFEmail.java die testcases uitvoert en een PDF maakt

Stap 4) Voeg code toe aan TestGuru99PDFEmail.java om een ​​PDF-rapport via e-mail te verzenden

Laten we deze stappen eens bekijken

Stap 1) Maak een basisklasse

Deze basisklasse heeft functies om WebDriver te maken en Screenshot te maken

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

            

    }

}

Stap 2) Pas JypersionListener.java aan

We blijven bij het standaardrapportformaat. Maar we zullen 2 aanpassingen maken

  • Code toevoegen om JypersionListener te instrueren om een ​​screenshot te maken bij een fout
  • Voeg de link van de screenshot toe aan het PDF-rapport

PDF en e-mail van rapporten

Voeg code toe om de schermafbeelding aan het PDF-rapport toe te voegen

PDF en e-mail van rapporten

Stap 3) Maak een TestGuru99PDFEmail.java die testcases uitvoert en een PDF maakt

  • Hier zullen we JyperionListener.class toevoegen als luisteraar
  • We zullen 3 testgevallen uitvoeren.
  • Met behulp van Assert.assertTrue zullen we twee testgevallen niet doorstaan, terwijl we er slechts één doorstaan.
  • Er wordt alleen een screenshot gemaakt van de mislukte testgevallen volgens onze aanpassingen
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);

    }

Stap 4) Voeg code toe aan TestGuru99PDFEmail.java om een ​​PDF-rapport via e-mail te verzenden

  • We zullen de annotatie @AfterSuite gebruiken om het PDF-rapport per e-mail te verzenden
  • We zullen e-mail verzenden via Gmail
  • Om e-mail in te schakelen, moeten veel bibliotheekbestanden worden geïmporteerd, zoals mail.jar, pop3.jar, smptp.jar, enz.
  • Voordat u dit uitvoert, moet u het van- en het aan-e-mailadres en het wachtwoord invoeren
 //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();

}

}

}

Download hier het volledige project

Opmerking: wanneer we op de screenshot-link in pdf klikken, wordt er een beveiligingsdialoogvenster weergegeven. We moeten toestaan ​​dat dit dialoogvenster pdf opent.

PDF en e-mail van rapporten

De e-mail die zo wordt gegenereerd, ziet er als volgt uit

PDF en e-mail van rapporten

Samenvatting

  • TestNG heeft een ingebouwde rapportagemogelijkheid.
  • Na een volledige uitvoering van testgevallen, TestNG genereert een test-uitvoermap in de hoofdmap van het project.
  • In de map test-output staan ​​twee hoofdrapporten: index.html en emailable-report.html.
  • Op maat maken TestNG rapport moeten we twee interfaces implementeren, ITestListener en IReporter.
  • Als we tussen de uitvoering door een rapport moeten ontvangen, hebben we ITestListener nodig.
  • Om na volledige uitvoering een eindrapport te kunnen maken, moeten we IReporter implementeren.
  • De schermafbeelding maken, in Selenium WebDriver, we moeten Cast WebDriver naar de TakesScreenShot-interface typen.
  • Om pdf-rapporten te genereren moeten we IText jar aan het project toevoegen.

Download de Selenium Projectbestanden voor de demo in deze zelfstudie