Avant d'examiner quoi que ce soit d'autre, 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 d'automatisation n'est pas seulement d'exercer l'application en cours de test. En tant que testeur d'automatisation, nous sommes censés tester l'application, trouver les bogues et les signaler à l'équipe de développement ou à la direction supérieure. Ici, le rapport prend de l'importance pour le processus de test logiciel
Rapports TestNG
La bibliothèque TestNG fournit une fonction de rapport très pratique. Après l'exécution, Testng 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, des journaux de rapporteurs, des fichiers XML de test.
emailable-report.html: il s'agit du rapport de synthèse de l'exécution du test en cours qui contient un message de scénario de test en surbrillance verte (pour les cas de test réussis) et rouge (pour les cas de test ayant échoué).
Comment personnaliser le rapport TestNG
Les rapports TestNG 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 le rapport TestNG
- Utilisation de l'interface ITestListener:
- Utilisation de l'interface IReporter:
Interface ITestListener
Nous utilisons cette interface lorsque nous avons besoin de personnaliser le rapport en temps réel. En d'autres termes, si nous exécutons le tas de cas de test dans une suite TetNG et que nous voulons obtenir le rapport de chaque cas de test, alors après chaque cas 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 actuel.
Voici les étapes que nous suivrons
- Créez une classe dite RealGuru99Report et implémentez iTestListener dedans.
- Implémenter les méthodes de 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 rapport en temps réel. Il implémentera l'interface ITestListener pour la création de rapports
package testNGReport.realTimeReport;import org.testng.ITestContext;import org.testng.ITestListener;import org.testng.ITestResult;Public class RealGuru99TimeReport implémente ITestListener {@Passer outrepublic void onStart (ITestContext arg0) {System.out.println ("Début de l'exécution (TEST) ->" + arg0.getName ());}@Passer outrepublic void onTestStart (ITestResult arg0) {System.out.println ("Test démarré ->" + arg0.getName ());}@Passer outrepublic void onTestSuccess (ITestResult arg0) {System.out.println ("Test réussi ->" + arg0.getName ());}@Passer outrepublic void onTestFailure (ITestResult arg0) {System.out.println ("Le test a échoué ->" + arg0.getName ());}@Passer outrepublic void onTestSkipped (ITestResult arg0) {System.out.println ("Test ignoré ->" + arg0.getName ());}@Passer outrepublic void onFinish (ITestContext arg0) {System.out.println ("FIN D'exécution (TEST) ->" + arg0.getName ());}@Passer outrepublic void onTestFailedButWithinSuccessPercentage (ITestResult arg0) {// TODO Stub de méthode généré automatiquement}}
TestGuru99RealReport.java est le cas 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 {@Testpublic void testRealReportOne () {Assert.assertTrue (vrai);}@Testpublic void testRealReportTwo () {Assert.assertTrue (faux);}// Le cas de test dépend de l'échec du testcase = testRealReportTwo@Test (dependOnMethods = "testRealReportTwo")public void testRealReportThree () {}}
La sortie ressemblera à-
Interface IReporter
Si nous voulons 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 List
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 implémente IReporter {@Passer outrepublic void generateReport (Listearg0, Liste arg1,String outputDirectory) {// Deuxième paramètre de cette méthode ISuite contiendra toute la suite exécutée.pour (ISuite iSuite: arg1) {// Obtenir une carte du résultat d'une seule suite à la foisMap résultats = iSuite.getResults ();// Récupère la clé de la carte de résultatSet keys = results.keySet ();// Aller à chaque valeur de carte une par unefor (String key: keys) {// L'objet Contexte du résultat courantITestContext context = results.get (clé) .getTestContext ();// Détails de Print Suite dans la consoleSystem.out.println ("Nom de la suite ->" + context.getName ()+ ":: Sortie du rapport Ditectory ->" + context.getOutputDirectory ()+ ":: Nom de la suite ->" + context.getSuite (). GetName ()+ ":: Date de début Heure d'exécution ->" + context.getStartDate ()+ ":: Date de fin Heure d'exécution ->" + context.getEndDate ());// Obtenir la carte uniquement pour les cas de test ayant échouéIResultMap resultMap = context.getFailedTests ();// Récupère le détail de la méthode des cas de test ayant échouéCollection failedMethods = resultMap.getAllMethods ();// Boucle une par une dans toutes les méthodes ayant échouéSystem.out.println ("-------- CAS DE TEST ECHEC ---------");for (ITestNGMethod iTestNGMethod: failedMethods) {// Imprimer le détail des cas de test ayant échouéSystem.out.println ("NOM DU TESTCASE ->" + iTestNGMethod.getMethodName ()+ "\ nDescription ->" + iTestNGMethod.getDescription ()+ "\ nPriority ->" + iTestNGMethod.getPriority ()+ "\ n: Date ->" + nouvelle 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;// Ajout d'un auditeur pour écouter le rapport et l'écrire une fois les tests terminés@Listeners (valeur = Guru99Reporter.class)public class TestGuru99ForReporter {@Test (priorité = 0, description = "testReporterOne")public void testReporterOne () {// Réussir le cas de testAssert.assertTrue (vrai);}@Test (priorité = 1, description = "testReporterTwo")public void testReporterTwo () {// Cas de test d'échecAssert.assertTrue (faux);}}
La sortie sera comme-
PDF et e-mail des rapports
L'implémentation du rapport ci-dessus est assez simple et claire pour vous aider à démarrer avec la personnalisation du rapport.
Mais dans un environnement d'entreprise, vous devrez créer des rapports hautement personnalisés. Voici le scénario que nous allons traiter
- Créer un rapport personnalisé au format PDF
- Prenez des captures d'écran UNIQUEMENT en cas d'erreurs. Lien vers les captures d'écran en PDF
- Envoyer un e-mail du PDF
Le rapport PDF ressemble à ceci
Pour créer un rapport PDF, nous avons besoin d'une API Java IText . Télécharger les ici . Il existe une autre classe d'écoute personnalisée qui implémente en fait ce jar IText et crée un rapport PDF pour nous. Télécharger les 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 des cas de test, créez un PDF
Étape 4) Ajoutez le code à TestGuru99PDFEmail.java pour envoyer un rapport PDF par e-mail
Regardons 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 {pilote WebDriver statique;public static WebDriver getDriver () {if (pilote == null) {Pilote WebDriver;System.setProperty ("webdriver.gecko.driver", "C: \\ geckodriver.exe");pilote = nouveau FirefoxDriver ();}retour chauffeur;}/ *** Cette fonction prendra une capture d'écran* @param webdriver* @param fileWithPath* @throws Exception* /public static void takeSnapShot (WebDriver webdriver, String fileWithPath) lève l'exception {// Convertit l'objet pilote Web en TakeScreenshotTakesScreenshot scrShot = ((TakesScreenshot) Webdriver);// Appelez la méthode getScreenshotAs pour créer un fichier imageFichier SrcFile = scrShot.getScreenshotAs (OutputType.FILE);// Déplacer le fichier image vers une nouvelle destinationFichier DestFile = nouveau fichier (fileWithPath);// Copier le fichier à destinationFileUtils.copyFile (SrcFile, DestFile);}}
Étape 2) Personnalisez JypersionListener.java
Nous nous en tiendrons au format de rapport par défaut. Mais nous allons faire 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 dans le rapport PDF
Ajoutez un code pour joindre la capture d'écran au rapport PDF
Étape 3) Créez un TestGuru99PDFEmail.java qui exécutera des cas de test, créez un PDF
- Ici, nous allons ajouter JyperionListener.class en tant qu'auditeur
- Nous exécuterons 3 cas de test.
- En utilisant Assert.assertTrue, nous échouerons 2 cas de test en n'en passant qu'un.
- 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;// Ajout d'un auditeur pour la génération de rapport pdf@Listeners (JyperionListener.class)public class TestGuru99PDFReport étend BaseClass {Pilote WebDriver;// Le test a échoué, donc la capture d'écran est générée@Testpublic void testPDFReportOne () {pilote = BaseClass.getDriver ();driver.get ("http://google.com");Assert.assertTrue (faux);}// Le test a échoué, donc la capture d'écran est générée@Testpublic void testPDFReporTwo () {pilote = BaseClass.getDriver ();driver.get ("http: /guru99.com");Assert.assertTrue (faux);}// Le cas de test sera réussi, donc pas de capture d'écran dessus@Testpublic void testPDFReportThree () {pilote = BaseClass.getDriver ();driver.get ("http://demo.guru99.com");Assert.assertTrue (vrai);}
Étape 4) Ajoutez le code à TestGuru99PDFEmail.java pour envoyer un rapport PDF par e-mail
- Nous utiliserons l'annotation @AfterSuite pour envoyer un e-mail du rapport PDF
- Nous enverrons un e-mail à l'aide de 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 cela, entrez l'adresse e-mail et le mot de passe de, à
// Après exécution complète envoyer le rapport pdf par email@AfterSuitepublic void tearDown () {sendPDFReportByGMail (" Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.", "password", "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(); } } }
Téléchargez le projet complet ici
Remarque: lorsque nous cliquons sur le lien de capture d'écran en pdf, il affiche une boîte de dialogue de sécurité. Nous devons autoriser cette boîte de dialogue à ouvrir le pdf.
L'e-mail 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 test, TestNG génère un dossier de sortie de test à la racine du projet.
- Dans le dossier test-output, il y a deux rapports principaux, index.html et emailable-report.html.
- Pour personnaliser le rapport TestNG, nous devons implémenter deux interfaces, ITestListener et IReporter.
- Si nous avons besoin d'un rapport entre les exécutions, nous avons besoin d'ITestListener.
- Pour créer un rapport final après une exécution complète, nous devons implémenter IReporter.
- En prenant la capture d'écran, dans Selenium WebDriver, nous devons taper cast WebDriver vers l'interface TakesScreenShot.
- Pour générer des rapports PDF, nous devons ajouter IText jar dans le projet.
Téléchargez les fichiers de projet Selenium pour la démonstration dans ce didacticiel