Anpassa, PDF och e-post TestNG Rapporter i Selenium webbdrivrutin

Innan vi tittar pรฅ nรฅgot annat, lรฅt oss fรถrst fรถrstรฅ โ€“

Varfรถr behรถver vi rapportering?

Nรคr vi anvรคnder Selenium eller nรฅgot annat automationsverktyg utfรถr vi operationer pรฅ webbapplikationen. Men vรฅrt syfte med automatisering รคr inte bara att utรถva Application Under Test. Vi som automationstestare รคr tรคnkta att testa applikationen, hitta buggar och rapportera den till utvecklingsteamet eller hรถgre ledning. Hรคr fรฅr rapporteringen betydelse fรถr mjukvara Testning process

TestNG Rapportering

TestNG biblioteket erbjuder en mycket praktisk rapporteringsfunktion. Efter avrรคttningen, Testng kommer att generera en test-output-mapp i roten av projektet. Denna mapp innehรฅller tvรฅ typer av rapporter-

Index.html: Detta รคr den fullstรคndiga rapporten รถver aktuell kรถrning som innehรฅller information som ett fel, grupper, tid, reporterloggar, testng XML-filer.

TestNG Rapportering

emailable-report.html: Detta รคr den sammanfattande rapporten fรถr den aktuella testkรถrningen som innehรฅller Testfall meddelande i grรถnt (fรถr godkรคnda testfall) och rรถtt (fรถr misslyckade testfall) markera.

TestNG Rapportering

Hur du anpassar TestNG Rapport

TestNG rapportering รคr ganska praktiskt men ibland behรถver vi lite mindre data i rapporter eller vill visa rapporter i nรฅgot annat format som pdf, excel, etc. eller vill รคndra rapportens layout.

Det kan finnas tvรฅ sรคtt vi kan anpassa TestNG rapport

  • Anvรคnda ITestListener Interface:
  • Anvรคnda IReporter Interface:

Customize TestNG Rapport

ITestListener-grรคnssnitt

Vi anvรคnder detta grรคnssnitt nรคr vi behรถver anpassa realtidsrapporten. Med andra ord, om vi kรถr ett gรคng testfall i en TetNG-svit och vi vill fรฅ rapporten fรถr varje testfall, mรฅste vi efter varje testfall implementera ITestListener-grรคnssnittet. Detta grรคnssnitt kommer att รฅsidosรคtta onTestFailure, onTestStart, onTestSkipped metod fรถr att skicka korrekt status fรถr det aktuella testfallet.

ITestListener-grรคnssnitt

Hรคr รคr stegen vi kommer att fรถlja

  • Skapa en klass, sรคg RealGuru99Rapportera och implementera iTestListener i den.
  • Implementera metoder fรถr iTestListener
  • Skapa testmetod och lรคgg till RealGuru99Rapportera klassen som en lyssnare i Test Method-klassen.

ITestListener-grรคnssnitt

Code Exempelvis

RealGuru99TimeReport.java รคr klassen fรถr realtidsrapportering. Den kommer att implementera ITestListener-grรคnssnittet fรถr 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

        

    }

    

}

TestaGuru99RealReport.java รคr testfallet fรถr Real Report

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

        

    }

}

Utgรฅngen kommer att se ut som-

ITestListener-grรคnssnitt

IReporter-grรคnssnitt

Om vi โ€‹โ€‹vill anpassa sluttestrapporten genererad av TestNG, mรฅste vi implementera IReporter-grรคnssnittet. Detta grรคnssnitt har bara en metod fรถr att implementera genereraReport. Denna metod har all information om en fullstรคndig testkรถrning i listan , och vi kan generera rapporten med den.

Code Exempelvis

Guru99Reporter.java รคr filen som anvรคnds fรถr att anpassa 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()));

                

            }

        }

        }

        

    }

}

TestaGuru99ForReporter.java รคr en demo fรถr anpassad 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);

    }

}

Utgรฅngen blir som-

IReporter-grรคnssnitt

PDF och e-post med rapporter

Ovanstรฅende rapportimplementering รคr ganska enkel och tydlig fรถr att komma igรฅng med rapportanpassning.

Men i fรถretagsmiljรถn mรฅste du skapa mycket anpassade rapporter. Hรคr รคr scenariot vi kommer att ta itu med

  1. Skapa anpassad rapport i PDF-form
  2. Ta skรคrmdumpar ENDAST pรฅ fel. Lรคnk till skรคrmdumpar i PDF
  3. Skicka e-post till PDF-filen

PDF-rapporten ser ut sรฅ hรคr

PDF och e-post med rapporter

Fรถr att skapa pdf-rapport behรถver vi en Java API IText. Ladda ner det hรคr. . Det finns en annan anpassad lyssnarklass som faktiskt implementerar denna IText-burk och skapar en pdf-rapport รฅt oss. Ladda ner det hรคr.

Ovanstรฅende figur visar standardformatet fรถr den genererade PDF-rapporten. Du kan anpassa den

Sรฅ hรคr tar vi oss an detta

Steg 1) Skapa en basklass

Steg 2) Anpassa JypersionListerner.Java (PDF skapande kod)

Steg 3) Skapa ett testGuru99PDFEmail.java som kรถr testfall och skapar PDF

Steg 4) Lรคgg till kod i testetGuru99PDFEmail.java fรถr att skicka PDF-rapport via e-post

Lรฅt oss titta nรคrmare pรฅ dessa steg

Steg 1) Skapa basklass

Den hรคr basklassen har funktioner fรถr att skapa WebDriver och ta skรคrmdump

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

            

    }

}

Steg 2) Anpassa JypersionListener.java

Vi kommer att hรฅlla fast vid standardrapportformatet. Men vi kommer att gรถra 2 anpassningar

  • Lรคgger till kod fรถr att instruera JypersionListener att ta skรคrmdump vid fel
  • Bifogar lรคnken till skรคrmdumpen i PDF-rapporten

PDF och e-post med rapporter

Lรคgg till kod fรถr att bifoga skรคrmdumpen till PDF-rapporten

PDF och e-post med rapporter

Steg 3) Skapa ett testGuru99PDFEmail.java som kรถr testfall och skapar PDF

  • Hรคr kommer vi att lรคgga till JyperionListener.class som lyssnare
  • Vi kommer att utfรถra 3 testfall.
  • Genom att anvรคnda Assert.assertTrue kommer vi att misslyckas med 2 testfall medan vi bara klarar ett.
  • Skรคrmdump kommer endast att tas fรถr de misslyckade testfallen enligt vรฅra anpassningar
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);

    }

Steg 4) Lรคgg till kod i testetGuru99PDFEmail.java fรถr att skicka PDF-rapport via e-post

  • Vi kommer att anvรคnda anteckningen @AfterSuite fรถr att skicka e-post med PDF-rapporten
  • Vi kommer att skicka e-post med hjรคlp av Gmail
  • Fรถr att aktivera e-post mรฅste du importera mรฅnga biblioteksfiler som mail.jar, pop3.jar, smptp.jar, etc.
  • Innan du utfรถr detta, ange frรฅn, till e-postadress och lรถsenord
 //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();

}

}

}

Ladda ner hela projektet hรคr

Obs: Nรคr vi klickar pรฅ skรคrmbildslรคnken i pdf visar den sรคkerhetsdialogrutan. Vi mรฅste tillรฅta den hรคr dialogrutan att รถppna pdf.

PDF och e-post med rapporter

E-postmeddelandet som genereras sรฅ kommer att se ut sรฅ hรคr

PDF och e-post med rapporter

Sammanfattning

  • TestNG har en inbyggd rapporteringsfรถrmรฅga i sig.
  • Efter en fullstรคndig utfรถrande av testfall, TestNG genererar en test-output-mapp i projektets rot.
  • I test-output-mappen finns det tvรฅ huvudrapporter, index.html och emailable-report.html.
  • Att anpassa TestNG rapport behรถver vi implementera tvรฅ grรคnssnitt, ITestListener och IReporter.
  • Om vi โ€‹โ€‹behรถver fรฅ en rapport mellan kรถrningarna behรถver vi ITestListener.
  • Fรถr att skapa en slutrapport efter fullstรคndigt genomfรถrande mรฅste vi implementera IReporter.
  • Tar skรคrmdumpen, in Selenium WebDriver, vi mรฅste skriva cast WebDriver till TakesScreenShot-grรคnssnittet.
  • Fรถr att generera pdf-rapporter mรฅste vi lรคgga till IText jar i projektet.

ladda ner Selenium Projektfiler fรถr demon i denna handledning

Sammanfatta detta inlรคgg med: