Когда мы используем 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».