Tilpas, PDF og e-mail TestNG Rapporter i Selenium webdriver
Før vi ser nærmere på noget andet, lad os først forstå –
Hvorfor har vi brug for indberetning?
Når vi bruger Selenium eller ethvert andet automatiseringsværktøj, udfører vi operationer på webapplikationen. Men vores formål med automatisering er ikke kun at udøve Application Under Test. Det er meningen, at vi som automatiseringstester skal teste applikationen, finde fejl og rapportere det til udviklingsteamet eller højere ledelse. Her får rapporteringen betydning for software Test behandle
TestNG Rapportering
TestNG biblioteket giver en meget praktisk rapporteringsfunktion. Efter henrettelse, Testng vil generere en test-output mappe i roden af projektet. Denne mappe indeholder to typer rapporter-
Index.html: Dette er den komplette rapport over den aktuelle udførelse, som indeholder information som en fejl, grupper, tid, reporterlogfiler, testng XML-filer.
emailable-report.html: Dette er den sammenfattende rapport for den aktuelle testudførelse, som indeholder Test sag meddelelse i grøn (for beståede testsager) og rød (for mislykkede testsager) fremhæves.
Sådan tilpasses TestNG Rapport
TestNG rapportering er ret praktisk, men nogle gange har vi brug for nogle færre data i rapporter eller ønsker at vise rapporter i et andet format som pdf, excel osv. eller ønsker at ændre rapportens layout.
Der kan være to måder, vi kan tilpasse TestNG indberette
- Brug af ITestListener Interface:
- Brug af IReporter Interface:
ITestListener Interface
Vi bruger denne grænseflade, når vi skal tilpasse realtidsrapporten. Med andre ord, hvis vi udfører en masse testcases i en TetNG-suite, og vi ønsker at få rapporten fra hver testcase, skal vi efter hver testcase implementere ITestListener-grænsefladen. Denne grænseflade vil tilsidesætte metoden onTestFailure, onTestStart, onTestSkipped for at sende den korrekte status for den aktuelle testcase.
Her er de trin, vi vil følge
- Opret en klasse siger RealGuru99Report og implementer iTestListener i den.
- Implementer metoder til iTestListener
- Opret testmetode og tilføj RealGuru99Report-klassen som lytter i Test Method-klassen.
Kodeeksempel
RealGuru99TimeReport.java er realtidsrapporteringsklassen. Det vil implementere ITestListener-grænsefladen til rapportering
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 er testcasen for ægte rapport
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(){
}
}
Outputtet vil se ud som-
IReporter-grænseflade
Hvis vi ønsker at tilpasse den endelige testrapport genereret af TestNG, skal vi implementere IReporter-grænsefladen. Denne grænseflade har kun én metode til at implementere generReport. Denne metode har alle oplysningerne om en komplet testudførelse i listen , og vi kan generere rapporten ved hjælp af den.
Kodeeksempel
Guru99Reporter.java er filen, der bruges til at tilpasse rapporten
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 er en demo til brugerdefineret rapportering
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);
}
}
Output vil være som-
PDF og e-mail med rapporter
Ovenstående rapportimplementering er ret enkel og overskuelig for at komme i gang med rapporttilpasning.
Men i et virksomhedsmiljø bliver du nødt til at oprette meget tilpassede rapporter. Her er scenariet, vi skal beskæftige os med
- Opret brugerdefineret rapport i PDF-form
- Tag KUN skærmbilleder af fejl. Link til skærmbilleder i PDF
- Send e-mail til PDF'en
PDF-rapporten ser sådan ud
For at oprette pdf-rapport har vi brug for en Java API ITekst. Download det link. . Der er en anden tilpasset lytterklasse, som faktisk implementerer denne IText-krukke og laver en pdf-rapport til os. Download det link.
Ovenstående figur viser standardformatet for den genererede PDF-rapport. Du kan tilpasse det
Her er hvordan vi vil gribe dette an
Trin 1) Opret en basisklasse
Trin 2) Tilpas JypersionListerner.Java (PDF oprettelseskode)
Trin 3) Opret en TestGuru99PDFEmail.java, som vil udføre testcases, oprette PDF
Trin 4) Tilføj kode til TestGuru99PDFEmail.java for at sende PDF-rapport via e-mail
Lad os se nærmere på disse trin
Trin 1) Opret basisklasse
Denne basisklasse har funktioner til at oprette WebDriver og tage skærmbillede
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);
}
}
Trin 2) Tilpas JypersionListener.java
Vi holder os til standardrapportformatet. Men vi vil lave 2 tilpasninger
- Tilføjelse af kode for at instruere JypersionListener om at tage et skærmbillede ved fejl
- Vedhæftning af linket til skærmbilledet tages i PDF-rapporten
Tilføj kode for at vedhæfte skærmbilledet til PDF-rapporten
Trin 3) Opret en TestGuru99PDFEmail.java, som vil udføre testcases, oprette PDF
- Her vil vi tilføje JyperionListener.class som lytter
- Vi udfører 3 testsager.
- Ved at bruge Assert.assertTrue vil vi fejle 2 testcases, mens vi kun består én.
- Skærmbillede vil kun blive taget for de mislykkede testsager i henhold til vores tilpasninger
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);
}
Trin 4) Tilføj kode til TestGuru99PDFEmail.java for at sende PDF-rapport via e-mail
- Vi vil bruge annotationen @AfterSuite til at sende e-mail med PDF-rapporten
- Vi sender e-mail ved hjælp af Gmail
- For at aktivere e-mail skal du importere mange biblioteksfiler som mail.jar, pop3.jar, smptp.jar osv.
- Inden du udfører dette, skal du indtaste fra, til e-mailadresse og adgangskode
//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();
}
}
}
Download hele projektet her
Bemærk: Når vi klikker på skærmbilledet-linket i pdf, viser det en sikkerhedsdialog. Vi er nødt til at tillade denne dialog at åbne pdf.
Den således genererede e-mail vil se sådan ud
Resumé
- TestNG har en indbygget rapporteringsevne i sig.
- Efter en komplet udførelse af testcases, TestNG genererer en test-output-mappe i projektets rod.
- I test-output-mappen er der to hovedrapporter, index.html og emailable-report.html.
- At tilpasse TestNG rapport skal vi implementere to grænseflader, ITestListener og IReporter.
- Hvis vi skal have en rapport mellem udførelsen, har vi brug for ITestListener.
- For at oprette en endelig rapport efter fuldstændig udførelse skal vi implementere IReporter.
- Tager skærmbilledet, ind Selenium WebDriver, vi skal skrive cast WebDriver til TakesScreenShot-grænsefladen.
- For at generere pdf-rapporter skal vi tilføje IText jar i projektet.
Download Selenium Projektfiler til demoen i denne vejledning












