Налаштування, PDF і електронна пошта TestNG Звіти в Selenium веб-драйвер

Перш ніж розглядати щось інше, давайте спочатку зрозуміємо –

Навіщо нам звітність?

Коли ми використовуємо Selenium або будь-який інший інструмент автоматизації, ми виконуємо операції з веб-додатком. Але наша мета автоматизації полягає не лише в роботі тестованої програми. Ми, як тестувальник автоматизації, маємо перевірити програму, знайти помилки та повідомити про це групі розробників або вищому керівництву. Тут звітність набуває значення для програмного забезпечення Тестування процес

TestNG Звітність

TestNG бібліотека надає дуже зручну функцію звітування. Після виконання, Testng створить папку тестових результатів у корені проекту. Ця папка містить два типи звітів -

Index.html: Це повний звіт про поточне виконання, який містить таку інформацію, як помилка, групи, час, журнали звітів, testng XML-файли.

TestNG Звітність

emailable-report.html: Це підсумковий звіт поточного виконання тесту, який містить Тестовий випадок повідомлення виділено зеленим (для успішних тестів) і червоним (для невдалих тестів).

TestNG Звітність

Як налаштувати TestNG доповідь

TestNG створення звітів є досить зручним, але іноді нам потрібно менше даних у звітах або ми хочемо відобразити звіти в іншому форматі, як-от pdf, excel тощо, або хочемо змінити макет звіту.

Ми можемо налаштувати двома способами TestNG звітом

  • Використання інтерфейсу ITestListener:
  • Використання інтерфейсу IReporter:

налаштувати TestNG доповідь

Інтерфейс ITestListener

Ми використовуємо цей інтерфейс, коли нам потрібно налаштувати звіт у реальному часі. Іншими словами, якщо ми виконуємо купу тестів у пакеті TetNG і хочемо отримати звіт про кожен тест, тоді після кожного тесту нам потрібно реалізувати інтерфейс ITestListener. Цей інтерфейс замінить метод onTestFailure, onTestStart, onTestSkipped, щоб надіслати правильний статус поточного тесту.

Інтерфейс ITestListener

Ось кроки, які ми будемо виконувати

  • Створіть клас, скажімо, RealGuru99Report, і впровадьте в нього iTestListener.
  • Реалізація методів iTestListener
  • Створіть тестовий метод і додайте клас RealGuru99Report як слухач у класі Test Method.

Інтерфейс ITestListener

Приклад коду

RealGuru99TimeReport.java — це клас звітності в реальному часі. Він реалізує інтерфейс ITestListener для звітності

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 — тестовий приклад реального звіту

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

        

    }

}

Результат виглядатиме так:

Інтерфейс ITestListener

Інтерфейс IReporter

Якщо ми хочемо налаштувати остаточний звіт про тестування, створений TestNG, нам потрібно реалізувати інтерфейс IReporter. Цей інтерфейс має лише один метод реалізації generateReport. Цей метод містить всю інформацію про повне виконання тесту в списку , і ми можемо створити звіт, використовуючи його.

Приклад коду

Guru99Reporter.java — це файл, який використовується для налаштування звіту

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 — це демонстраційна версія спеціального звітування

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

    }

}

Вихід буде таким, як-

Інтерфейс IReporter

PDF та звіти електронною поштою

Наведена вище реалізація звіту є досить простою та зрозумілою, щоб ви могли розпочати налаштування звіту.

Але в корпоративному середовищі вам потрібно буде створювати налаштовані звіти. Ось сценарій, з яким ми будемо мати справу

  1. Створення індивідуального звіту у форматі PDF
  2. Робіть скріншоти ЛИШЕ при помилках. Посилання на скріншоти в PDF
  3. Надіслати PDF-файл електронною поштою

PDF-звіт виглядає так

PDF та звіти електронною поштою

Для створення звіту у форматі pdf нам знадобиться a Java API IText. Завантажте його тут . Існує ще один спеціальний клас слухача, який фактично реалізує цю банку IText і створює для нас звіт у форматі pdf. Завантажте його тут

На малюнку вище показано стандартний формат створеного звіту PDF. Ви можете налаштувати його

Ось як ми підійдемо до цього

Крок 1) Створіть базовий клас

Крок 2) Налаштуйте JypersionListerner.Java (код створення PDF)

Крок 3) Створіть TestGuru99PDFEmail.java, який виконуватиме тестові випадки, створіть PDF

Крок 4) Додайте код до TestGuru99PDFEmail.java, щоб надіслати PDF-звіт електронною поштою

Давайте розглянемо ці кроки

Крок 1) Створіть базовий клас

Цей базовий клас має функції для створення WebDriver і створення знімка екрана

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

            

    }

}

Крок 2) Налаштуйте JypersionListener.java

Ми будемо дотримуватися стандартного формату звіту. Але ми зробимо 2 налаштування

  • Додавання коду, щоб наказати JypersionListener зробити знімок екрана у разі помилки
  • Додаємо посилання на скріншот у звіті PDF

PDF та звіти електронною поштою

Додайте код, щоб прикріпити знімок екрана до звіту PDF

PDF та звіти електронною поштою

Крок 3) Створіть TestGuru99PDFEmail.java, який виконуватиме тестові випадки, створіть PDF

  • Тут ми додамо JyperionListener.class як слухача
  • Ми виконаємо 3 тести.
  • Використовуючи Assert.assertTrue, ми провалимо 2 тести, але пройдемо лише один.
  • Знімок екрана буде зроблено лише для невдалих тестів відповідно до наших налаштувань
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);

    }

Крок 4) Додайте код до TestGuru99PDFEmail.java, щоб надіслати PDF-звіт електронною поштою

  • Ми будемо використовувати анотацію @AfterSuite для надсилання електронною поштою PDF-звіту
  • Ми будемо надсилати електронні листи за допомогою Gmail
  • Щоб увімкнути електронну пошту, потрібно імпортувати багато файлів бібліотеки, наприклад mail.jar, pop3.jar, smptp.jar тощо
  • Перш ніж виконати цю дію, введіть адресу електронної пошти та пароль
 //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();

}

}

}

Завантажте повний проект тут

Примітка. Коли ми клацаємо посилання на знімок екрана в pdf, відображається діалогове вікно безпеки. Ми повинні дозволити це діалогове вікно відкривати pdf.

PDF та звіти електронною поштою

Згенерований електронний лист виглядатиме так

PDF та звіти електронною поштою

Підсумки

  • TestNG має вбудовану можливість звітування.
  • Після повного виконання тестів, TestNG створює папку тестових результатів у корені проекту.
  • У папці test-output є два основних звіти: index.html і emailable-report.html.
  • Щоб налаштувати TestNG нам потрібно реалізувати два інтерфейси, ITestListener і IReporter.
  • Якщо нам потрібно отримати звіт між виконанням, нам потрібен ITestListener.
  • Для створення остаточного звіту після повного виконання нам потрібно реалізувати IReporter.
  • Зробити скріншот, в Selenium WebDriver, нам потрібно ввести cast WebDriver до інтерфейсу TakesScreenShot.
  • Для створення pdf-звітів нам потрібно додати IText jar у проект.

Завантажити Selenium Файли проекту для демонстрації в цьому посібнику