Anpassa, PDF och e-post TestNG Rapporter i Selenium webbdrivrutin
Innan vi tittar på något annat, låt oss först förstå –
Varför behöver vi rapportering?
När vi använder Selenium eller något annat automationsverktyg utför vi operationer på webbapplikationen. Men vårt syfte med automatisering är inte bara att utöva Application Under Test. Vi som automationstestare är tänkta att testa applikationen, hitta buggar och rapportera den till utvecklingsteamet eller högre ledning. Här får rapporteringen betydelse för mjukvara Testning process
TestNG Rapportering
TestNG biblioteket erbjuder en mycket praktisk rapporteringsfunktion. Efter avrättningen, Testng kommer att generera en test-output-mapp i roten av projektet. Denna mapp innehåller två typer av rapporter-
Index.html: Detta är den fullständiga rapporten över aktuell körning som innehåller information som ett fel, grupper, tid, reporterloggar, testng XML-filer.
emailable-report.html: Detta är den sammanfattande rapporten för den aktuella testkörningen som innehåller Testfall meddelande i grönt (för godkända testfall) och rött (för misslyckade testfall) markera.
Hur du anpassar TestNG Rapport
TestNG rapportering är ganska praktiskt men ibland behöver vi lite mindre data i rapporter eller vill visa rapporter i något annat format som pdf, excel, etc. eller vill ändra rapportens layout.
Det kan finnas två sätt vi kan anpassa TestNG rapport
- Använda ITestListener Interface:
- Använda IReporter Interface:
ITestListener-gränssnitt
Vi använder detta gränssnitt när vi behöver anpassa realtidsrapporten. Med andra ord, om vi kör ett gäng testfall i en TetNG-svit och vi vill få rapporten för varje testfall, måste vi efter varje testfall implementera ITestListener-gränssnittet. Detta gränssnitt kommer att åsidosätta onTestFailure, onTestStart, onTestSkipped metod för att skicka korrekt status för det aktuella testfallet.
Här är stegen vi kommer att följa
- Skapa en klass säg RealGuru99Report och implementera iTestListener i den.
- Implementera metoder för iTestListener
- Skapa testmetod och lägg till klassen RealGuru99Report som lyssnare i klassen Testmetod.
Kodsexempel
RealGuru99TimeReport.java är realtidsrapporteringsklassen. Det kommer att implementera ITestListener-gränssnittet för 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 är testfallet för en riktig 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(){ } }
Utgången kommer att se ut som-
IReporter-gränssnitt
Om vi vill anpassa sluttestrapporten genererad av TestNG, måste vi implementera IReporter-gränssnittet. Detta gränssnitt har bara en metod för att implementera genereraReport. Denna metod har all information om en fullständig testkörning i listan , och vi kan generera rapporten med den.
Kodsexempel
Guru99Reporter.java är filen som används för att anpassa 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 är en demo för anpassad 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); } }
Utgången blir som-
PDF och e-post med rapporter
Ovanstående rapportimplementering är ganska enkel och tydlig för att komma igång med rapportanpassning.
Men i företagsmiljön måste du skapa mycket anpassade rapporter. Här är scenariot vi kommer att ta itu med
- Skapa anpassad rapport i PDF-form
- Ta skärmdumpar ENDAST på fel. Länk till skärmdumpar i PDF
- Skicka e-post till PDF-filen
PDF-rapporten ser ut så här
För att skapa pdf-rapport behöver vi en Java API IText. Ladda ner det här. . Det finns en annan anpassad lyssnarklass som faktiskt implementerar denna IText-burk och skapar en pdf-rapport åt oss. Ladda ner det här.
Ovanstående figur visar standardformatet för den genererade PDF-rapporten. Du kan anpassa den
Så här tar vi oss an detta
Steg 1) Skapa en basklass
Steg 2) Anpassa JypersionListerner.Java (PDF skapande kod)
Steg 3) Skapa en TestGuru99PDFEmail.java som kommer att utföra testfall, skapa PDF
Steg 4) Lägg till kod till TestGuru99PDFEmail.java för att skicka PDF-rapport via e-post
Låt oss titta närmare på dessa steg
Steg 1) Skapa basklass
Den här basklassen har funktioner för att skapa WebDriver och ta skärmdump
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); } }
Steg 2) Anpassa JypersionListener.java
Vi kommer att hålla fast vid standardrapportformatet. Men vi kommer att göra 2 anpassningar
- Lägger till kod för att instruera JypersionListener att ta skärmdump vid fel
- Bifogar länken till skärmdumpen i PDF-rapporten
Lägg till kod för att bifoga skärmdumpen till PDF-rapporten
Steg 3) Skapa en TestGuru99PDFEmail.java som kommer att utföra testfall, skapa PDF
- Här kommer vi att lägga till JyperionListener.class som lyssnare
- Vi kommer att utföra 3 testfall.
- Genom att använda Assert.assertTrue kommer vi att misslyckas med 2 testfall medan vi bara klarar ett.
- Skärmdump kommer endast att tas för de misslyckade testfallen enligt våra anpassningar
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); }
Steg 4) Lägg till kod till TestGuru99PDFEmail.java för att skicka PDF-rapport via e-post
- Vi kommer att använda anteckningen @AfterSuite för att skicka e-post med PDF-rapporten
- Vi kommer att skicka e-post med Gmail
- För att aktivera e-post måste du importera många biblioteksfiler som mail.jar, pop3.jar, smptp.jar, etc.
- Innan du utför detta, ange från, till e-postadress och lösenord
//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(); } } }
Ladda ner hela projektet här
Obs: När vi klickar på skärmbildslänken i pdf visar den säkerhetsdialogrutan. Vi måste tillåta den här dialogrutan att öppna pdf.
E-postmeddelandet som genereras så kommer att se ut så här
Sammanfattning
- TestNG har en inbyggd rapporteringsförmåga i sig.
- Efter en fullständig utförande av testfall, TestNG genererar en test-output-mapp i projektets rot.
- I test-output-mappen finns det två huvudrapporter, index.html och emailable-report.html.
- Att anpassa TestNG rapport behöver vi implementera två gränssnitt, ITestListener och IReporter.
- Om vi behöver få en rapport mellan körningarna behöver vi ITestListener.
- För att skapa en slutrapport efter fullständigt genomförande måste vi implementera IReporter.
- Tar skärmdumpen, in Selenium WebDriver, vi måste skriva cast WebDriver till TakesScreenShot-gränssnittet.
- För att generera pdf-rapporter måste vi lägga till IText jar i projektet.
ladda ner Selenium Projektfiler för demon i denna handledning