Anpassen, PDF und E-Mail TestNG Berichte in Selenium WebTreiber
Bevor wir uns mit etwas anderem befassen, wollen wir zunรคchst verstehen:
Warum brauchen wir eine Berichterstattung?
Wenn wir verwenden Selenium oder mit einem anderen Automatisierungstool fรผhren wir Vorgรคnge an der Webanwendung durch. Unser Automatisierungszweck besteht jedoch nicht nur darin, die zu testende Anwendung zu testen. Wir als Automatisierungstester sollen die Anwendung testen, Fehler finden und diese dem Entwicklungsteam oder dem hรถheren Management melden. Hier wird die Berichterstattung fรผr Software wichtig Tests Prozessdefinierung
TestNG Reporting
TestNG Die Bibliothek bietet eine sehr praktische Berichtsfunktion. Nach der Ausfรผhrung, Testng generiert einen Testausgabeordner im Stammverzeichnis des Projekts. Dieser Ordner enthรคlt zwei Arten von Berichten:
Index.html: Dies ist der vollstรคndige Bericht der aktuellen Ausfรผhrung, der Informationen wie Fehler, Gruppen, Zeit, Reporterprotokolle und Testng-XML-Dateien enthรคlt.
per E-Mail versendbarer Bericht.html: Dies ist der zusammenfassende Bericht der aktuellen Testausfรผhrung, der enthรคlt Testfall Meldung wird grรผn (fรผr bestandene Testfรคlle) und rot (fรผr fehlgeschlagene Testfรคlle) hervorgehoben.
So passen Sie an TestNG Profil melden
TestNG Die Berichterstellung ist recht praktisch, aber manchmal benรถtigen wir in Berichten weniger Daten oder mรถchten Berichte in einem anderen Format wie PDF, Excel usw. anzeigen oder das Layout des Berichts รคndern.
Es gibt zwei Mรถglichkeiten, wie wir es anpassen kรถnnen TestNG berichten
- Verwenden der ITestListener-Schnittstelle:
- Verwendung der IReporter-Schnittstelle:
ITestListener-Schnittstelle
Wir verwenden diese Schnittstelle, wenn wir Echtzeitberichte anpassen mรผssen. Mit anderen Worten: Wenn wir eine Reihe von Testfรคllen in einer TetNG-Suite ausfรผhren und den Bericht jedes Testfalls erhalten mรถchten, mรผssen wir nach jedem Testfall die ITestListener-Schnittstelle implementieren. Diese Schnittstelle รผberschreibt die Methoden onTestFailure, onTestStart und onTestSkipped, um den korrekten Status des aktuellen Testfalls zu senden.
Hier sind die Schritte, denen wir folgen werden
- Erstelle eine Klasse, z. B. Real.Guru99Report und implementieren Sie iTestListener darin.
- Implementieren Sie Methoden von iTestListener
- Testmethode erstellen und Real hinzufรผgenGuruDie Klasse 99Report wird als Listener in der Klasse Test Method verwendet.
Code Beispiel
RealGuruDie Klasse 99TimeReport.java dient der Echtzeitberichterstattung. Sie implementiert das ITestListener-Interface fรผr die Berichterstattung.
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 ist der Testfall fรผr einen realen Bericht.
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(){
}
}
Die Ausgabe sieht folgendermaรen aus:
IReporter-Schnittstelle
Wenn wir den endgรผltigen Testbericht anpassen mรถchten, der von generiert wird TestNG, 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 einer vollstรคndigen Testausfรผhrung in der Liste , und wir kรถnnen damit den Bericht erstellen.
Code Beispiel
GuruDie Datei 99Reporter.java dient zur Anpassung des Berichts.
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 ist eine Demo fรผr benutzerdefinierte Berichterstellung.
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);
}
}
Die Ausgabe wird wie folgt aussehen:
PDF und E-Mail von Berichten
Die obige Berichtsimplementierung ist recht einfach und klar, um Ihnen den Einstieg in die Berichtsanpassung zu erleichtern.
Im Unternehmensumfeld mรผssen Sie jedoch hochgradig individuelle Berichte erstellen. Hier ist das Szenario, mit dem wir uns befassen werden
- Erstellen Sie einen benutzerdefinierten Bericht im PDF-Format
- Machen Sie Screenshots NUR bei Fehlern. Link zu Screenshots im PDF
- PDF per E-Mail senden
Der PDF-Bericht sieht so aus
Um einen PDF-Bericht zu erstellen, benรถtigen wir eine Java API Ich schreibe. Lade es herunter werden auf dieser Seite erlรคutert . Es gibt eine weitere benutzerdefinierte Listener-Klasse, die dieses IText-JAR tatsรคchlich implementiert und einen PDF-Bericht fรผr uns erstellt. Lade es herunter werden auf dieser Seite erlรคutert
Die obige Abbildung zeigt das Standardformat des generierten PDF-Berichts. Sie kรถnnen es anpassen
Hier erfahren Sie, wie wir das angehen
Schritt 1) โโErstellen Sie eine Basisklasse
Schritt 2) JypersonListener anpassen.Java (PDF-Erstellungscode)
Schritt 3) Einen Test erstellenGuruDie Datei 99PDFEmail.java fรผhrt Testfรคlle aus und erstellt eine PDF-Datei.
Schritt 4) Code zum Test hinzufรผgenGuru99PDFEmail.java zum Versenden von PDF-Berichten per E-Mail
Schauen wir uns diese Schritte an
Schritt 1) โโBasisklasse erstellen
Diese Basisklasse verfรผgt รผber Funktionen zum Erstellen von WebDriver und zum Erstellen von Screenshots
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);
}
}
Schritt 2) Passen Sie JypersionListener.java an
Wir bleiben beim Standardberichtsformat. Wir werden jedoch zwei Anpassungen vornehmen
- Code hinzufรผgen, um JypersionListener anzuweisen, bei Fehler einen Screenshot zu erstellen
- Fรผgen Sie den Link zur Screenshot-Aufnahme im PDF-Bericht hinzu
Fรผgen Sie Code hinzu, um den Screenshot an den PDF-Bericht anzuhรคngen
Schritt 3) Einen Test erstellenGuruDie Datei 99PDFEmail.java fรผhrt Testfรคlle aus und erstellt eine PDF-Datei.
- Hier fรผgen wir JyperionListener.class als Listener hinzu
- Wir werden 3 Testfรคlle ausfรผhren.
- Mit Assert.assertTrue werden wir zwei Testfรคlle nicht bestehen, wรคhrend wir nur einen bestehen.
- Screenshots werden nur fรผr die fehlgeschlagenen Testfรคlle gemรคร unseren Anpassungen erstellt
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);
}
Schritt 4) Code zum Test hinzufรผgenGuru99PDFEmail.java zum Versenden von PDF-Berichten per E-Mail
- Wir werden die Annotation @AfterSuite verwenden, um den PDF-Bericht per E-Mail zu versenden
- Wir werden E-Mails versenden mit Gmail
- 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 Absender- und Empfรคnger-E-Mail-Adresse sowie das Passwort ein.
//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();
}
}
}
Laden Sie hier das komplette Projekt herunter
Hinweis: Wenn wir im PDF auf den Screenshot-Link klicken, wird ein Sicherheitsdialog angezeigt. Wir mรผssen diesem Dialog erlauben, PDF zu รถffnen.
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, TestNG generiert einen Testausgabeordner im Stammverzeichnis des Projekts.
- Im Testausgabeordner befinden sich zwei Hauptberichte: index.html und emailable-report.html.
- Zum Anpassen TestNG Fรผr den Bericht mรผssen wir zwei Schnittstellen implementieren, ITestListener und IReporter.
- Wenn wir zwischen den Ausfรผhrungen einen Bericht benรถtigen, benรถtigen wir ITestListener.
- Um nach vollstรคndiger Ausfรผhrung einen Abschlussbericht zu erstellen, mรผssen wir IReporter implementieren.
- Den Screenshot machen, in Selenium WebDriver mรผssen wir WebDriver in die TakesScreenShot-Schnittstelle umwandeln.
- Um PDF-Berichte zu generieren, mรผssen wir das IText-JAR zum Projekt hinzufรผgen.
Laden Sie Selenium Projektdateien fรผr die Demo in diesem Tutorial












