Personnaliser, PDF et e-mail TestNG Rapports dans Selenium pilote web
Avant d’examiner autre chose, comprenons d’abord :
Pourquoi avons-nous besoin de rapports ?
Lorsque nous utilisons Selenium ou tout autre outil d'automatisation, nous effectuons des opérations sur l'application web. Mais notre objectif en matière d’automatisation n’est pas seulement d’exercer l’application sous test. En tant que testeur d'automatisation, nous sommes censés tester l'application, détecter les bogues et les signaler à l'équipe de développement ou à la direction supérieure. Ici, le reporting prend de l'importance pour les logiciels Contrôle de qualité processus
TestNG Reporting
TestNG La bibliothèque fournit une fonctionnalité de reporting très pratique. Après exécution, Tester générera un dossier de sortie de test à la racine du projet. Ce dossier contient deux types de rapports :
Index.html : Il s'agit du rapport complet de l'exécution en cours qui contient des informations telles qu'une erreur, des groupes, l'heure, les journaux du rapporteur, les fichiers XML de test.
rapport-e-mailable.html : Il s'agit du rapport récapitulatif de l'exécution du test en cours qui contient Cas de test message en vert (pour les cas de test réussis) et en rouge (pour les cas de test échoués).
Comment personnaliser TestNG Signaler
TestNG les rapports sont assez pratiques, mais nous avons parfois besoin de moins de données dans les rapports ou souhaitons afficher les rapports dans un autre format comme PDF, Excel, etc. ou souhaitons modifier la mise en page du rapport.
Il peut y avoir deux façons de personnaliser TestNG (ici)
- Utilisation de l'interface ITestListener :
- Utilisation de l'interface IReporter :
Interface ITestListener
Nous utilisons cette interface lorsque nous devons personnaliser un rapport en temps réel. En d'autres termes, si nous exécutons un ensemble de scénarios de test dans une suite TetNG et que nous souhaitons obtenir le rapport de chaque scénario de test, alors après chaque scénario de test, nous devons implémenter l'interface ITestListener. Cette interface remplacera les méthodes onTestFailure, onTestStart, onTestSkipped pour envoyer l'état correct du scénario de test en cours.
Voici les étapes que nous suivrons
- Créez une classe, par exemple RealGuru99Report, et implémentez-y iTestListener.
- Implémenter les méthodes d'iTestListener
- Créez une méthode de test et ajoutez la classe RealGuru99Report en tant qu'écouteur dans la classe Méthode de test.
Exemple de code
RealGuru99TimeReport.java est la classe de reporting en temps réel. Il implémentera l'interface ITestListener pour les rapports
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 est le scénario de test pour un rapport réel
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 sortie ressemblera à-
Interface IRReporter
Si nous souhaitons personnaliser le rapport de test final généré par TestNG, nous devons implémenter l'interface IReporter. Cette interface n'a qu'une seule méthode pour implémenter generateReport. Cette méthode contient toutes les informations d'une exécution de test complète dans la liste , et nous pouvons générer le rapport en l'utilisant.
Exemple de code
Guru99Reporter.java est le fichier utilisé pour personnaliser le rapport
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 est une démo pour les rapports personnalisés
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 sortie sera comme-
PDF et e-mail des rapports
La mise en œuvre du rapport ci-dessus est assez simple et claire pour vous permettre de démarrer avec la personnalisation des rapports.
Mais dans un environnement d’entreprise, vous devrez créer des rapports hautement personnalisés. Voici le scénario auquel nous allons faire face
- Créer un rapport personnalisé sous forme PDF
- Prenez des captures d'écran UNIQUEMENT sur les erreurs. Lien vers les captures d'écran en PDF
- Envoyer le PDF par email
Le rapport PDF ressemble à ceci
Pour créer un rapport PDF, nous avons besoin d'un Java API Je Texte. Télécharge le ici . Il existe une autre classe d'écoute personnalisée qui implémente actuellement ce pot IText et crée un rapport PDF pour nous. Télécharge le ici
La figure ci-dessus montre le format par défaut du rapport PDF généré. Vous pouvez le personnaliser
Voici comment nous allons aborder cela
Étape 1) Créer une classe de base
Étape 2) Personnalisez JypersionListerner.Java (Code de création PDF)
Étape 3) Créez un TestGuru99PDFEmail.java qui exécutera les cas de test, créera un PDF
Étape 4) Ajoutez le code à TestGuru99PDFEmail.java pour envoyer le rapport PDF par e-mail
Examinons ces étapes
Étape 1) Créer une classe de base
Cette classe de base a des fonctions pour créer WebDriver et prendre une capture d'écran
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); } }
Étape 2) Personnaliser JypersionListener.java
Nous nous en tiendrons au format de rapport par défaut. Mais nous ferons 2 personnalisations
- Ajout de code pour demander à JypersionListener de prendre une capture d'écran en cas d'erreur
- Joindre le lien de la capture d'écran prise dans le rapport PDF
Ajouter du code pour joindre la capture d'écran au rapport PDF
Étape 3) Créez un TestGuru99PDFEmail.java qui exécutera les cas de test, créera un PDF
- Ici, nous ajouterons JyperionListener.class comme auditeur
- Nous exécuterons 3 cas de test.
- En utilisant Assert.assertTrue, nous échouerons à 2 cas de test en n'en réussissant qu'un seul.
- Une capture d'écran sera prise pour les cas de test ayant échoué uniquement selon nos personnalisations
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); }
Étape 4) Ajoutez le code à TestGuru99PDFEmail.java pour envoyer le rapport PDF par e-mail
- Nous utiliserons l'annotation @AfterSuite pour envoyer par email le rapport PDF
- Nous enverrons des e-mails via Gmail
- Pour activer le courrier électronique, vous devez importer de nombreux fichiers de bibliothèque tels que mail.jar, pop3.jar, smptp.jar, etc.
- Avant d'exécuter ceci, entrez l'adresse e-mail de, l'adresse e-mail et le mot de passe.
//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(); } } }
Téléchargez le projet complet ici
Remarque : lorsque nous cliquons sur le lien de la capture d'écran en pdf, la boîte de dialogue de sécurité s'affiche. Nous devons autoriser cette boîte de dialogue à ouvrir le pdf.
L'email ainsi généré ressemblera à ceci
Résumé
- TestNG a une capacité de reporting intégrée.
- Après une exécution complète des cas de tests, TestNG génère un dossier de sortie de test à la racine du projet.
- Dans le dossier test-output, il existe deux rapports principaux, index.html et emailable-report.html.
- Customiser TestNG rapport, nous devons implémenter deux interfaces, ITestListener et IReporter.
- Si nous avons besoin d'obtenir un rapport entre l'exécution, nous avons besoin d'ITestListener.
- Pour créer un rapport final après une exécution complète, nous devons implémenter IReporter.
- Prendre la capture d'écran, dans Selenium WebDriver, nous devons taper WebDriver vers l'interface TakesScreenShot.
- Pour générer des rapports PDF, nous devons ajouter un pot IText dans le projet.
Télécharger Selenium Fichiers de projet pour la démo de ce didacticiel