Personnaliser, PDF et e-mail TestNG Rapports dans Selenium pilote web
Avant dโexaminer autre chose, comprenons dโabord :
Pourquoi avons-nous besoin de rapports ?
Lorsque nous utilisons Selenium ou tout autre outil d'automatisation, nous effectuons des opรฉrations sur l'application web. Mais notre objectif en matiรจre dโautomatisation nโest pas seulement dโexercer lโapplication sous test. En tant que testeur d'automatisation, nous sommes censรฉs tester l'application, dรฉtecter les bogues et les signaler ร l'รฉquipe de dรฉveloppement ou ร la direction supรฉrieure. Ici, le reporting prend de l'importance pour les logiciels Tests processus
TestNG Reporting
TestNG La bibliothรจque fournit une fonctionnalitรฉ de reporting trรจs pratique. Aprรจs exรฉcution, Tester gรฉnรฉrera un dossier de sortie de test ร la racine du projet. Ce dossier contient deux types de rapports :
Index.html : Il s'agit du rapport complet de l'exรฉcution en cours qui contient des informations telles qu'une erreur, des groupes, l'heure, les journaux du rapporteur, les fichiers XML de test.
rapport-e-mailable.html : Il s'agit du rapport rรฉcapitulatif de l'exรฉcution du test en cours qui contient Cas de test message en vert (pour les cas de test rรฉussis) et en rouge (pour les cas de test รฉchouรฉs).
Comment personnaliser TestNG Rapport
TestNG les rapports sont assez pratiques, mais nous avons parfois besoin de moins de donnรฉes dans les rapports ou souhaitons afficher les rapports dans un autre format comme PDF, Excel, etc. ou souhaitons modifier la mise en page du rapport.
Il peut y avoir deux faรงons de personnaliser TestNG rapport
- Utilisation de l'interface ITestListener :
- Utilisation de l'interface IReporter :
Interface ITestListener
Nous utilisons cette interface lorsque nous devons personnaliser un rapport en temps rรฉel. En d'autres termes, si nous exรฉcutons un ensemble de scรฉnarios de test dans une suite TetNG et que nous souhaitons obtenir le rapport de chaque scรฉnario de test, alors aprรจs chaque scรฉnario de test, nous devons implรฉmenter l'interface ITestListener. Cette interface remplacera les mรฉthodes onTestFailure, onTestStart, onTestSkipped pour envoyer l'รฉtat correct du scรฉnario de test en cours.
Voici les รฉtapes que nous suivrons
- Crรฉez une classe, par exemple Rรฉel.Guru99. Signalez-le et implรฉmentez iTestListener dedans.
- Implรฉmenter les mรฉthodes d'iTestListener
- Crรฉez une mรฉthode de test et ajoutez RealGuru99. Classe Report en tant qu'รฉcouteur dans la classe Test Method.
Code Exemple
RรฉelsGuru99TimeReport.java est la classe de gรฉnรฉration de rapports en temps rรฉel. Elle implรฉmente l'interface ITestListener pour la gรฉnรฉration de rapports.
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 est le cas de test pour un rapport rรฉel.
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(){
}
}
La sortie ressemblera ร -
Interface IRReporter
Si nous souhaitons personnaliser le rapport de test final gรฉnรฉrรฉ par TestNG, nous devons implรฉmenter l'interface IReporter. Cette interface n'a qu'une seule mรฉthode pour implรฉmenter generateReport. Cette mรฉthode contient toutes les informations d'une exรฉcution de test complรจte dans la liste , et nous pouvons gรฉnรฉrer le rapport en l'utilisant.
Code Exemple
GuruLe fichier 99Reporter.java sert ร personnaliser le rapport.
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 est une dรฉmonstration de reporting personnalisรฉ
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);
}
}
La sortie sera comme-
PDF et e-mail des rapports
La mise en ลuvre du rapport ci-dessus est assez simple et claire pour vous permettre de dรฉmarrer avec la personnalisation des rapports.
Mais dans un environnement dโentreprise, vous devrez crรฉer des rapports hautement personnalisรฉs. Voici le scรฉnario auquel nous allons faire face
- Crรฉer un rapport personnalisรฉ sous forme PDF
- Prenez des captures d'รฉcran UNIQUEMENT sur les erreurs. Lien vers les captures d'รฉcran en PDF
- Envoyer le PDF par email
Le rapport PDF ressemble ร ceci
Pour crรฉer un rapport PDF, nous avons besoin d'un Java API Je Texte. Tรฉlรฉcharge le ici . Il existe une autre classe d'รฉcoute personnalisรฉe qui implรฉmente actuellement ce pot IText et crรฉe un rapport PDF pour nous. Tรฉlรฉcharge le ici
La figure ci-dessus montre le format par dรฉfaut du rapport PDF gรฉnรฉrรฉ. Vous pouvez le personnaliser
Voici comment nous allons aborder cela
รtape 1) Crรฉer une classe de base
รtape 2) Personnalisez JypersionListerner.Java (Code de crรฉation PDF)
รtape 3) Crรฉer un testGuruLe fichier 99PDFEmail.java exรฉcutera les cas de test et crรฉera le PDF.
รtape 4) Ajouter le code au testGuru99PDFEmail.java pour envoyer un rapport PDF par e-mail
Examinons ces รฉtapes
รtape 1) Crรฉer une classe de base
Cette classe de base a des fonctions pour crรฉer WebDriver et prendre une capture d'รฉcran
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);
}
}
รtape 2) Personnaliser JypersionListener.java
Nous nous en tiendrons au format de rapport par dรฉfaut. Mais nous ferons 2 personnalisations
- Ajout de code pour demander ร JypersionListener de prendre une capture d'รฉcran en cas d'erreur
- Joindre le lien de la capture d'รฉcran prise dans le rapport PDF
Ajouter du code pour joindre la capture d'รฉcran au rapport PDF
รtape 3) Crรฉer un testGuruLe fichier 99PDFEmail.java exรฉcutera les cas de test et crรฉera le PDF.
- Ici, nous ajouterons JyperionListener.class comme auditeur
- Nous exรฉcuterons 3 cas de test.
- En utilisant Assert.assertTrue, nous รฉchouerons ร 2 cas de test en n'en rรฉussissant qu'un seul.
- Une capture d'รฉcran sera prise pour les cas de test ayant รฉchouรฉ uniquement selon nos personnalisations
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);
}
รtape 4) Ajouter le code au testGuru99PDFEmail.java pour envoyer un rapport PDF par e-mail
- Nous utiliserons l'annotation @AfterSuite pour envoyer par email le rapport PDF
- Nous enverrons des e-mails via Gmail
- Pour activer le courrier รฉlectronique, vous devez importer de nombreux fichiers de bibliothรจque tels que mail.jar, pop3.jar, smptp.jar, etc.
- Avant d'exรฉcuter ceci, entrez l'adresse e-mail de, l'adresse e-mail et le mot de passe.
//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();
}
}
}
Tรฉlรฉchargez le projet complet ici
Remarque : lorsque nous cliquons sur le lien de la capture d'รฉcran en pdf, la boรฎte de dialogue de sรฉcuritรฉ s'affiche. Nous devons autoriser cette boรฎte de dialogue ร ouvrir le pdf.
L'email ainsi gรฉnรฉrรฉ ressemblera ร ceci
Rรฉsumรฉ
- TestNG a une capacitรฉ de reporting intรฉgrรฉe.
- Aprรจs une exรฉcution complรจte des cas de tests, TestNG gรฉnรจre un dossier de sortie de test ร la racine du projet.
- Dans le dossier test-output, il existe deux rapports principaux, index.html et emailable-report.html.
- Customiser TestNG rapport, nous devons implรฉmenter deux interfaces, ITestListener et IReporter.
- Si nous avons besoin d'obtenir un rapport entre l'exรฉcution, nous avons besoin d'ITestListener.
- Pour crรฉer un rapport final aprรจs une exรฉcution complรจte, nous devons implรฉmenter IReporter.
- Prendre la capture d'รฉcran, dans Selenium WebDriver, nous devons taper WebDriver vers l'interface TakesScreenShot.
- Pour gรฉnรฉrer des rapports PDF, nous devons ajouter un pot IText dans le projet.
Tรฉlรฉchargez le Selenium Fichiers de projet pour la dรฉmo de ce didacticiel












