Tilpass, PDF og e-post TestNG Rapporter i Selenium webdriver

Fรธr vi ser nรฆrmere pรฅ noe annet, la oss fรธrst forstรฅ โ€“

Hvorfor trenger vi rapportering?

Nรฅr vi bruker Selenium eller andre automatiseringsverktรธy, utfรธrer vi operasjoner pรฅ nettapplikasjonen. Men vรฅr hensikt med automatisering er ikke bare รฅ utรธve applikasjonen under test. Vi, som automatiseringstester, er ment รฅ teste applikasjonen, finne feil og rapportere den til utviklingsteamet eller hรธyere ledelse. Her fรฅr rapporteringen betydning for programvare Testing prosess

TestNG Rapportering

TestNG biblioteket gir en veldig hendig rapporteringsfunksjon. Etter henrettelse, Testng vil generere en test-utdatamappe ved roten av prosjektet. Denne mappen inneholder to typer rapporter-

Index.html: Dette er den komplette rapporten over gjeldende utfรธrelse som inneholder informasjon som en feil, grupper, tid, reporterlogger, testng XML-filer.

TestNG Rapportering

emailable-report.html: Dette er oppsummeringsrapporten for gjeldende testutfรธrelse som inneholder Testsak melding i grรธnt (for bestรฅtt testtilfeller) og rรธdt (for mislykkede testtilfeller) utheving.

TestNG Rapportering

Hvordan tilpasse TestNG Report

TestNG rapportering er ganske nyttig, men likevel trenger vi noen ganger mindre data i rapporter eller รธnsker รฅ vise rapporter i et annet format som pdf, excel, etc. eller รธnsker รฅ endre rapportens layout.

Det kan vรฆre to mรฅter vi kan tilpasse TestNG rapporterer

  • Bruke ITestListener-grensesnittet:
  • Bruke IReporter Interface:

Tilpass TestNG Report

ITestListener-grensesnitt

Vi bruker dette grensesnittet nรฅr vi trenger รฅ tilpasse sanntidsrapporten. Med andre ord, hvis vi kjรธrer en haug med testtilfeller i en TetNG-pakke og vi รธnsker รฅ fรฅ rapporten fra hver testsak, mรฅ vi etter hvert testtilfelle implementere ITestListener-grensesnittet. Dette grensesnittet vil overstyre onTestFailure, onTestStart, onTestSkipped-metoden for รฅ sende riktig status for gjeldende testtilfelle.

ITestListener-grensesnitt

Her er trinnene vi skal fรธlge

  • Lag en klasse, si RealGuru99Rapporter og implementer iTestListener i den.
  • Implementer metoder for iTestListener
  • Opprett testmetode og legg til RealGuru99Rapporter klasse som en lytter i Testmetode-klassen.

ITestListener-grensesnitt

Code Eksempel

RealGuru99TimeReport.java er klassen for sanntidsrapportering. Den vil implementere ITestListener-grensesnittet for 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 testtilfellet for ekte rapporter

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

        

    }

}

Utgangen vil se ut som-

ITestListener-grensesnitt

IReporter-grensesnitt

Hvis vi รธnsker รฅ tilpasse endelig testrapport generert av TestNG, mรฅ vi implementere IReporter-grensesnittet. Dette grensesnittet har bare รฉn metode for รฅ implementere genererrapport. Denne metoden har all informasjon om en fullstendig testkjรธring i listen , og vi kan generere rapporten ved รฅ bruke den.

Code Eksempel

Guru99Reporter.java er filen som brukes til รฅ 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 for tilpasset 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);

    }

}

Utgangen vil vรฆre som-

IReporter-grensesnitt

PDF og e-post med rapporter

Rapportimplementeringen ovenfor er ganske enkel og oversiktlig for รฅ komme i gang med rapporttilpasning.

Men i bedriftsmiljรธer mรฅ du lage svรฆrt tilpassede rapporter. Her er scenariet vi skal forholde oss til

  1. Lag egendefinert rapport i PDF-form
  2. Ta skjermbilder KUN pรฅ feil. Link til skjermbilder i PDF
  3. Send e-post til PDF-en

PDF-rapporten ser slik ut

PDF og e-post med rapporter

For รฅ lage pdf-rapport trenger vi en Java API ITekst. Last det ned her. . Det er en annen tilpasset lytterklasse som faktisk implementerer denne IText-krukken og lager en pdf-rapport for oss. Last den ned her.

Figuren ovenfor viser standardformatet til PDF-rapporten som genereres. Du kan tilpasse den

Her er hvordan vi vil tilnรฆrme oss dette

Trinn 1) Opprett en basisklasse

Trinn 2) Tilpass JypersionListerner.Java (PDF-opprettingskode)

Trinn 3) Lag en testGuru99PDFEmail.java som vil kjรธre testtilfeller, opprette PDF

Trinn 4) Legg til kode i testenGuru99PDFEmail.java for รฅ sende PDF-rapport via e-post

La oss se nรฆrmere pรฅ disse trinnene

Trinn 1) Opprett baseklasse

Denne basisklassen har funksjoner for รฅ lage WebDriver og ta skjermbilde

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

            

    }

}

Trinn 2) Tilpass JypersionListener.java

Vi vil holde oss til standard rapportformat. Men vi vil gjรธre 2 tilpasninger

  • Legger til kode for รฅ instruere JypersionListener om รฅ ta skjermbilde ved feil
  • Ved รฅ legge ved lenken til skjermbildet i PDF-rapporten

PDF og e-post med rapporter

Legg til kode for รฅ legge ved skjermbildet til PDF-rapporten

PDF og e-post med rapporter

Trinn 3) Lag en testGuru99PDFEmail.java som vil kjรธre testtilfeller, opprette PDF

  • Her vil vi legge til JyperionListener.class som lytter
  • Vi skal utfรธre 3 testsaker.
  • Ved รฅ bruke Assert.assertTrue vil vi mislykkes i 2 testtilfeller mens vi bestรฅtt bare รฉn.
  • Skjermbilde vil bare bli tatt for de mislykkede testtilfellene i henhold til vรฅre 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);

    }

Trinn 4) Legg til kode i testenGuru99PDFEmail.java for รฅ sende PDF-rapport via e-post

  • Vi vil bruke merknaden @AfterSuite for รฅ sende e-post med PDF-rapporten
  • Vi vil sende e-post ved hjelp av Gmail
  • For รฅ aktivere e-post, mรฅ du importere mange bibliotekfiler som mail.jar, pop3.jar, smptp.jar osv.
  • Fรธr du utfรธrer dette, skriv inn fra, til e-postadresse og passord
 //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();

}

}

}

Last ned hele prosjektet her

Merk: Nรฅr vi klikker pรฅ skjermbildekoblingen i pdf, viser den sikkerhetsdialogen. Vi mรฅ la denne dialogboksen รฅpne pdf.

PDF og e-post med rapporter

E-posten som genereres slik vil se slik ut

PDF og e-post med rapporter

Sammendrag

  • TestNG har en innebygd rapporteringsevne i seg.
  • Etter en fullstendig utfรธrelse av testsaker, TestNG genererer en test-utdatamappe i roten av prosjektet.
  • I test-output-mappen er det to hovedrapporter, index.html og emailable-report.html.
  • For รฅ tilpasse TestNG rapport mรฅ vi implementere to grensesnitt, ITestListener og IReporter.
  • Hvis vi trenger รฅ fรฅ en rapport mellom utfรธrelse, trenger vi ITestListener.
  • For รฅ lage en sluttrapport etter fullstendig utfรธrelse, mรฅ vi implementere IReporter.
  • Tar skjermbildet, inn Selenium WebDriver, vi mรฅ skrive cast WebDriver til TakesScreenShot-grensesnittet.
  • For รฅ generere pdf-rapporter mรฅ vi legge til IText jar i prosjektet.

Last ned Selenium Prosjektfiler for demoen i denne opplรฆringen

Oppsummer dette innlegget med: