Anpassen, PDF & Email TestNG-Berichte in Selenium WebDriver

Bevor wir uns mit etwas anderem befassen, wollen wir zunächst verstehen:

Warum brauchen wir eine Berichterstattung?

Wenn wir Selenium oder ein anderes Automatisierungstool verwenden, führen wir Vorgänge in der Webanwendung aus. Unser Zweck der Automatisierung besteht jedoch nicht nur darin, die zu testende Anwendung zu testen. Als Automatisierungstester sollen wir die Anwendung testen, Fehler finden und sie dem Entwicklungsteam oder dem höheren Management melden. Hier gewinnt das Reporting für Software an Bedeutung Testen Prozessdefinierung

TestNG-Berichterstattung

Die TestNG-Bibliothek bietet eine sehr praktische Berichtsfunktion. Nach der Ausführung, Testng generiert einen Testausgabeordner im Stammverzeichnis des Projekts. Dieser Ordner enthält zwei Arten von Berichten:

Index.html: Dies ist der vollständige Bericht der aktuellen Ausführung, der Informationen wie Fehler, Gruppen, Zeit, Reporterprotokolle und Test-XML-Dateien enthält.

TestNG-Berichterstattung

emailable-report.html: Dies ist der zusammenfassende Bericht der aktuellen Testausführung, der Folgendes enthält: Testfall Meldung wird grün (für bestandene Testfälle) und rot (für fehlgeschlagene Testfälle) hervorgehoben.

TestNG-Berichterstattung

So passen Sie den TestNG-Bericht an

TestNG-Berichte sind recht praktisch, aber manchmal benötigen wir in Berichten weniger Daten oder möchten Berichte in einem anderen Format wie PDF, Excel usw. anzeigen oder das Layout des Berichts ändern.

Es gibt zwei Möglichkeiten, den TestNG-Bericht anzupassen

  • Verwenden der ITestListener-Schnittstelle:
  • Verwendung der IReporter-Schnittstelle:

Passen Sie den TestNG-Bericht an

ITestListener-Schnittstelle

Wir verwenden diese Schnittstelle, wenn wir Echtzeitberichte anpassen müssen. Mit anderen Worten: Wenn wir eine Reihe von Testfällen in einer TetNG-Suite ausführen und den Bericht jedes Testfalls erhalten möchten, müssen wir nach jedem Testfall die ITestListener-Schnittstelle implementieren. Diese Schnittstelle überschreibt die Methoden onTestFailure, onTestStart und onTestSkipped, um den korrekten Status des aktuellen Testfalls zu senden.

ITestListener-Schnittstelle

Hier sind die Schritte, denen wir folgen werden

  • Erstellen Sie eine Klasse, sagen wir RealGuru99Report, und implementieren Sie iTestListener darin.
  • Implementieren Sie Methoden von iTestListener
  • Erstellen Sie eine Testmethode und fügen Sie die RealGuru99Report-Klasse als Listener in der Testmethodenklasse hinzu.

ITestListener-Schnittstelle

Codebeispiel

RealGuru99TimeReport.java ist die Echtzeit-Berichtsklasse. Es wird die ITestListener-Schnittstelle für die Berichterstellung implementieren

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 ist der Testfall für einen echten Bericht

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

        

    }

}

Die Ausgabe sieht folgendermaßen aus:

ITestListener-Schnittstelle

IReporter-Schnittstelle

Wenn wir den von TestNG generierten endgültigen Testbericht anpassen möchten, müssen wir die IReporter-Schnittstelle implementieren. Diese Schnittstelle verfügt nur über eine Methode zum Implementieren von „generateReport“. Diese Methode enthält alle Informationen einer vollständigen Testausführung in der Liste , und wir können damit den Bericht erstellen.

Codebeispiel

Guru99Reporter.java ist die Datei, die zum Anpassen des Berichts verwendet wird

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 ist eine Demo für benutzerdefinierte Berichte

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

    }

}

Die Ausgabe wird wie folgt aussehen:

IReporter-Schnittstelle

PDF und Email von Berichten

Die obige Berichtsimplementierung ist recht einfach und klar, um Ihnen den Einstieg in die Berichtsanpassung zu erleichtern.

Im Unternehmensumfeld müssen Sie jedoch hochgradig individuelle Berichte erstellen. Hier ist das Szenario, mit dem wir uns befassen werden

  1. Erstellen Sie einen benutzerdefinierten Bericht im PDF-Format
  2. Machen Sie Screenshots NUR bei Fehlern. Link zu Screenshots im PDF
  3. Senden Sie Email des PDFs

Der PDF-Bericht sieht so aus

PDF und Email von Berichten

Um einen PDF-Bericht zu erstellen, benötigen wir eine Javac API Ich schreibe. Lade es herunter hier . Es gibt eine weitere benutzerdefinierte Listener-Klasse, die dieses IText-JAR tatsächlich implementiert und einen PDF-Bericht für uns erstellt. Lade es herunter hier

Die obige Abbildung zeigt das Standardformat des generierten PDF-Berichts. Sie können es anpassen

Hier erfahren Sie, wie wir das angehen

Schritt 1) ​​Erstellen Sie eine Basisklasse

Schritt 2) Anpassen von JypersionListener.Java (PDF-Erstellungscode)

Schritt 3) Erstellen Sie ein TestGuru99PDFEmail.java, das Testfälle ausführt, PDF erstellen

Schritt 4) Code an TestGuru99PDFE anhängenmail.java, um einen PDF-Bericht per E-Mail zu sendenmail

Schauen wir uns diese Schritte an

Schritt 1) ​​Basisklasse erstellen

Diese Basisklasse verfügt über Funktionen zum Erstellen von WebDriver und zum Erstellen von Screenshots

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

            

    }

}

Schritt 2) Passen Sie JypersionListener.java an

Wir bleiben beim Standardberichtsformat. Wir werden jedoch zwei Anpassungen vornehmen

  • Code hinzufügen, um JypersionListener anzuweisen, bei Fehler einen Screenshot zu erstellen
  • Fügen Sie den Link zur Screenshot-Aufnahme im PDF-Bericht hinzu

PDF und Email von Berichten

Fügen Sie Code hinzu, um den Screenshot an den PDF-Bericht anzuhängen

PDF und Email von Berichten

Schritt 3) Erstellen Sie ein TestGuru99PDFEmail.java, das Testfälle ausführt, PDF erstellen

  • Hier fügen wir JyperionListener.class als Listener hinzu
  • Wir werden 3 Testfälle ausführen.
  • Mit Assert.assertTrue werden wir zwei Testfälle nicht bestehen, während wir nur einen bestehen.
  • Screenshots werden nur für die fehlgeschlagenen Testfälle gemäß unseren Anpassungen erstellt
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);

    }

Schritt 4) Code an TestGuru99PDFE anhängenmail.java, um einen PDF-Bericht per E-Mail zu sendenmail

  • Wir werden die Annotation @AfterSuite verwenden, um email des PDF-Berichts
  • Wir versenden email mit Gmail
  • Um E zu aktivierenmail, müssen viele Bibliotheksdateien importieren, z mail.jar, pop3.jar, smptp.jar usw
  • Bevor Sie dies ausführen, geben Sie bitte das Von-Bis-Zeichen einmail Adresse und Passwort
 //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();

}

}

}

Laden Sie hier das komplette Projekt herunter

Hinweis: Wenn wir im PDF auf den Screenshot-Link klicken, wird ein Sicherheitsdialog angezeigt. Wir müssen diesem Dialog erlauben, PDF zu öffnen.

PDF und Email von Berichten

Das email so generiert wird so aussehen

PDF und Email von Berichten

Zusammenfassung

  • TestNG verfügt über eine integrierte Berichtsfunktion.
  • Nach einer vollständigen Ausführung der Testfälle generiert TestNG einen Testausgabeordner im Stammverzeichnis des Projekts.
  • Im Testausgabeordner gibt es zwei Hauptberichte: index.html und emailable-report.html.
  • Um den TestNG-Bericht anzupassen, müssen wir zwei Schnittstellen implementieren, ITestListener und IReporter.
  • Wenn wir zwischen den Ausführungen einen Bericht benötigen, benötigen wir ITestListener.
  • Um nach vollständiger Ausführung einen Abschlussbericht zu erstellen, müssen wir IReporter implementieren.
  • Um den Screenshot zu machen, müssen wir in Selenium WebDriver „cast WebDriver to TakesScreenShot interface“ eingeben.
  • Um PDF-Berichte zu generieren, müssen wir das IText-JAR zum Projekt hinzufügen.

Laden Sie die Selenium-Projektdateien für die Demo in diesem Tutorial herunter