Как создать и отправить отчет TestNG в Selenium WebDriver

Когда мы используем Selenium или любой другой инструмент автоматизации, мы выполняем операции в веб-приложении. Но целью автоматизации является не только тестирование приложения. Мы, как тестировщики, должны тестировать приложение, находить ошибки и обязательно сообщать о них команде разработчиков или вышестоящему руководству. В этот момент отчетность приобретает важное значение для процесса тестирования.

Подпишитесь на наш ТЕЛЕГРАМ КАНАЛ ПО АВТОМАТИЗАЦИИ ТЕСТИРОВАНИЯ

Отчетность TestNG

В библиотеке TestNG реализована очень удобная функция создания отчетов. После выполнения проекта Testng в его корне создается папка “test-output”. Она содержит два типа отчетов: index.html и emailable-report.html.

Index.html – это полный отчет о текущем выполнении. Он содержит такую информацию, как ошибка, группы, время, журналы отчетности, тестовые XML-файлы.

Полный отчет о текущем выполнении теста в TestNG

emailable-report.html – это сводный отчет о выполнении текущего теста. Он содержит сообщение о тест-кейсе, выделенное зеленым (для пройденного) и красным (для проваленного).

сводный отчет о выполнении текущего теста

Как настроить отчет TestNG

Отчеты TestNG достаточно удобны. Но иногда нам требуется меньше данных в отчетах, или мы хотим вывести отчеты в другом формате, например, pdf, excel и т.д., или изменить их макет.

Настроить отчет TestNG можно двумя способами:

  • Использовать интерфейс ITestListener
  • Использовать интерфейс IReporter

Интерфейс ITestListener

Мы используем этот интерфейс, когда нам нужно настроить отчет в реальном времени. Другими словами, если в наборе TestNG мы выполняем множество тест-кейсов и хотим получать отчет по каждому из них, то после каждого тест-кейса нам нужно реализовать интерфейс ITestListener. Он будет переопределять методы onTestFailure, onTestStart, onTestSkipped для отправки корректного статуса текущего тестового случая.

Реализация интерфейса ITestListener

Перечень шагов, которым мы будем следовать:

  • Создание класса RealGuru99Report и реализация в нем iTestListener
  • Реализация методов iTestListener
  • Создание тестового метода и добавление класса RealGuru99Report в качестве слушателя (listener) в класс Test Method
Создание тестового метода и добавление класса RealGuru99Report

Пример кода:

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

        

    }

    

}

RealGuru99TimeReport.java – это класс для создания отчетов в реальном времени. Он реализует интерфейс ITestListener для создания отчетов.

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

        

    }

}

Выходные данные будут выглядеть следующим образом:

Отчет, выведенный в консоль

Интерфейс IReporter

Если мы хотим настроить окончательный отчет о тестировании, созданный TestNG, нам необходимо реализовать интерфейс IReporter. Он имеет только один метод generateReport. Этот метод содержит всю информацию о полном выполнении теста в List, и мы можем сгенерировать отчет, используя его.

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 и email

Приведенная выше реализация отчета достаточно проста и понятна для того, чтобы начать работу с настройкой отчета.

Но в корпоративной среде возникает необходимость создания специализированных отчетов. Вот сценарий, с которым мы будем работать:

  1. Создать пользовательский отчет в формате PDF
  2. Делать скриншоты ТОЛЬКО при ошибках. Ссылка на скриншоты в формате PDF
  3. Отправить PDF-файл по электронной почте

Отчет в формате PDF выглядит следующим образом:

Отчет в формате PDF в TestNG

Чтобы создать отчет в формате PDF, нам понадобится Java API IText. Скачать его можно здесь. Cуществует еще один пользовательский класс слушателя, который фактически реализует этот jar-файл 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

Мы будем придерживаться стандартного формата отчета, но добавим пару функций:

  • Добавление кода, указывающего JypersionListener делать скриншот при ошибке.
  • Прикрепление ссылки на скриншот, сделанный в PDF-отчете.
Скриншот кода

Добавьте код для прикрепления снимка экрана к PDF-отчету:

Скриншот кода

Шаг 3. Создание файла TestGuru99PDFEmail.java

  • Здесь мы добавим JyperionListener.class в качестве слушателя.
  • Выполним 3 тестовых случая.
  • Используя Assert.assertTrue, мы провалим два теста, а пройдем только один.
  • Снимки экрана будут сделаны только для неудачных тестовых случаев в соответствии с нашими настройками.
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("http://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-файл

Сформированное таким образом письмо будет выглядеть так:

Результат - сформированное письмо

Итоги

  • TestNG имеет встроенную возможность создания отчетов.
  • После полного выполнения тестовых примеров TestNG генерирует папку test-output в корне проекта.
  • В папке test-output находятся два основных отчета – index.html и emailable-report.html.
  • Для настройки отчета TestNG нам необходимо реализовать два интерфейса – ITestListener и IReporter.
  • Если нам нужно получить отчет в промежутке между выполнением, мы используем ITestListener.
  • Для создания итогового отчета после полного выполнения мы реализуем IReporter.
  • Для получения снимка экрана в Selenium WebDriver необходимо набрать cast WebDriver в интерфейс TakesScreenShot.
  • Для генерации отчетов в формате pdf нам необходимо добавить в проект jar IText.

Перевод статьи «Customize, PDF & Email TestNG Reports in Selenium WebDriver».

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *