Bevor wir uns mit etwas anderem befassen, lassen Sie uns zunächst verstehen -
Warum brauchen wir Berichterstattung?
Wenn wir Selenium oder ein anderes Automatisierungstool verwenden, führen wir Vorgänge für die Webanwendung aus. Unser Zweck der Automatisierung besteht jedoch nicht nur darin, die zu testende Anwendung auszuführen. Als Automatisierungstester sollen wir die Anwendung testen, Fehler finden und sie dem Entwicklungsteam oder dem höheren Management melden. Hier wird die Berichterstattung für den Software-Testprozess wichtig
TestNG-Berichterstellung
Die TestNG-Bibliothek bietet eine sehr praktische Berichtsfunktion. Nach der Ausführung generiert Testng einen Testausgabeordner im Stammverzeichnis des Projekts. Dieser Ordner enthält zwei Arten von Berichten:
Index.html: Dies ist der vollständige Bericht über die aktuelle Ausführung, der Informationen wie Fehler, Gruppen, Zeit, Reporterprotokolle und XML-Testdateien enthält.
emailable-report.html: Dies ist der zusammenfassende Bericht der aktuellen Testausführung, der eine Testfallmeldung in grüner (für bestandene Testfälle) und roter (für fehlgeschlagene Testfälle) Markierung enthält.
So passen Sie den TestNG-Bericht an
TestNG-Berichte sind recht praktisch, aber manchmal benötigen wir weniger Daten in Berichten oder möchten Berichte in einem anderen Format wie PDF, Excel usw. anzeigen oder das Layout des Berichts ändern.
Es gibt zwei Möglichkeiten, den TestNG-Bericht anzupassen
- Verwenden der ITestListener-Schnittstelle:
- Verwenden der IReporter-Schnittstelle:
ITestListener-Schnittstelle
Wir verwenden diese Schnittstelle, wenn wir den Echtzeitbericht anpassen müssen. Mit anderen Worten, wenn wir eine Reihe von Testfällen in einer TetNG-Suite ausführen und den Bericht jedes Testfalls abrufen möchten, müssen wir nach jedem Testfall die ITestListener-Schnittstelle implementieren. Diese Schnittstelle überschreibt die Methode onTestFailure, onTestStart und onTestSkipped, um den korrekten Status des aktuellen Testfalls zu senden.
Hier sind die Schritte, denen wir folgen werden
- Erstellen Sie eine Klasse namens RealGuru99Report und implementieren Sie iTestListener darin.
- Implementieren Sie Methoden von iTestListener
- Erstellen Sie eine Testmethode und fügen Sie die RealGuru99Report-Klasse als Listener in der Test Method-Klasse hinzu.
Codebeispiel
RealGuru99TimeReport.java ist die Echtzeit-Berichtsklasse. Es wird die ITestListener-Schnittstelle für die Berichterstellung implementieren
Paket testNGReport.realTimeReport;import org.testng.ITestContext;import org.testng.ITestListener;import org.testng.ITestResult;öffentliche Klasse RealGuru99TimeReport implementiert ITestListener {@Overridepublic void onStart (ITestContext arg0) {System.out.println ("Start der Ausführung (TEST) ->" + arg0.getName ());}}@Overridepublic void onTestStart (ITestResult arg0) {System.out.println ("Test gestartet ->" + arg0.getName ());}}@Overridepublic void onTestSuccess (ITestResult arg0) {System.out.println ("Test Pass ->" + arg0.getName ());}}@Overridepublic void onTestFailure (ITestResult arg0) {System.out.println ("Test fehlgeschlagen ->" + arg0.getName ());}}@Overridepublic void onTestSkipped (ITestResult arg0) {System.out.println ("Test übersprungen ->" + arg0.getName ());}}@Overridepublic void onFinish (ITestContext arg0) {System.out.println ("Ende der Ausführung (TEST) ->" + arg0.getName ());}}@Overridepublic void onTestFailedButWithinSuccessPercentage (ITestResult arg0) {// TODO Automatisch generierter Methodenstub}}}}
TestGuru99RealReport.java ist der Testfall für einen echten Bericht
Paket testNGReport.realTimeReport;import org.testng.Assert;import org.testng.annotations.Listeners;import org.testng.annotations.Test;@ Listeners (RealGuru99TimeReport.class)öffentliche Klasse TestGuru99RealReport {@Prüfungpublic void testRealReportOne () {Assert.assertTrue (true);}}@Prüfungpublic void testRealReportTwo () {Assert.assertTrue (false);}}// Testfall hängt von fehlgeschlagenem Testfall ab = testRealReportTwo@Test (abhängigeOnMethods = "testRealReportTwo")public void testRealReportThree () {}}}}
Die Ausgabe sieht wie folgt aus:
IReporter-Schnittstelle
Wenn wir den von TestNG generierten endgültigen Testbericht anpassen möchten, müssen wir die IReporter-Schnittstelle implementieren. Diese Schnittstelle verfügt nur über eine Methode zum Implementieren von generateReport. Diese Methode enthält alle Informationen zu einer vollständigen Testausführung in der Liste
Codebeispiel
Guru99Reporter.java ist die Datei, mit der der Bericht angepasst wird
Paket 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;öffentliche Klasse Guru99Reporter implementiert IReporter {@Overridepublic void generateReport (Listarg0, List arg1,String outputDirectory) {// Der zweite Parameter dieser Methode ISuite enthält die gesamte ausgeführte Suite.für (ISuite iSuite: arg1) {// Eine Karte des Ergebnisses einer einzelnen Suite gleichzeitig abrufenMap results = iSuite.getResults ();// Den Schlüssel der Ergebniskarte abrufenSetze keys = results.keySet ();// Gehe nacheinander zu jedem Kartenwertfür (String key: keys) {// Das Kontextobjekt des aktuellen ErgebnissesITestContext context = results.get (Schlüssel) .getTestContext ();// Suite-Details in der Konsole druckenSystem.out.println ("Suite Name ->" + context.getName ()+ ":: Berichtsausgabe Ditectory ->" + context.getOutputDirectory ()+ ":: Suite Name ->" + context.getSuite (). GetName ()+ ":: Startdatum Uhrzeit für die Ausführung ->" + context.getStartDate ()+ ":: Enddatum Uhrzeit für die Ausführung ->" + context.getEndDate ());// Karte nur für fehlgeschlagene Testfälle abrufenIResultMap resultMap = context.getFailedTests ();// Methodendetails fehlgeschlagener Testfälle abrufenSammlung failedMethods = resultMap.getAllMethods ();// Eine Schleife nach der anderen in allen fehlgeschlagenen MethodenSystem.out.println ("-------- FAILED TEST CASE ---------");für (ITestNGMethod iTestNGMethod: failedMethods) {// Fehlerhafte Testfalldetails druckenSystem.out.println ("TESTCASE NAME ->" + iTestNGMethod.getMethodName ()+ "\ nBeschreibung ->" + iTestNGMethod.getDescription ()+ "\ nPriorität ->" + iTestNGMethod.getPriority ()+ "\ n: Datum ->" + neues Datum (iTestNGMethod.getDate ()));}}}}}}}}}}
TestGuru99ForReporter.java ist eine Demo für benutzerdefinierte Berichte
Paket testNGReport.iReporterReport;import org.testng.Assert;import org.testng.annotations.Listeners;import org.testng.annotations.Test;// Listener hinzufügen, um den Bericht anzuhören und zu schreiben, wenn der Test abgeschlossen ist@ Listeners (Wert = Guru99Reporter.class)öffentliche Klasse TestGuru99ForReporter {@Test (Priorität = 0, Beschreibung = "testReporterOne")public void testReporterOne () {// Testfall bestehenAssert.assertTrue (true);}}@Test (Priorität = 1, Beschreibung = "testReporterTwo")public void testReporterTwo () {// Testfall fehlgeschlagenAssert.assertTrue (false);}}}}
Die Ausgabe wird wie folgt sein:
PDF und E-Mail von Berichten
Die obige Berichtsimplementierung ist recht einfach und klar, um Ihnen den Einstieg in die Berichtsanpassung zu erleichtern.
In der Unternehmensumgebung müssen Sie jedoch hochgradig angepasste Berichte erstellen. Hier ist das Szenario, mit dem wir uns befassen werden
- Erstellen Sie einen benutzerdefinierten Bericht in PDF-Form
- Machen Sie NUR Screenshots zu Fehlern. Link zu Screenshots als PDF
- Senden Sie eine E-Mail mit dem PDF
Der PDF-Bericht sieht folgendermaßen aus
Um einen PDF-Bericht zu erstellen, benötigen wir einen Java API IText . Hier herunterladen . Es gibt eine andere benutzerdefinierte Listener-Klasse, die dieses IText-JAR tatsächlich implementiert und einen PDF-Bericht für uns erstellt. Hier herunterladen
Die obige Abbildung zeigt das Standardformat des generierten PDF-Berichts. Sie können es anpassen
So werden wir uns dem nähern
Schritt 1) Erstellen Sie eine Basisklasse
Schritt 2) Passen Sie JypersionListerner.Java an (PDF-Erstellungscode)
Schritt 3) Erstellen Sie eine TestGuru99PDFEmail.java, die Testfälle ausführt, und erstellen Sie eine PDF-Datei
Schritt 4) Fügen Sie Code an TestGuru99PDFEmail.java hinzu, um einen PDF-Bericht per E-Mail zu senden
Schauen wir uns diese Schritte an
Schritt 1) Erstellen Sie eine Basisklasse
Diese Basisklasse verfügt über Funktionen zum Erstellen von WebDriver und zum Aufnehmen von Screenshots
Paket 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;öffentliche Klasse BaseClass {statischer WebDriver-Treiber;öffentlicher statischer WebDriver getDriver () {if (driver == null) {WebDriver-Treiber;System.setProperty ("webdriver.gecko.driver", "C: \\ geckodriver.exe");Treiber = neuer FirefoxDriver ();}}Fahrer zurückgeben;}}/ *** Diese Funktion macht einen Screenshot* @param Webdriver* @param fileWithPath* @throws Ausnahme* /public static void takeSnapShot (WebDriver-Webdriver, String fileWithPath) löst eine Ausnahme aus {// Webtreiberobjekt in TakeScreenshot konvertierenTakesScreenshot scrShot = ((TakesScreenshot) Webdriver);// Rufe die Methode getScreenshotAs auf, um eine Bilddatei zu erstellenDatei SrcFile = scrShot.getScreenshotAs (OutputType.FILE);// Bilddatei an neues Ziel verschiebenFile DestFile = neue Datei (fileWithPath);// Datei am Zielort kopierenFileUtils.copyFile (SrcFile, DestFile);}}}}
Schritt 2) Passen Sie JypersionListener.java an
Wir werden uns an das Standardberichtsformat halten. Wir werden jedoch zwei Anpassungen vornehmen
- Hinzufügen von Code, um JypersionListener anzuweisen, einen Screenshot bei Fehler zu erstellen
- Das Anhängen des Links des Screenshots erfolgt im PDF-Bericht
Fügen Sie Code hinzu, um den Screenshot an den PDF-Bericht anzuhängen
Schritt 3) Erstellen Sie eine TestGuru99PDFEmail.java, die Testfälle ausführt, und erstellen Sie eine PDF-Datei
- Hier fügen wir JyperionListener.class als Listener hinzu
- Wir werden 3 Testfälle ausführen.
- Mit Assert.assertTrue können 2 Testfälle nicht bestanden werden, während nur einer bestanden wird.
- Der Screenshot wird nur für die fehlgeschlagenen Testfälle gemäß unseren Anpassungen erstellt
Paket 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;Reporter importieren.JyperionListener;// Listener für die Generierung von PDF-Berichten hinzufügen@ Listeners (JyperionListener.class)öffentliche Klasse TestGuru99PDFReport erweitert BaseClass {WebDriver-Treiber;// Testfall fehlgeschlagen, daher wird ein Screenshot erstellt@Prüfungpublic void testPDFReportOne () {driver = BaseClass.getDriver ();driver.get ("http://google.com");Assert.assertTrue (false);}}// Testfall fehlgeschlagen, daher wird ein Screenshot erstellt@Prüfungpublic void testPDFReporTwo () {driver = BaseClass.getDriver ();driver.get ("http: /guru99.com");Assert.assertTrue (false);}}// Test Testfall wird bestanden, daher kein Screenshot darauf@Prüfungpublic void testPDFReportThree () {driver = BaseClass.getDriver ();driver.get ("http://demo.guru99.com");Assert.assertTrue (true);}}
Schritt 4) Fügen Sie Code an TestGuru99PDFEmail.java hinzu, um einen PDF-Bericht per E-Mail zu senden
- Wir werden die Anmerkung @AfterSuite verwenden, um eine E-Mail des PDF-Berichts zu senden
- Wir werden E-Mails mit Google Mail senden
- Um E-Mail zu aktivieren, müssen viele Bibliotheksdateien wie mail.jar, pop3.jar, smptp.jar usw. Importiert werden
- Bevor Sie dies ausführen, geben Sie die E-Mail-Adresse und das Kennwort von, bis ein
// Nach vollständiger Ausführung PDF-Bericht per E-Mail senden@ AfterSuitepublic void tearDown () {sendPDFReportByGMail (" Diese E-Mail-Adresse ist vor Spambots geschützt. Zum Anzeigen muss JavaScript aktiviert sein.", "Kennwort", "Diese E-Mail-Adresse ist vor Spambots geschützt! Zum Anzeigen muss JavaScript aktiviert sein. "," PDF Report "," ");} / ** * E-Mail mit Java senden * @param von * @param pass * @param an * @param subject * @param body * / private static void sendPDFReportByGMail (String from, String pass, String to, String subject, String body) {Eigenschaften 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 (Sitzung);try {// Set from address message.setFrom (neue InternetAddress (from)); message.addRecipient (Message.RecipientType.TO, neue InternetAddress (to)); // Betreff setzen message.setSubject (subject); message.setText (body); BodyPart objMessageBodyPart = new MimeBodyPart (); objMessageBodyPart.setText ("Bitte finden Sie die angehängte Berichtsdatei!"); Multipart multipart = new MimeMultipart (); multipart.addBodyPart (objMessageBodyPart); objMessageBodyPart = new MimeBodyPart (); // Pfad zur PDF-Berichtsdatei festlegen String filename = System.getProperty ("user.dir") + "\\ Default test.pdf"; // Datenquelle erstellen, um die Datei in Mail anzuhängen DataSource source = new FileDataSource (Dateiname); objMessageBodyPart.setDataHandler (neuer DataHandler (Quelle)); objMessageBodyPart.setFileName (Dateiname); multipart.addBodyPart (objMessageBodyPart); Botschaft.setContent (mehrteilig); 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 (); }}}
Laden Sie hier das komplette Projekt herunter
Hinweis: Wenn wir im PDF auf den Screenshot-Link klicken, wird der Sicherheitsdialog angezeigt. Wir müssen zulassen, dass dieser Dialog als PDF geöffnet wird.
Die so generierte E-Mail sieht folgendermaßen aus
Zusammenfassung:
- TestNG verfügt über eine integrierte Berichtsfunktion.
- Nach einer vollständigen Ausführung der Testfälle generiert TestNG einen Testausgabeordner im Stammverzeichnis des Projekts.
- Im Testausgabeordner befinden sich zwei Hauptberichte: index.html und emailable-report.html.
- Um den TestNG-Bericht anzupassen, müssen zwei Schnittstellen implementiert werden, ITestListener und IReporter.
- Wenn wir zwischen der Ausführung einen Bericht benötigen, benötigen wir ITestListener.
- Um nach Abschluss der Ausführung einen Abschlussbericht zu erstellen, müssen wir IReporter implementieren.
- Wenn Sie den Screenshot in Selenium WebDriver aufnehmen, müssen Sie cast WebDriver in die TakesScreenShot-Oberfläche eingeben.
- Um PDF-Berichte zu erstellen, müssen wir dem Projekt IText jar hinzufügen.
Laden Sie die Selenium-Projektdateien für die Demo in diesem Tutorial herunter