Personalizar, PDF y correo electrónico TestNG Informes en Selenium Controlador web
Antes de analizar cualquier otra cosa, primero comprendamos:
¿Por qué necesitamos informes?
Cuando estamos usando Selenium o cualquier otra herramienta de automatización, estamos realizando operaciones en la aplicación web. Pero nuestro propósito de la automatización no es solo ejercitar la aplicación bajo prueba. Nosotros, como probadores de automatización, se supone que debemos probar la aplicación, encontrar errores e informarlo al equipo de desarrollo o a la alta dirección. Aquí los informes adquieren importancia para el software. Pruebas
TestNG Informes
TestNG La biblioteca proporciona una función de informes muy útil. Después de la ejecución, Prueba generará una carpeta de salida de prueba en la raíz del proyecto. Esta carpeta contiene dos tipos de informes:
Índice.html: Este es el informe completo de la ejecución actual que contiene información como errores, grupos, tiempo, registros de reporteros y archivos XML de prueba.
informe-enviable-por-correo.html: Este es el informe resumido de la ejecución de la prueba actual que contiene Caso de prueba mensaje resaltado en verde (para casos de prueba aprobados) y rojo (para casos de prueba fallidos).
Cómo personalizar TestNG Informes
TestNG Los informes son bastante útiles, pero aún así, a veces necesitamos menos datos en los informes o queremos mostrarlos en algún otro formato como PDF, Excel, etc. o queremos cambiar el diseño del informe.
Puede haber dos formas en que podemos personalizar TestNG (reporte)
- Usando la interfaz ITestListener:
- Usando la interfaz IReporter:
Interfaz ITestListener
Usamos esta interfaz cuando necesitamos personalizar el informe en tiempo real. En otras palabras, si estamos ejecutando un conjunto de casos de prueba en una suite TetNG y queremos obtener el informe de cada caso de prueba, luego de cada caso de prueba debemos implementar la interfaz ITestListener. Esta interfaz anulará los métodos onTestFailure, onTestStart y onTestSkipped para enviar el estado correcto del caso de prueba actual.
Estos son los pasos que seguiremos.
- Cree una clase, digamos RealGuru99Report e implemente iTestListener en ella.
- Implementar métodos de iTestListener
- Cree un método de prueba y agregue la clase RealGuru99Report como oyente en la clase Método de prueba.
Ejemplo de código
RealGuru99TimeReport.java es la clase de informes en tiempo real. Implementará la interfaz ITestListener para informes.
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 es el caso de prueba para un informe real
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(){ } }
La salida se verá así:
Interfaz IReporter
Si queremos personalizar el informe de prueba final generado por TestNG, necesitamos implementar la interfaz IReporter. Esta interfaz tiene solo un método para implementar generateReport. Este método tiene toda la información de una ejecución de prueba completa en la Lista , y podemos generar el informe usándolo.
Ejemplo de código
Guru99Reporter.java es el archivo utilizado para personalizar el informe.
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 es una demostración de informes personalizados
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); } }
La salida será como-
Informes en formato PDF y correo electrónico
La implementación del informe anterior es bastante simple y clara para comenzar con la personalización del informe.
Pero en un entorno corporativo, necesitarás crear informes altamente personalizados. Este es el escenario con el que nos ocuparemos.
- Crear informe personalizado en formato PDF
- Tome capturas de pantalla SÓLO en caso de errores. Enlace a capturas de pantalla en PDF
- Enviar correo electrónico del PDF
El informe en PDF se ve así
Para crear un informe en PDF necesitamos un Java API Yo texteo. Descargalo aquí . Hay otra clase de escucha personalizada que en realidad está implementando este jar de IText y creando un informe en PDF para nosotros. Descargalo aquí
La figura anterior muestra el formato predeterminado del informe PDF generado. Puedes personalizarlo
Así es como abordaremos esto
Paso 1) Crear una clase base
Paso 2) Personaliza JypersionListerner.Java (Código de creación PDF)
Paso 3) Cree un TestGuru99PDFEmail.java que ejecutará casos de prueba y creará PDF
Paso 4) Agregue código a TestGuru99PDFEmail.java para enviar un informe en PDF por correo electrónico
Analicemos estos pasos
Paso 1) Crear clase base
Esta clase base tiene funciones para crear WebDriver y tomar captura de pantalla.
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); } }
Paso 2) Personaliza JypersionListener.java
Nos quedaremos con el formato de informe predeterminado. Pero haremos 2 personalizaciones.
- Agregar código para indicarle a JypersionListener que tome una captura de pantalla en caso de error
- Adjuntando el enlace de la captura de pantalla del informe en PDF
Agregue código para adjuntar la captura de pantalla al informe PDF
Paso 3) Cree un TestGuru99PDFEmail.java que ejecutará casos de prueba y creará PDF
- Aquí agregaremos JyperionListener.class como oyente.
- Ejecutaremos 3 casos de prueba.
- Al usar Assert.assertTrue, fallaremos en 2 casos de prueba y solo aprobaremos uno.
- Se tomarán capturas de pantalla para los casos de prueba fallidos solo según nuestras personalizaciones.
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); }
Paso 4) Agregue código a TestGuru99PDFEmail.java para enviar un informe en PDF por correo electrónico
- Usaremos la anotación @AfterSuite para enviar el informe PDF por correo electrónico
- Enviaremos correos electrónicos mediante Gmail.
- Para habilitar el correo electrónico, es necesario importar muchos archivos de biblioteca como mail.jar, pop3.jar, smptp.jar, etc.
- Antes de ejecutar esto, ingrese la dirección de correo electrónico del remitente y del destinatario y la contraseña.
//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(); } } }
Descarga el proyecto completo aquí
Nota: Cuando hacemos clic en el enlace de la captura de pantalla en pdf, se muestra el cuadro de diálogo de seguridad. Tenemos que permitir que este cuadro de diálogo se abra en formato PDF.
El correo electrónico generado tendrá este aspecto
Resumen
- TestNG tiene una capacidad de generación de informes incorporada.
- Después de una ejecución completa de los casos de prueba, TestNG genera una carpeta de salida de prueba en la raíz del proyecto.
- En la carpeta de salida de prueba, hay dos informes principales, index.html y emailable-report.html.
- Personalizar TestNG informe necesitamos implementar dos interfaces, ITestListener e IReporter.
- Si necesitamos obtener un informe entre ejecuciones, necesitamos ITestListener.
- Para crear un informe final después de la ejecución completa, necesitamos implementar IReporter.
- Tomando la captura de pantalla, en Selenium WebDriver, debemos escribir transmitir WebDriver a la interfaz TakesScreenShot.
- Para generar informes en PDF necesitamos agregar IText jar en el proyecto.
Descargue nuestra Selenium Archivos de proyecto para la demostración en este tutorial