Tilpass, PDF og e-post TestNG Rapporter i Selenium webdriver
Før vi ser nærmere på noe annet, la oss først forstå –
Hvorfor trenger vi rapportering?
Når vi bruker Selenium eller andre automatiseringsverktøy, utfører vi operasjoner på nettapplikasjonen. Men vår hensikt med automatisering er ikke bare å utøve applikasjonen under test. Vi, som automatiseringstester, er ment å teste applikasjonen, finne feil og rapportere den til utviklingsteamet eller høyere ledelse. Her får rapporteringen betydning for programvare Testing prosess
TestNG Rapportering
TestNG biblioteket gir en veldig hendig rapporteringsfunksjon. Etter henrettelse, Testng vil generere en test-utdatamappe ved roten av prosjektet. Denne mappen inneholder to typer rapporter-
Index.html: Dette er den komplette rapporten over gjeldende utførelse som inneholder informasjon som en feil, grupper, tid, reporterlogger, testng XML-filer.
emailable-report.html: Dette er oppsummeringsrapporten for gjeldende testutførelse som inneholder Testsak melding i grønt (for bestått testtilfeller) og rødt (for mislykkede testtilfeller) utheving.
Hvordan tilpasse TestNG Report
TestNG rapportering er ganske nyttig, men likevel trenger vi noen ganger mindre data i rapporter eller ønsker å vise rapporter i et annet format som pdf, excel, etc. eller ønsker å endre rapportens layout.
Det kan være to måter vi kan tilpasse TestNG rapporterer
- Bruke ITestListener-grensesnittet:
- Bruke IReporter Interface:
ITestListener-grensesnitt
Vi bruker dette grensesnittet når vi trenger å tilpasse sanntidsrapporten. Med andre ord, hvis vi kjører en haug med testtilfeller i en TetNG-pakke og vi ønsker å få rapporten fra hver testsak, må vi etter hvert testtilfelle implementere ITestListener-grensesnittet. Dette grensesnittet vil overstyre onTestFailure, onTestStart, onTestSkipped-metoden for å sende riktig status for gjeldende testtilfelle.
Her er trinnene vi skal følge
- Lag en klasse si RealGuru99Report og implementer iTestListener i den.
- Implementer metoder for iTestListener
- Opprett testmetode og legg til RealGuru99Report-klassen som lytter i Testmetode-klassen.
Kodeeksempel
RealGuru99TimeReport.java er sanntidsrapporteringsklassen. Den vil implementere ITestListener-grensesnitt for 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 testsaken for ekte 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(){ } }
Utgangen vil se ut som-
IReporter-grensesnitt
Hvis vi ønsker å tilpasse endelig testrapport generert av TestNG, må vi implementere IReporter-grensesnittet. Dette grensesnittet har bare én metode for å implementere genererrapport. Denne metoden har all informasjon om en fullstendig testkjøring i listen , og vi kan generere rapporten ved å bruke den.
Kodeeksempel
Guru99Reporter.java er filen som brukes til å 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 for tilpasset 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); } }
Utgangen vil være som-
PDF og e-post med rapporter
Rapportimplementeringen ovenfor er ganske enkel og oversiktlig for å komme i gang med rapporttilpasning.
Men i bedriftsmiljøer må du lage svært tilpassede rapporter. Her er scenariet vi skal forholde oss til
- Lag egendefinert rapport i PDF-form
- Ta skjermbilder KUN på feil. Link til skjermbilder i PDF
- Send e-post til PDF-en
PDF-rapporten ser slik ut
For å lage pdf-rapport trenger vi en Java API ITekst. Last det ned her. . Det er en annen tilpasset lytterklasse som faktisk implementerer denne IText-krukken og lager en pdf-rapport for oss. Last den ned her.
Figuren ovenfor viser standardformatet til PDF-rapporten som genereres. Du kan tilpasse den
Her er hvordan vi vil tilnærme oss dette
Trinn 1) Opprett en basisklasse
Trinn 2) Tilpass JypersionListerner.Java (PDF-opprettingskode)
Trinn 3) Lag en TestGuru99PDFEmail.java som vil utføre testsaker, lage PDF
Trinn 4) Legg til kode til TestGuru99PDFEmail.java for å sende PDF-rapport via e-post
La oss se nærmere på disse trinnene
Trinn 1) Opprett baseklasse
Denne basisklassen har funksjoner for å lage WebDriver og ta skjermbilde
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); } }
Trinn 2) Tilpass JypersionListener.java
Vi vil holde oss til standard rapportformat. Men vi vil gjøre 2 tilpasninger
- Legger til kode for å instruere JypersionListener om å ta skjermbilde ved feil
- Ved å legge ved lenken til skjermbildet i PDF-rapporten
Legg til kode for å legge ved skjermbildet til PDF-rapporten
Trinn 3) Lag en TestGuru99PDFEmail.java som vil utføre testsaker, lage PDF
- Her vil vi legge til JyperionListener.class som lytter
- Vi skal utføre 3 testsaker.
- Ved å bruke Assert.assertTrue vil vi mislykkes i 2 testtilfeller mens vi bestått bare én.
- Skjermbilde vil bare bli tatt for de mislykkede testtilfellene i henhold til våre 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); }
Trinn 4) Legg til kode til TestGuru99PDFEmail.java for å sende PDF-rapport via e-post
- Vi vil bruke merknaden @AfterSuite for å sende e-post med PDF-rapporten
- Vi vil sende e-post med Gmail
- For å aktivere e-post, må du importere mange bibliotekfiler som mail.jar, pop3.jar, smptp.jar osv.
- Før du utfører dette, skriv inn fra, til e-postadresse og passord
//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(); } } }
Last ned hele prosjektet her
Merk: Når vi klikker på skjermbildekoblingen i pdf, viser den sikkerhetsdialogen. Vi må la denne dialogboksen åpne pdf.
E-posten som genereres slik vil se slik ut
Sammendrag
- TestNG har en innebygd rapporteringsevne i seg.
- Etter en fullstendig utførelse av testsaker, TestNG genererer en test-utdatamappe i roten av prosjektet.
- I test-output-mappen er det to hovedrapporter, index.html og emailable-report.html.
- For å tilpasse TestNG rapport må vi implementere to grensesnitt, ITestListener og IReporter.
- Hvis vi trenger å få en rapport mellom utførelse, trenger vi ITestListener.
- For å lage en sluttrapport etter fullstendig utførelse, må vi implementere IReporter.
- Tar skjermbildet, inn Selenium WebDriver, vi må skrive cast WebDriver til TakesScreenShot-grensesnittet.
- For å generere pdf-rapporter må vi legge til IText jar i prosjektet.
Last ned Selenium Prosjektfiler for demoen i denne opplæringen