Antes de analizar cualquier otra cosa, primero comprendamos:
¿Por qué necesitamos informes?
Cuando usamos 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. Se supone que nosotros, como probadores de automatización, debemos probar la aplicación, encontrar errores y reportarlos al equipo de desarrollo oa la gerencia superior. Aquí los informes adquieren importancia para el proceso de prueba de software
Informes de TestNG
La biblioteca TestNG proporciona una función de informes muy útil. Después de la ejecución, Testng generará una carpeta de salida de prueba en la raíz del proyecto. Esta carpeta contiene dos tipos de informes:
Index.html: este es el informe completo de la ejecución actual que contiene información como un error, grupos, hora, registros del reportero, archivos XML de prueba.
emailable-report.html: este es el informe resumido de la ejecución de la prueba actual que contiene un mensaje de caso de prueba en verde (para casos de prueba aprobados) y resaltado en rojo (para casos de prueba fallidos).
Cómo personalizar el informe TestNG
Los informes de TestNG son bastante útiles, pero aún así, a veces necesitamos menos datos en los informes o queremos mostrar los informes en algún otro formato como pdf, excel, etc. o queremos cambiar el diseño del informe.
Puede haber dos formas de personalizar el informe de TestNG
- Usando la interfaz ITestListener:
- Usando la interfaz de IReporter:
Interfaz ITestListener
Usamos esta interfaz cuando necesitamos personalizar el informe en tiempo real. En otras palabras, si estamos ejecutando el grupo de casos de prueba en una suite TetNG y queremos obtener el informe de cada caso de prueba, luego de cada caso de prueba necesitamos implementar la interfaz ITestListener. Esta interfaz anulará el método onTestFailure, onTestStart, onTestSkipped para enviar el estado correcto del caso de prueba actual.
Estos son los pasos que seguiremos
- Cree una clase que diga RealGuru99Report e implemente iTestListener en ella.
- Implementar métodos de iTestListener
- Cree el 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.
paquete testNGReport.realTimeReport;import org.testng.ITestContext;import org.testng.ITestListener;import org.testng.ITestResult;La clase pública RealGuru99TimeReport implementa ITestListener {@Anularpublic void onStart (ITestContext arg0) {System.out.println ("Inicio de ejecución (PRUEBA) ->" + arg0.getName ());}@Anularpublic void onTestStart (ITestResult arg0) {System.out.println ("Prueba iniciada ->" + arg0.getName ());}@Anularpublic void onTestSuccess (ITestResult arg0) {System.out.println ("Prueba aprobada ->" + arg0.getName ());}@Anularpublic void onTestFailure (ITestResult arg0) {System.out.println ("Prueba fallida ->" + arg0.getName ());}@Anularpublic void onTestSkipped (ITestResult arg0) {System.out.println ("Prueba omitida ->" + arg0.getName ());}@Anularpublic void onFinish (ITestContext arg0) {System.out.println ("FIN de ejecución (PRUEBA) ->" + arg0.getName ());}@Anularpublic void onTestFailedButWithinSuccessPercentage (ITestResult arg0) {// TODO código auxiliar de método generado automáticamente}}
TestGuru99RealReport.java es el caso de prueba para un informe real
paquete testNGReport.realTimeReport;import org.testng.Assert;import org.testng.annotations.Listeners;import org.testng.annotations.Test;@Listeners (RealGuru99TimeReport.class)clase pública TestGuru99RealReport {@PruebatestRealReportOne public void () {Assert.assertTrue (verdadero);}@PruebatestRealReportTwo público void () {Assert.assertTrue (falso);}// El caso de prueba depende del caso de prueba fallido = testRealReportTwo@Test (dependsOnMethods = "testRealReportTwo")public void testRealReportThree () {}}
La salida se verá como-
Interfaz de IReporter
Si queremos personalizar el informe de prueba final generado por TestNG, necesitamos implementar la interfaz IReporter. Esta interfaz solo tiene un método para implementar generateReport. Este método tiene toda la información de una ejecución de prueba completa en el List
Ejemplo de código
Guru99Reporter.java es el archivo utilizado para personalizar el informe
paquete 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 implementa IReporter {@Anularpublic void generateReport (Listarg0, List arg1,String outputDirectory) {// El segundo parámetro de este método ISuite contendrá toda la suite ejecutada.para (ISuite iSuite: arg1) {// Obtenga un mapa del resultado de una sola suite a la vezMap resultados = iSuite.getResults ();// Obtener la clave del mapa de resultadosEstablecer teclas = results.keySet ();// Ir a cada valor de mapa uno por unopara (clave de cadena: claves) {// El objeto de contexto del resultado actualITestContext context = results.get (clave) .getTestContext ();// Detalle de Print Suite en ConsoleSystem.out.println ("Nombre de la suite ->" + context.getName ()+ ":: Informe de salida Ditectory ->" + context.getOutputDirectory ()+ ":: Nombre de la suite ->" + context.getSuite (). GetName ()+ ":: Fecha de inicio Hora de ejecución ->" + context.getStartDate ()+ ":: Fecha de finalización Hora de ejecución ->" + context.getEndDate ());// Obtener mapa solo para casos de prueba fallidosIResultMap resultMap = context.getFailedTests ();// Obtener detalles del método de casos de prueba fallidosColección failedMethods = resultMap.getAllMethods ();// Repite uno por uno en todos los métodos fallidosSystem.out.println ("-------- CASO DE PRUEBA FALLIDO ---------");para (ITestNGMethod iTestNGMethod: failureMethods) {// Imprimir detalles de casos de prueba fallidosSystem.out.println ("NOMBRE DEL CASO DE PRUEBA ->" + iTestNGMethod.getMethodName ()+ "\ nDescripción ->" + iTestNGMethod.getDescription ()+ "\ nPrioridad ->" + iTestNGMethod.getPriority ()+ "\ n: Fecha ->" + nueva fecha (iTestNGMethod.getDate ()));}}}}}
TestGuru99ForReporter.java es una demostración para informes personalizados
paquete testNGReport.iReporterReport;import org.testng.Assert;import org.testng.annotations.Listeners;import org.testng.annotations.Test;// Agregar oyente para escuchar el informe y escribirlo cuando termine la prueba@Listeners (valor = Guru99Reporter.class)clase pública TestGuru99ForReporter {@Test (prioridad = 0, descripción = "testReporterOne")public void testReporterOne () {// Pasar caso de pruebaAssert.assertTrue (verdadero);}@Test (prioridad = 1, descripción = "testReporterTwo")public void testReporterTwo () {// Caso de prueba fallidaAssert.assertTrue (falso);}}
La salida será como-
PDF y correo electrónico de informes
La implementación del informe anterior es bastante simple y clara para comenzar con la personalización del informe.
Pero en un entorno corporativo, deberá crear informes altamente personalizados. Este es el escenario con el que nos ocuparemos.
- Crear informe personalizado en formato PDF
- Tome capturas de pantalla SOLAMENTE en caso de errores. Enlace a capturas de pantalla en PDF
- Enviar correo electrónico del PDF
El informe en PDF tiene este aspecto
Para crear un informe en pdf, necesitamos una API IText de Java . Descarguelo aqui . Hay otra clase de escucha personalizada que en realidad está implementando este jar de IText y creando un informe en PDF para nosotros. Descarguelo aqui
La figura anterior muestra el formato predeterminado del informe PDF generado. Puedes personalizarlo
Así es como abordaremos esto
Paso 1) Cree una clase base
Paso 2) Personalice JypersionListerner.Java (código de creación de PDF)
Paso 3) Cree un TestGuru99PDFEmail.java que ejecutará casos de prueba, creará PDF
Paso 4) Agregue el código a TestGuru99PDFEmail.java para enviar un informe en PDF por correo electrónico
Veamos estos pasos
Paso 1) Crear clase base
Esta clase base tiene funciones para crear WebDriver y tomar captura de pantalla
paquete PDFEmail;import java.io.File;import org.apache.commons.io.FileUtils;import org.openqa.selenium.OutputType;import org.openqa.selenium.TakesScreenshot;importar org.openqa.selenium.WebDriver;importar org.openqa.selenium.firefox.FirefoxDriver;clase pública BaseClass {controlador WebDriver estático;public static WebDriver getDriver () {si (controlador == nulo) {Controlador WebDriver;System.setProperty ("webdriver.gecko.driver", "C: \\ geckodriver.exe");controlador = nuevo FirefoxDriver ();}conductor de regreso;}/ *** Esta función tomará una captura de pantalla* @param webdriver* @param fileWithPath* @throws Exception* /public static void takeSnapShot (WebDriver webdriver, String fileWithPath) lanza Exception {// Convertir el objeto del controlador web en TakeScreenshotTakesScreenshot scrShot = ((TakesScreenshot) controlador web);// Llamar al método getScreenshotAs para crear un archivo de imagenArchivo SrcFile = scrShot.getScreenshotAs (OutputType.FILE);// Mover el archivo de imagen a un nuevo destinoArchivo DestFile = nuevo archivo (fileWithPath);// Copiar archivo en destinoFileUtils.copyFile (SrcFile, DestFile);}}
Paso 2) Personaliza JypersionListener.java
Seguiremos con el formato de informe predeterminado. Pero haremos 2 personalizaciones.
- Agregar código para indicar a JypersionListener que tome una captura de pantalla en caso de error
- Adjuntando el enlace de la captura de pantalla en el informe en PDF
Agregue código para adjuntar la captura de pantalla al informe en PDF
Paso 3) Cree un TestGuru99PDFEmail.java que ejecutará casos de prueba, creará PDF
- Aquí agregaremos JyperionListener.class como oyente
- Ejecutaremos 3 casos de prueba.
- Usando Assert.assertTrue fallaremos 2 casos de prueba mientras pasamos solo uno.
- Se tomarán capturas de pantalla para los casos de prueba fallidos solo según nuestras personalizaciones
paquete 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;importar 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;// Agregar oyente para la generación de informes en PDF@Listeners (JyperionListener.class)La clase pública TestGuru99PDFReport extiende BaseClass {Controlador WebDriver;// El caso de prueba falló, por lo que se genera una captura de pantalla@PruebatestPDFReportOne public void () {controlador = BaseClass.getDriver ();driver.get ("http://google.com");Assert.assertTrue (falso);}// El caso de prueba falló, por lo que se genera una captura de pantalla@PruebatestPDFReporTwo público vacío () {controlador = BaseClass.getDriver ();driver.get ("http: /guru99.com");Assert.assertTrue (falso);}// El caso de prueba se aprobará, por lo que no habrá captura de pantalla@PruebatestPDFReportThree public void () {controlador = BaseClass.getDriver ();driver.get ("http://demo.guru99.com");Assert.assertTrue (verdadero);}
Paso 4) Agregue el código a TestGuru99PDFEmail.java para enviar un informe en PDF por correo electrónico
- Usaremos la anotación @AfterSuite para enviar por correo electrónico el informe en PDF
- Enviaremos un correo electrónico a través de Gmail.
- Para habilitar el correo electrónico, necesita 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 y la contraseña desde, hasta
// Después de la ejecución completa enviar informe en pdf por correo electrónico@DespuésSuitepublic void tearDown () {sendPDFReportByGMail (" Esta dirección de correo electrónico está protegida contra spambots. Necesita activar JavaScript para visualizarla.", "contraseña", "This email address is being protected from spambots. You need JavaScript enabled to view it.", "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, muestra un cuadro de diálogo de seguridad. Tenemos que permitir que este diálogo abra el pdf.
El correo electrónico así generado se verá así
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.
- Para personalizar el informe de TestNG, necesitamos implementar dos interfaces, ITestListener e IReporter.
- Si necesitamos obtener un informe entre ejecución, 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, necesitamos escribir Cast WebDriver a la interfaz TakesScreenShot.
- Para generar informes en pdf, debemos agregar el jar de IText en el proyecto.
Descargue los archivos de proyecto de Selenium para la demostración en este tutorial