Zanim zajmiemy się czymkolwiek innym, najpierw zrozumiemy -
Dlaczego potrzebujemy raportowania?
Kiedy używamy Selenium lub innego narzędzia do automatyzacji, wykonujemy operacje na aplikacji internetowej. Ale naszym celem automatyzacji nie jest tylko ćwiczenie testowanej aplikacji. My, jako tester automatyzacji, mamy przetestować aplikację, znaleźć błędy i zgłosić to zespołowi programistycznemu lub wyższemu kierownictwu. Tutaj raportowanie nabiera znaczenia dla procesu testowania oprogramowania
Raportowanie TestNG
Biblioteka TestNG zapewnia bardzo przydatną funkcję raportowania. Po wykonaniu Testng wygeneruje folder test-output w katalogu głównym projektu. Ten folder zawiera dwa rodzaje raportów -
Index.html: To jest pełny raport z bieżącego wykonania, który zawiera informacje takie jak błąd, grupy, czas, dzienniki reporterów, testowe pliki XML.
emailable-report.html: To jest raport podsumowujący z bieżącego wykonania testu, który zawiera podświetlony na zielono (dla przypadków testowych pozytywnych) i czerwony (dla przypadków testowych zakończonych niepowodzeniem).
Jak dostosować raport TestNG
Raportowanie TestNG jest dość przydatne, ale czasami potrzebujemy mniej danych w raportach lub chcemy wyświetlać raporty w innym formacie, takim jak pdf, excel itp., Lub chcemy zmienić układ raportu.
Istnieją dwa sposoby dostosowania raportu TestNG
- Korzystanie z interfejsu ITestListener:
- Korzystanie z interfejsu IReporter:
Interfejs ITestListener
Używamy tego interfejsu, gdy musimy dostosować raport w czasie rzeczywistym. Innymi słowy, jeśli wykonujemy kilka przypadków testowych w pakiecie TetNG i chcemy uzyskać raport z każdego przypadku testowego, to po każdym przypadku testowym musimy zaimplementować interfejs ITestListener. Ten interfejs zastąpi metody onTestFailure, onTestStart, onTestSkipped, aby wysłać poprawny stan bieżącego przypadku testowego.
Oto kroki, które będziemy wykonywać
- Utwórz klasę, powiedz RealGuru99Report i zaimplementuj w niej iTestListener.
- Zaimplementuj metody iTestListener
- Utwórz metodę testową i dodaj klasę RealGuru99Report jako detektor w klasie Test Method.
Przykład kodu
RealGuru99TimeReport.java to klasa raportująca w czasie rzeczywistym. Zaimplementuje interfejs ITestListener do raportowania
pakiet testNGReport.realTimeReport;import org.testng.ITestContext;import org.testng.ITestListener;import org.testng.ITestResult;public class RealGuru99TimeReport implementuje ITestListener {@Nadpisaniepublic void onStart (ITestContext arg0) {System.out.println ("Rozpoczęcie wykonywania (TEST) ->" + arg0.getName ());}@Nadpisaniepublic void onTestStart (ITestResult arg0) {System.out.println ("Rozpoczęto test ->" + arg0.getName ());}@Nadpisaniepublic void onTestSuccess (ITestResult arg0) {System.out.println ("Wynik testu ->" + arg0.getName ());}@Nadpisaniepublic void onTestFailure (ITestResult arg0) {System.out.println ("Test nie powiódł się ->" + arg0.getName ());}@Nadpisaniepublic void onTestSkipped (ITestResult arg0) {System.out.println ("Test pominięty ->" + arg0.getName ());}@Nadpisaniepublic void onFinish (ITestContext arg0) {System.out.println ("KONIEC wykonania (TEST) ->" + arg0.getName ());}@Nadpisaniepublic void onTestFailedButWithinSuccessPercentage (ITestResult arg0) {// TODO Automatycznie wygenerowany kod pośredniczący metody}}
TestGuru99RealReport.java to przypadek testowy dla prawdziwego raportu
pakiet testNGReport.realTimeReport;import org.testng.Assert;import org.testng.annotations.Listeners;import org.testng.annotations.Test;@Listeners (RealGuru99TimeReport.class)public class TestGuru99RealReport {@Testpublic void testRealReportOne () {Assert.assertTrue (true);}@Testpublic void testRealReportTwo () {Assert.assertTrue (false);}// Przypadek testowy zależy od niepowodzenia testcase = testRealReportTwo@Test (dependsOnMethods = "testRealReportTwo")public void testRealReportThree () {}}
Wynik będzie wyglądał następująco:
Interfejs IReporter
Jeśli chcemy dostosować końcowy raport z testu generowany przez TestNG, musimy zaimplementować interfejs IReporter. Ten interfejs ma tylko jedną metodę implementacji generowania raportu. Ta metoda ma wszystkie informacje o wykonaniu pełnego testu w List
Przykład kodu
Guru99Reporter.java to plik używany do dostosowywania raportu
pakiet 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 implementuje IReporter {@Nadpisaniepublic void generationReport (Listarg0, List arg1,String outputDirectory) {// Drugi parametr tej metody ISuite będzie zawierał cały wykonany pakiet.for (ISuite iSuite: arg1) {// Pobierz mapę wyników pojedynczego zestawu narazMap results = iSuite.getResults ();// Pobierz klucz mapy wynikówSet keys = results.keySet ();// Idź do każdej wartości mapy po koleifor (klucz ciągu: klucze) {// Obiekt Context bieżącego wynikuITestContext context = results.get (klucz) .getTestContext ();// Szczegóły pakietu Print Suite w konsoliSystem.out.println ("Nazwa pakietu ->" + context.getName ()+ ":: Report output Ditectory ->" + context.getOutputDirectory ()+ ":: Nazwa pakietu ->" + context.getSuite (). GetName ()+ ":: Data rozpoczęcia Godzina wykonania ->" + context.getStartDate ()+ ":: Data zakończenia Godzina wykonania ->" + context.getEndDate ());// Pobierz mapę tylko dla przypadków testowych zakończonych niepowodzeniemIResultMap resultMap = context.getFailedTests ();// Pobierz szczegóły metody przypadków testowych zakończonych niepowodzeniemKolekcja failedMethods = resultMap.getAllMethods ();// Zapętlaj jedną po drugiej we wszystkich błędnych metodachSystem.out.println ("-------- PRZYPADEK NIEUDANY TESTOWY ---------");for (ITestNGMethod iTestNGMethod: failedMethods) {// Drukuj szczegóły przypadków testowych zakończonych niepowodzeniemSystem.out.println ("TESTCASE NAME ->" + iTestNGMethod.getMethodName ()+ "\ nDescription ->" + iTestNGMethod.getDescription ()+ "\ nPriority ->" + iTestNGMethod.getPriority ()+ "\ n: Data ->" + nowa data (iTestNGMethod.getDate ()));}}}}}
TestGuru99ForReporter.java to wersja demonstracyjna raportowania niestandardowego
pakiet testNGReport.iReporterReport;import org.testng.Assert;import org.testng.annotations.Listeners;import org.testng.annotations.Test;// Dodaj odbiornik, aby słuchać raportu i zapisywać go po zakończeniu testu@Listeners (wartość = Guru99Reporter.class)public class TestGuru99ForReporter {@Test (priorytet = 0, description = "testReporterOne")public void testReporterOne () {// Zdaj testAssert.assertTrue (true);}@Test (priorytet = 1, description = "testReporterTwo")public void testReporterTwo () {// Przypadek testowy niepowodzeniaAssert.assertTrue (false);}}
Wynik będzie taki jak-
PDF i e-mail z raportami
Powyższa implementacja raportu jest dość prosta i przejrzysta, aby rozpocząć dostosowywanie raportu.
Jednak w środowisku korporacyjnym będziesz musiał tworzyć wysoce spersonalizowane raporty. Oto scenariusz, z którym będziemy mieli do czynienia
- Utwórz raport niestandardowy w formacie PDF
- Rób zrzuty ekranu TYLKO w przypadku błędów. Link do zrzutów ekranu w formacie PDF
- Wyślij e-mail w formacie PDF
Raport PDF wygląda następująco
Aby utworzyć raport pdf, potrzebujemy Java API IText . Pobierz to tutaj . Istnieje inna niestandardowa klasa nasłuchiwania, która faktycznie implementuje ten jar IText i tworzy dla nas raport PDF. Pobierz to tutaj
Powyższy rysunek przedstawia domyślny format wygenerowanego raportu PDF. Możesz to dostosować
Oto, jak do tego podejdziemy
Krok 1) Utwórz klasę bazową
Krok 2) Dostosuj JypersionListerner.Java (kod tworzenia PDF)
Krok 3) Utwórz TestGuru99PDFEmail.java, który będzie wykonywał przypadki testowe, tworzył PDF
Krok 4) Dołącz kod do TestGuru99PDFEmail.java, aby wysłać raport PDF pocztą elektroniczną
Przyjrzyjmy się tym krokom
Krok 1) Utwórz klasę bazową
Ta klasa bazowa zawiera funkcje do tworzenia WebDriver i Take Screenshot
pakiet 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;klasa publiczna BaseClass {statyczny sterownik WebDriver;public static WebDriver getDriver () {if (driver == null) {Sterownik WebDriver;System.setProperty ("webdriver.gecko.driver", "C: \\ geckodriver.exe");driver = nowy FirefoxDriver ();}kierowca powrotny;}/ *** Ta funkcja umożliwia wykonanie zrzutu ekranu* @param webdriver* @param fileWithPath* Wyjątek @throws* /public static void takeSnapShot (WebDriver webdriver, String fileWithPath) rzuca wyjątek {// Konwertuj obiekt sterownika sieciowego na TakeScreenshotTakesScreenshot scrShot = ((TakesScreenshot) webdriver);// Wywołaj metodę getScreenshotAs, aby utworzyć plik obrazuFile SrcFile = scrShot.getScreenshotAs (OutputType.FILE);// Przenieś plik obrazu do nowego miejsca docelowegoFile DestFile = nowy plik (fileWithPath);// Kopiuj plik w miejscu docelowymFileUtils.copyFile (SrcFile, DestFile);}}
Krok 2) Dostosuj JypersionListener.java
Będziemy trzymać się domyślnego formatu raportu. Ale wprowadzimy 2 dostosowania
- Dodanie kodu nakazującego JypersionListener zrobienie zrzutu ekranu w przypadku błędu
- Dołączenie linku do zrzutu ekranu w raporcie PDF
Dodaj kod, aby dołączyć zrzut ekranu do raportu PDF
Krok 3) Utwórz TestGuru99PDFEmail.java, który będzie wykonywał przypadki testowe, tworzył PDF
- Tutaj dodamy JyperionListener.class jako słuchacz
- Wykonamy 3 przypadki testowe.
- Korzystając z Assert.assertTrue, zawiedziemy 2 przypadki testowe, zdając tylko jeden.
- Zrzut ekranu zostanie wykonany tylko dla nieudanych przypadków testowych zgodnie z naszymi dostosowaniami
pakiet 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;// Dodaj detektor do generowania raportów PDF@Listeners (JyperionListener.class)public class TestGuru99PDFReport rozszerza BaseClass {Sterownik WebDriver;// Testcase nie powiódł się, więc wygenerowano zrzut ekranu@Testpublic void testPDFReportOne () {driver = BaseClass.getDriver ();driver.get („http://google.com”);Assert.assertTrue (false);}// Testcase nie powiódł się, więc wygenerowano zrzut ekranu@Testpublic void testPDFReporTwo () {driver = BaseClass.getDriver ();driver.get („http: /guru99.com”);Assert.assertTrue (false);}// Przypadek testowy zakończy się pomyślnie, więc nie ma na nim zrzutu ekranu@Testpublic void testPDFReportThree () {driver = BaseClass.getDriver ();driver.get („http://demo.guru99.com”);Assert.assertTrue (true);}
Krok 4) Dołącz kod do TestGuru99PDFEmail.java, aby wysłać raport PDF pocztą elektroniczną
- Skorzystamy z adnotacji @AfterSuite, aby wysłać e-mail z raportem w formacie PDF
- Będziemy wysyłać e-maile za pomocą Gmaila
- Aby włączyć pocztę e-mail, musisz zaimportować wiele plików bibliotecznych, takich jak mail.jar, pop3.jar, smptp.jar itp.
- Zanim to zrobisz, wprowadź adres e-mail od, do i hasło
// Po zakończeniu realizacji wyślij raport w formacie PDF e-mailem@AfterSuitepublic void tearDown () {sendPDFReportByGMail (" Ten adres e-mail jest chroniony przed robotami spamującymi. Aby go zobaczyć, konieczne jest włączenie obsługi JavaScript.", "hasło", "This email address is being protected from spambots. You need JavaScript enabled to view it.", "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(); } } }
Pobierz cały projekt tutaj
Uwaga: Kiedy klikamy na link ze zrzutem ekranu w formacie PDF, pojawia się okno dialogowe bezpieczeństwa. Musimy pozwolić, aby to okno dialogowe otworzyło plik PDF.
Tak wygenerowany e-mail będzie wyglądał następująco
Podsumowanie:
- TestNG ma wbudowaną zdolność raportowania.
- Po całkowitym wykonaniu przypadków testowych TestNG generuje folder test-output w katalogu głównym projektu.
- W folderze test-output znajdują się dwa główne raporty, index.html i emailable-report.html.
- Aby dostosować raport TestNG, musimy zaimplementować dwa interfejsy, ITestListener i IReporter.
- Jeśli potrzebujemy uzyskać raport pomiędzy wykonaniem, potrzebujemy ITestListener.
- Aby stworzyć raport końcowy po całkowitym wykonaniu, musimy zaimplementować IReporter.
- Robiąc zrzut ekranu, w Selenium WebDriver musimy wpisać cast WebDriver do interfejsu TakesScreenShot.
- Aby wygenerować raporty w formacie pdf, musimy dodać do projektu plik IText jar.
Pobierz pliki projektu Selenium do wersji demonstracyjnej w tym samouczku