Aanpassen, PDF & E-mail TestNG Rapporteert binnen Selenium webdriver
Voordat we naar iets anders kijken, laten we eerst begrijpen:
Waarom hebben we rapportage nodig?
Wanneer we gebruiken Selenium of een andere automatiseringstool, voeren we bewerkingen uit op de webapplicatie. Maar ons doel van automatisering is niet alleen om de Application Under Test uit te voeren. Wij, als automatiseringstester, moeten de applicatie testen, bugs vinden en deze rapporteren aan het ontwikkelteam of hogere management. Hier wordt de rapportage belangrijk voor software Testen
TestNG Rapportage
TestNG bibliotheek biedt een zeer handige rapportagefunctie. Na executie, Testen genereert een test-uitvoermap in de hoofdmap van het project. Deze map bevat twee soorten rapporten:
Index.html: Dit is het volledige rapport van de huidige uitvoering, dat informatie bevat zoals fouten, groepen, tijd, reporterlogboeken en test-XML-bestanden.
emailbaar-rapport.html: Dit is het samenvattende rapport van de huidige testuitvoering, dat het volgende bevat: Testgeval bericht in groen (voor geslaagde testgevallen) en rood (voor mislukte testgevallen) gemarkeerd.
Aanpassen TestNG Rapport
TestNG Rapportage is best handig, maar toch hebben we soms wat minder gegevens nodig in rapporten of willen we rapporten in een ander formaat weergeven, zoals pdf, Excel, enz., of willen we de lay-out van het rapport wijzigen.
Er zijn twee manieren waarop we maatwerk kunnen leveren TestNG verslag
- De ITestListener-interface gebruiken:
- De IReporter-interface gebruiken:
ITestListener-interface
We gebruiken deze interface wanneer we het realtime rapport moeten aanpassen. Met andere woorden, als we een hele reeks testcases in een TetNG-suite uitvoeren en we het rapport van elke testcase willen ontvangen, dan moeten we na elke testcase de ITestListener-interface implementeren. Deze interface overschrijft de methoden onTestFailure, onTestStart en onTestSkipped om de juiste status van de huidige testcase te verzenden.
Dit zijn de stappen die we zullen volgen
- Maak een klasse, bijvoorbeeld RealGuru99Report, en implementeer iTestListener daarin.
- Implementeer methoden van iTestListener
- Maak een testmethode en voeg de klasse RealGuru99Report toe als luisteraar in de klasse Testmethode.
Code Voorbeeld
RealGuru99TimeReport.java is de realtime rapportageklasse. Het zal de ITestListener-interface voor rapportage implementeren
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 is de testcase voor een echt 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(){ } }
De uitvoer ziet er als volgt uit:
IReporter-interface
Als we het definitieve testrapport willen aanpassen dat is gegenereerd door TestNG, moeten we de IReporter-interface implementeren. Deze interface heeft slechts één methode om genereport te implementeren. Deze methode heeft alle informatie van een volledige testuitvoering in de lijst , en we kunnen er het rapport mee genereren.
Code Voorbeeld
Guru99Reporter.java is het bestand dat wordt gebruikt om het rapport aan te passen
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 is een demo voor aangepaste rapportage
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); } }
De uitvoer zal zijn als-
PDF en e-mail van rapporten
De bovenstaande rapportimplementatie is vrij eenvoudig en duidelijk, zodat u aan de slag kunt met het aanpassen van rapporten.
Maar in een bedrijfsomgeving moet u zeer aangepaste rapporten maken. Dit is het scenario waarmee we te maken zullen krijgen
- Maak een aangepast rapport in PDF-vorm
- Maak ALLEEN screenshots van fouten. Link naar schermafbeeldingen in PDF
- E-mail verzenden van de PDF
Het PDF-rapport ziet er als volgt uit
Om een pdf-rapport te maken hebben we een Java API ITekst. Download het hier . Er is nog een aangepaste luisteraarklasse die deze IText-jar daadwerkelijk implementeert en een pdf-rapport voor ons maakt. Download het hier
Bovenstaande afbeelding toont het standaardformaat van het gegenereerde PDF-rapport. Je kunt het aanpassen
Hier ziet u hoe we dit zullen aanpakken
Stap 1) Creëer een basisklasse
Stap 2) Pas JypersionListerner aan.Java (PDF-aanmaakcode)
Stap 3) Maak een TestGuru99PDFEmail.java die testcases uitvoert en een PDF maakt
Stap 4) Voeg code toe aan TestGuru99PDFEmail.java om een PDF-rapport via e-mail te verzenden
Laten we deze stappen eens bekijken
Stap 1) Maak een basisklasse
Deze basisklasse heeft functies om WebDriver te maken en Screenshot te maken
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); } }
Stap 2) Pas JypersionListener.java aan
We blijven bij het standaardrapportformaat. Maar we zullen 2 aanpassingen maken
- Code toevoegen om JypersionListener te instrueren om een screenshot te maken bij een fout
- Voeg de link van de screenshot toe aan het PDF-rapport
Voeg code toe om de schermafbeelding aan het PDF-rapport toe te voegen
Stap 3) Maak een TestGuru99PDFEmail.java die testcases uitvoert en een PDF maakt
- Hier zullen we JyperionListener.class toevoegen als luisteraar
- We zullen 3 testgevallen uitvoeren.
- Met behulp van Assert.assertTrue zullen we twee testgevallen niet doorstaan, terwijl we er slechts één doorstaan.
- Er wordt alleen een screenshot gemaakt van de mislukte testgevallen volgens onze aanpassingen
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); }
Stap 4) Voeg code toe aan TestGuru99PDFEmail.java om een PDF-rapport via e-mail te verzenden
- We zullen de annotatie @AfterSuite gebruiken om het PDF-rapport per e-mail te verzenden
- We zullen e-mail verzenden via Gmail
- Om e-mail in te schakelen, moeten veel bibliotheekbestanden worden geïmporteerd, zoals mail.jar, pop3.jar, smptp.jar, enz.
- Voordat u dit uitvoert, moet u het van- en het aan-e-mailadres en het wachtwoord invoeren
//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 hier het volledige project
Opmerking: wanneer we op de screenshot-link in pdf klikken, wordt er een beveiligingsdialoogvenster weergegeven. We moeten toestaan dat dit dialoogvenster pdf opent.
De e-mail die zo wordt gegenereerd, ziet er als volgt uit
Samenvatting
- TestNG heeft een ingebouwde rapportagemogelijkheid.
- Na een volledige uitvoering van testgevallen, TestNG genereert een test-uitvoermap in de hoofdmap van het project.
- In de map test-output staan twee hoofdrapporten: index.html en emailable-report.html.
- Op maat maken TestNG rapport moeten we twee interfaces implementeren, ITestListener en IReporter.
- Als we tussen de uitvoering door een rapport moeten ontvangen, hebben we ITestListener nodig.
- Om na volledige uitvoering een eindrapport te kunnen maken, moeten we IReporter implementeren.
- De schermafbeelding maken, in Selenium WebDriver, we moeten Cast WebDriver naar de TakesScreenShot-interface typen.
- Om pdf-rapporten te genereren moeten we IText jar aan het project toevoegen.
Download de Selenium Projectbestanden voor de demo in deze zelfstudie