Dostosuj, wyślij PDF i e-mailem TestNG Raporty w Selenium Sterownik sieciowy

Zanim zajmiemy się czymkolwiek innym, najpierw zrozummy –

Dlaczego potrzebujemy raportowania?

Kiedy używamy Selenium lub jakiegokolwiek innego narzędzia automatyzacji, wykonujemy operacje na aplikacji internetowej. Ale naszym celem automatyzacji nie jest tylko ćwiczenie Aplikacji Pod Testem. My, jako testerzy automatyzacji, mamy testować aplikację, znajdować błędy i zgłaszać je zespołowi programistów lub wyższemu kierownictwu. Tutaj raportowanie nabiera znaczenia dla oprogramowania Testowanie wygląda tak

TestNG Raportowanie

TestNG Biblioteka udostępnia bardzo przydatną funkcję raportowania. Po egzekucji Testowanie wygeneruje folder wyjściowy testu w katalogu głównym projektu. Ten folder zawiera dwa typy raportów:

Indeks.html: Jest to kompletny raport bieżącego wykonania zawierający informacje takie jak błąd, grupy, czas, dzienniki raportów i pliki XML testowe.

TestNG Raportowanie

raport-do-wysłania-e-mailem.html: To jest podsumowanie raportu bieżącego wykonania testu, który zawiera: Przypadek testowy komunikat w kolorze zielonym (dla przypadków testowych zakończonych sukcesem) i czerwonym (dla przypadków testowych zakończonych niepowodzeniem).

TestNG Raportowanie

Jak dostosować TestNG Zgłoś

TestNG raportowanie jest całkiem przydatne, ale czasami potrzebujemy mniej danych w raportach lub chcemy wyświetlić raporty w innym formacie, np. PDF, Excel itp., lub chcemy zmienić układ raportu.

Dostosować możemy na dwa sposoby TestNG raport

  • Korzystanie z interfejsu ITestListener:
  • Korzystanie z interfejsu IReportera:

Dostosuj TestNG Zgłoś

Interfejs ITestListener

Używamy tego interfejsu, gdy musimy dostosować raport w czasie rzeczywistym. Innymi słowy, jeśli wykonujemy kilka przypadków testowych w pakiecie TetNG i chcemy uzyskać raport z każdego przypadku testowego, to po każdym przypadku testowym musimy zaimplementować interfejs ITestListener. Ten interfejs zastąpi metody onTestFailure, onTestStart, onTestSkipped w celu przesłania poprawnego statusu bieżącego przypadku testowego.

Interfejs ITestListener

Oto kroki, które będziemy wykonywać

  • Utwórz klasę, powiedz RealGuru99Report i zaimplementuj w niej iTestListener.
  • Zaimplementuj metody iTestListener
  • Utwórz metodę testową i dodaj klasę RealGuru99Report jako słuchacz w klasie Metoda testowa.

Interfejs ITestListener

Przykład kodu

RealGuru99TimeReport.java to klasa raportowania w czasie rzeczywistym. Wdroży interfejs ITestListener do raportowania

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 to przypadek testowy prawdziwego raportu

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

        

    }

}

Dane wyjściowe będą wyglądać następująco:

Interfejs ITestListener

Interfejs IReportera

Jeśli chcemy dostosować końcowy raport z testów wygenerowany przez TestNG, musimy zaimplementować interfejs IReporter. Ten interfejs ma tylko jedną metodę implementacji generateReport. Ta metoda zawiera wszystkie informacje dotyczące pełnego wykonania testu na liście i za jego pomocą możemy wygenerować raport.

Przykład kodu

Guru99Reporter.java to plik używany do dostosowywania raportu

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 to wersja demonstracyjna raportowania niestandardowego

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

    }

}

Dane wyjściowe będą takie jak-

Interfejs IReportera

Raporty w formacie PDF i e-mail

Powyższa implementacja raportu jest dość prosta i przejrzysta, co ułatwia rozpoczęcie dostosowywania raportu.

Jednak w środowisku korporacyjnym konieczne będzie tworzenie wysoce dostosowanych raportów. Oto scenariusz, z którym będziemy mieli do czynienia

  1. Utwórz niestandardowy raport w formacie PDF
  2. Rób zrzuty ekranu TYLKO w przypadku błędów. Link do zrzutów ekranu w formacie PDF
  3. Wyślij e-mailem plik PDF

Raport w formacie PDF wygląda następująco

Raporty w formacie PDF i e-mail

Aby utworzyć raport w formacie PDF, potrzebujemy pliku Java API ITekst. Pobierz to tutaj . Istnieje inna niestandardowa klasa słuchacza, która faktycznie implementuje ten słoik IText i tworzy dla nas raport w formacie PDF. Pobierz to tutaj

Powyższy rysunek przedstawia domyślny format wygenerowanego raportu PDF. Możesz go dostosować

Oto jak do tego podejdziemy

Krok 1) Utwórz klasę bazową

Krok 2) Dostosuj JypersionListerner.Java (kod tworzenia pliku PDF)

Krok 3) Utwórz TestGuru99PDFEmail.java, który będzie wykonywał przypadki testowe i tworzył pliki PDF

Krok 4) Dodaj kod do TestGuru99PDFEmail.java, aby wysłać raport PDF pocztą elektroniczną

Przyjrzyjmy się tym krokom

Krok 1) Utwórz klasę bazową

Ta klasa bazowa zawiera funkcje umożliwiające utworzenie sterownika WebDriver i wykonanie zrzutu ekranu

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

            

    }

}

Krok 2) Dostosuj JypersionListener.java

Pozostaniemy przy domyślnym formacie raportu. Ale dokonamy 2 dostosowań

  • Dodanie kodu instruującego JypersionListener, aby zrobił zrzut ekranu w przypadku błędu
  • Załączam link do zrzutu ekranu w raporcie PDF

Raporty w formacie PDF i e-mail

Dodaj kod umożliwiający dołączenie zrzutu ekranu do raportu w formacie PDF

Raporty w formacie PDF i e-mail

Krok 3) Utwórz TestGuru99PDFEmail.java, który będzie wykonywał przypadki testowe i tworzył pliki PDF

  • Tutaj dodamy JyperionListener.class jako słuchacz
  • Wykonamy 3 przypadki testowe.
  • Używając Assert.assertTrue, nie przejdziemy 2 przypadków testowych, przechodząc tylko jeden.
  • Zrzut ekranu zostanie wykonany w przypadku nieudanych testów tylko zgodnie z naszymi dostosowaniami
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);

    }

Krok 4) Dodaj kod do TestGuru99PDFEmail.java, aby wysłać raport PDF pocztą elektroniczną

  • Użyjemy adnotacji @AfterSuite do wysłania raportu PDF pocztą elektroniczną
  • Będziemy wysyłać e-maile za pomocą Gmaila
  • Aby włączyć pocztę e-mail, należy zaimportować wiele plików bibliotek, takich jak mail.jar, pop3.jar, smptp.jar itp.
  • Przed wykonaniem tej czynności wprowadź adres e-mail nadawcy i odbiorcy oraz hasło
 //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();

}

}

}

Pobierz cały projekt tutaj

Uwaga: Kiedy klikniemy łącze do zrzutu ekranu w formacie PDF, wyświetli się okno dialogowe zabezpieczeń. Musimy zezwolić temu oknie dialogowemu na otwarcie pliku PDF.

Raporty w formacie PDF i e-mail

Wygenerowany w ten sposób e-mail będzie wyglądał następująco

Raporty w formacie PDF i e-mail

Podsumowanie

  • TestNG ma wbudowaną funkcję raportowania.
  • Po całkowitym wykonaniu przypadków testowych, TestNG generuje folder wyjściowy testu w katalogu głównym projektu.
  • W folderze test-output znajdują się dwa główne raporty: index.html i emailable-report.html.
  • Dostosować TestNG report musimy zaimplementować dwa interfejsy, ITestListener i IReporter.
  • Jeśli potrzebujemy uzyskać raport pomiędzy wykonaniem, potrzebujemy ITestListener.
  • Aby utworzyć raport końcowy po całkowitym wykonaniu, musimy zaimplementować IReporter.
  • Robię zrzut ekranu, w Selenium WebDriver, musimy wpisać cast WebDriver do interfejsu TakesScreenShot.
  • Aby wygenerować raporty w formacie PDF musimy dodać w projekcie jar IText.

Pobierz Selenium Pliki projektu dla wersji demonstracyjnej w tym samouczku