Когда мы используем Selenium или любой другой инструмент автоматизации, мы выполняем операции в веб-приложении. Но целью автоматизации является не только тестирование приложения. Мы, как тестировщики, должны тестировать приложение, находить ошибки и обязательно сообщать о них команде разработчиков или вышестоящему руководству. В этот момент отчетность приобретает важное значение для процесса тестирования.
Подпишитесь на наш ТЕЛЕГРАМ КАНАЛ ПО АВТОМАТИЗАЦИИ ТЕСТИРОВАНИЯ
Отчетность TestNG
В библиотеке TestNG реализована очень удобная функция создания отчетов. После выполнения проекта Testng в его корне создается папка «test-output». Она содержит два типа отчетов: index.html и emailable-report.html.
Index.html — это полный отчет о текущем выполнении. Он содержит такую информацию, как ошибка, группы, время, журналы отчетности, тестовые XML-файлы.

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

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

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

Пример кода:
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);
}
}
Выходные данные будут выглядеть следующим образом:

Отчеты в формате PDF и email
Приведенная выше реализация отчета достаточно проста и понятна для того, чтобы начать работу с настройкой отчета.
Но в корпоративной среде возникает необходимость создания специализированных отчетов. Вот сценарий, с которым мы будем работать:
- Создать пользовательский отчет в формате PDF
- Делать скриншоты ТОЛЬКО при ошибках. Ссылка на скриншоты в формате PDF
- Отправить PDF-файл по электронной почте
Отчет в формате PDF выглядит следующим образом:

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

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

Итоги
- 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».
