تخصيص، PDF والبريد الإلكتروني TestNG تقارير في Selenium ويب درايفر
قبل أن ننظر في أي شيء آخر، دعونا نفهم أولا -
لماذا نحتاج إلى التقارير؟
عندما نستخدم ملفات Selenium أو أي أداة أتمتة أخرى، نقوم بإجراء عمليات على تطبيق الويب. لكن غرضنا من الأتمتة ليس فقط ممارسة التطبيق قيد الاختبار. من المفترض أن نختبر التطبيق، ونكتشف الأخطاء ونبلغ عنها لفريق التطوير أو الإدارة العليا. هنا تكتسب التقارير أهمية بالنسبة للبرمجيات الاختبار معالجة
TestNG التقارير
TestNG توفر المكتبة ميزة إعداد التقارير مفيدة للغاية. بعد التنفيذ، تستنج سيقوم بإنشاء مجلد إخراج الاختبار في جذر المشروع. يحتوي هذا المجلد على نوعين من التقارير-
الفهرس.html: هذا هو التقرير الكامل للتنفيذ الحالي والذي يحتوي على معلومات مثل الخطأ والمجموعات والوقت وسجلات المراسل وملفات XML الاختبارية.
تقرير قابل للبريد الإلكتروني.html: هذا هو التقرير الملخص لتنفيذ الاختبار الحالي والذي يحتوي على حالة الاختبار تمييز الرسالة باللون الأخضر (لحالات الاختبار الناجح) والأحمر (لحالات الاختبار الفاشلة).
كيفية تخصيص TestNG تقرير
TestNG يعد إعداد التقارير مفيدًا للغاية ولكننا في بعض الأحيان نحتاج إلى بعض البيانات الأقل في التقارير أو نرغب في عرض التقارير بتنسيق آخر مثل pdf أو Excel أو ما إلى ذلك أو نرغب في تغيير تخطيط التقرير.
يمكن أن تكون هناك طريقتان يمكننا تخصيصهما TestNG تقرير
- باستخدام واجهة ITestListener:
- باستخدام واجهة IReporter:
واجهة ITestListener
نستخدم هذه الواجهة عندما نحتاج إلى تخصيص تقرير في الوقت الفعلي. بمعنى آخر، إذا كنا ننفذ مجموعة من حالات الاختبار في مجموعة TetNG ونريد الحصول على تقرير عن كل حالة اختبار، فبعد كل حالة اختبار نحتاج إلى تنفيذ واجهة ITestListener. ستتجاوز هذه الواجهة طريقة onTestFailure وonTestStart وonTestSkipped لإرسال الحالة الصحيحة لحالة الاختبار الحالية.
فيما يلي الخطوات التي سنتبعها
- أنشئ فئة، ولتكن RealGuru99Report وقم بتنفيذ iTestListener فيه.
- تنفيذ أساليب iTestListener
- أنشئ طريقة اختبار وأضف RealGuruفئة 99Report كمستمع في فئة Test Method.
Code مثال
لابيلا ريالGuruالملف 99TimeReport.java هو فئة إعداد التقارير في الوقت الفعلي. وسيقوم بتنفيذ واجهة ITestListener لإعداد التقارير.
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
}
}
اختبارGuru99RealReport.java هي حالة اختبار للتقرير الحقيقي
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(){
}
}
سيبدو الإخراج مثل-
واجهة أي ريبورتر
إذا أردنا تخصيص تقرير الاختبار النهائي الذي تم إنشاؤه بواسطة TestNG، نحن بحاجة إلى تنفيذ واجهة IReporter. تحتوي هذه الواجهة على طريقة واحدة فقط لتنفيذ generatorReport. تحتوي هذه الطريقة على كافة المعلومات الخاصة بتنفيذ الاختبار الكامل في القائمة ، ويمكننا إنشاء التقرير باستخدامه.
Code مثال
Guruيُستخدم الملف 99Reporter.java لتخصيص التقرير
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()));
}
}
}
}
}
اختبارGuru99ForReporter.java هو نموذج توضيحي لإعداد التقارير المخصصة
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);
}
}
سيكون الإخراج مثل-
PDF والبريد الإلكتروني للتقارير
يعد تنفيذ التقرير أعلاه بسيطًا وواضحًا للغاية لتبدأ في تخصيص التقرير.
ولكن في بيئة الشركات، ستحتاج إلى إنشاء تقارير مخصصة للغاية. هذا هو السيناريو الذي سنتعامل معه
- إنشاء تقرير مخصص في شكل PDF
- التقط لقطات شاشة فقط للأخطاء. رابط إلى لقطات الشاشة في PDF
- إرسال بريد إلكتروني لملف PDF
يبدو تقرير PDF هكذا
لإنشاء تقرير pdf نحتاج إلى Java API IText. تنزيله اضغط هنا . هناك فئة مستمع مخصصة أخرى تقوم بالفعل بتنفيذ IText jar وإنشاء تقرير pdf لنا. تنزيله اضغط هنا
يوضح الشكل أعلاه التنسيق الافتراضي لتقرير PDF الذي تم إنشاؤه. يمكنك تخصيصه
وهنا كيف سنتعامل مع هذا
الخطوة 1) إنشاء فئة أساسية
الخطوة 2) تخصيص JypersionListerner.Java (كود إنشاء PDF)
الخطوة 3) إنشاء اختبارGuruملف 99PDFEmail.java الذي سينفذ حالات الاختبار، وينشئ ملف PDF
الخطوة الرابعة) أضف الكود إلى الاختبارGuruاستخدم برنامج 99PDFEmail.java لإرسال تقرير بصيغة PDF عبر البريد الإلكتروني
دعونا ننظر في هذه الخطوات
الخطوة 1) إنشاء فئة أساسية
تحتوي هذه الفئة الأساسية على وظائف لإنشاء WebDriver والتقاط لقطة للشاشة
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);
}
}
الخطوة 2) تخصيص JypersionListener.java
سنلتزم بتنسيق التقرير الافتراضي. لكننا سنقوم بإجراء تخصيصين
- إضافة رمز لتوجيه JypersionListener لالتقاط لقطة شاشة عند حدوث خطأ
- إرفاق رابط لقطة الشاشة في تقرير PDF
أضف رمزًا لإرفاق لقطة الشاشة بتقرير PDF
الخطوة 3) إنشاء اختبارGuruملف 99PDFEmail.java الذي سينفذ حالات الاختبار، وينشئ ملف PDF
- سنضيف هنا JyperionListener.class كمستمع
- سنقوم بتنفيذ 3 حالات اختبار.
- باستخدام Assert.assertTrue سوف نفشل في حالتين من حالات الاختبار بينما نجتاز حالة واحدة فقط.
- سيتم التقاط لقطة شاشة لحالات الاختبار الفاشلة فقط وفقًا لتخصيصاتنا
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);
}
الخطوة الرابعة) أضف الكود إلى الاختبارGuruاستخدم برنامج 99PDFEmail.java لإرسال تقرير بصيغة PDF عبر البريد الإلكتروني
- سوف نستخدم التعليق التوضيحي @AfterSuite لإرسال بريد إلكتروني لتقرير PDF
- سنرسل البريد الإلكتروني باستخدام Gmail
- لتفعيل البريد الإلكتروني، تحتاج إلى استيراد العديد من ملفات المكتبة مثل mail.jar، pop3.jar، smptp.jar، وما إلى ذلك
- قبل تنفيذ هذا، أدخل عنوان البريد الإلكتروني المرسل والمرسل إليه وكلمة المرور
//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();
}
}
}
قم بتنزيل المشروع الكامل هنا
ملحوظة: عندما نضغط على رابط لقطة الشاشة بصيغة pdf، يظهر مربع حوار الأمان. علينا أن نسمح لهذا الحوار بفتح pdf.
سيبدو البريد الإلكتروني الذي تم إنشاؤه بهذا الشكل
ملخص
- TestNG لديه القدرة على إعداد التقارير يحمل في ثناياه عوامل.
- بعد التنفيذ الكامل لحالات الاختبار، TestNG ينشئ مجلد إخراج الاختبار في جذر المشروع.
- يوجد في مجلد test-output تقريرين رئيسيين، index.html، وemailable-report.html.
- للتخصيص TestNG تقرير أننا بحاجة إلى تنفيذ واجهتين، ITestListener وIReporter.
- إذا أردنا الحصول على تقرير بين التنفيذ، فنحن بحاجة إلى ITestListener.
- لإنشاء تقرير نهائي بعد اكتمال التنفيذ، نحتاج إلى تطبيق IReporter.
- أخذ لقطة الشاشة، في Selenium WebDriver، نحتاج إلى كتابة Cast WebDriver إلى واجهة TakesScreenShot.
- لإنشاء تقارير بصيغة pdf نحتاج إلى إضافة IText jar في المشروع.
تحميل Selenium ملفات المشروع للعرض التوضيحي في هذا البرنامج التعليمي












