Tilpas, PDF og e-mail TestNG Rapporter i Selenium webdriver

Fรธr vi ser nรฆrmere pรฅ noget andet, lad os fรธrst forstรฅ โ€“

Hvorfor har vi brug for indberetning?

Nรฅr vi bruger Selenium eller ethvert andet automatiseringsvรฆrktรธj, udfรธrer vi operationer pรฅ webapplikationen. Men vores formรฅl med automatisering er ikke kun at udรธve Application Under Test. Det er meningen, at vi som automatiseringstester skal teste applikationen, finde fejl og rapportere det til udviklingsteamet eller hรธjere ledelse. Her fรฅr rapporteringen betydning for software Test behandle

TestNG Rapportering

TestNG biblioteket giver en meget praktisk rapporteringsfunktion. Efter henrettelse, Testng vil generere en test-output mappe i roden af โ€‹โ€‹projektet. Denne mappe indeholder to typer rapporter-

Index.html: Dette er den komplette rapport over den aktuelle udfรธrelse, som indeholder information som en fejl, grupper, tid, reporterlogfiler, testng XML-filer.

TestNG Rapportering

emailable-report.html: Dette er den sammenfattende rapport for den aktuelle testudfรธrelse, som indeholder Test sag meddelelse i grรธn (for bestรฅede testsager) og rรธd (for mislykkede testsager) fremhรฆves.

TestNG Rapportering

Sรฅdan tilpasses TestNG Rapport

TestNG rapportering er ret praktisk, men nogle gange har vi brug for nogle fรฆrre data i rapporter eller รธnsker at vise rapporter i et andet format som pdf, excel osv. eller รธnsker at รฆndre rapportens layout.

Der kan vรฆre to mรฅder, vi kan tilpasse TestNG indberette

  • Brug af ITestListener Interface:
  • Brug af IReporter Interface:

Tilpas TestNG Rapport

ITestListener Interface

Vi bruger denne grรฆnseflade, nรฅr vi skal tilpasse realtidsrapporten. Med andre ord, hvis vi udfรธrer en masse testcases i en TetNG-suite, og vi รธnsker at fรฅ rapporten fra hver testcase, skal vi efter hver testcase implementere ITestListener-grรฆnsefladen. Denne grรฆnseflade vil tilsidesรฆtte metoden onTestFailure, onTestStart, onTestSkipped for at sende den korrekte status for den aktuelle testcase.

ITestListener Interface

Her er de trin, vi vil fรธlge

  • Opret en klasse, sige RealGuru99Rapporter og implementer iTestListener i den.
  • Implementer metoder til iTestListener
  • Opret testmetode og tilfรธj RealGuru99Rapporter klasse som en lytter i Testmetode-klassen.

ITestListener Interface

Code Eksempel

ร†gteGuru99TimeReport.java er realtidsrapporteringsklassen. Den vil implementere ITestListener-grรฆnsefladen til rapportering.

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 er testcasen for den virkelige 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(){

        

    }

}

Outputtet vil se ud som-

ITestListener Interface

IReporter-grรฆnseflade

Hvis vi รธnsker at tilpasse den endelige testrapport genereret af TestNG, skal vi implementere IReporter-grรฆnsefladen. Denne grรฆnseflade har kun รฉn metode til at implementere generReport. Denne metode har alle oplysningerne om en komplet testudfรธrelse i listen , og vi kan generere rapporten ved hjรฆlp af den.

Code Eksempel

Guru99Reporter.java er den fil, der bruges til at tilpasse rapporten

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 er en demo til brugerdefineret rapportering

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

    }

}

Output vil vรฆre som-

IReporter-grรฆnseflade

PDF og e-mail med rapporter

Ovenstรฅende rapportimplementering er ret enkel og overskuelig for at komme i gang med rapporttilpasning.

Men i et virksomhedsmiljรธ bliver du nรธdt til at oprette meget tilpassede rapporter. Her er scenariet, vi skal beskรฆftige os med

  1. Opret brugerdefineret rapport i PDF-form
  2. Tag KUN skรฆrmbilleder af fejl. Link til skรฆrmbilleder i PDF
  3. Send e-mail til PDF'en

PDF-rapporten ser sรฅdan ud

PDF og e-mail med rapporter

For at oprette pdf-rapport har vi brug for en Java API ITekst. Download det link. . Der er en anden tilpasset lytterklasse, som faktisk implementerer denne IText-krukke og laver en pdf-rapport til os. Download det link.

Ovenstรฅende figur viser standardformatet for den genererede PDF-rapport. Du kan tilpasse det

Her er hvordan vi vil gribe dette an

Trin 1) Opret en basisklasse

Trin 2) Tilpas JypersionListerner.Java (PDF oprettelseskode)

Trin 3) Opret en testGuru99PDFEmail.java, som vil udfรธre testcases og oprette PDF-filer

Trin 4) Tilfรธj kode til testenGuru99PDFEmail.java til at sende PDF-rapport via e-mail

Lad os se nรฆrmere pรฅ disse trin

Trin 1) Opret basisklasse

Denne basisklasse har funktioner til at oprette WebDriver og tage skรฆrmbillede

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

            

    }

}

Trin 2) Tilpas JypersionListener.java

Vi holder os til standardrapportformatet. Men vi vil lave 2 tilpasninger

  • Tilfรธjelse af kode for at instruere JypersionListener om at tage et skรฆrmbillede ved fejl
  • Vedhรฆftning af linket til skรฆrmbilledet tages i PDF-rapporten

PDF og e-mail med rapporter

Tilfรธj kode for at vedhรฆfte skรฆrmbilledet til PDF-rapporten

PDF og e-mail med rapporter

Trin 3) Opret en testGuru99PDFEmail.java, som vil udfรธre testcases og oprette PDF-filer

  • Her vil vi tilfรธje JyperionListener.class som lytter
  • Vi udfรธrer 3 testsager.
  • Ved at bruge Assert.assertTrue vil vi fejle 2 testcases, mens vi kun bestรฅr รฉn.
  • Skรฆrmbillede vil kun blive taget for de mislykkede testsager i henhold til vores tilpasninger
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);

    }

Trin 4) Tilfรธj kode til testenGuru99PDFEmail.java til at sende PDF-rapport via e-mail

  • Vi vil bruge annotationen @AfterSuite til at sende e-mail med PDF-rapporten
  • Vi vil sende e-mails ved hjรฆlp af Gmail
  • For at aktivere e-mail skal du importere mange biblioteksfiler som mail.jar, pop3.jar, smptp.jar osv.
  • Inden du udfรธrer dette, skal du indtaste fra, til e-mailadresse og adgangskode
 //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 hele projektet her

Bemรฆrk: Nรฅr vi klikker pรฅ skรฆrmbilledet-linket i pdf, viser det en sikkerhedsdialog. Vi er nรธdt til at tillade denne dialog at รฅbne pdf.

PDF og e-mail med rapporter

Den sรฅledes genererede e-mail vil se sรฅdan ud

PDF og e-mail med rapporter

Resumรฉ

  • TestNG har en indbygget rapporteringsevne i sig.
  • Efter en komplet udfรธrelse af testcases, TestNG genererer en test-output-mappe i projektets rod.
  • I test-output-mappen er der to hovedrapporter, index.html og emailable-report.html.
  • At tilpasse TestNG rapport skal vi implementere to grรฆnseflader, ITestListener og IReporter.
  • Hvis vi skal have en rapport mellem udfรธrelsen, har vi brug for ITestListener.
  • For at oprette en endelig rapport efter fuldstรฆndig udfรธrelse skal vi implementere IReporter.
  • Tager skรฆrmbilledet, ind Selenium WebDriver, vi skal skrive cast WebDriver til TakesScreenShot-grรฆnsefladen.
  • For at generere pdf-rapporter skal vi tilfรธje IText jar i projektet.

Download Selenium Projektfiler til demoen i denne vejledning

Opsummer dette indlรฆg med: