TestNG دليل الشرح لسيلينيوم WebDriver

السلام ، العمل ، مايو ، سكان خابروفسك! بالنسبة لأولئك الذين ، مثلنا ، اقتحموا أسبوع العمل ما بين الإجازات ، فقد أعددنا ترجمة نرغب في تزامنها مع بدء التسجيل في دورة Java QA Engineer ، والمقرر إطلاقها في 28 مايو.



TestNG هو إطار اختبار تم إنشاؤه بواسطة Cédric Beust يساعدنا على تلبية العديد من احتياجات الاختبار لدينا. يستخدم TestNG على نطاق واسع مع السيلينيوم. تريد أن تعرف ماذا يعني NG؟ وهذا يعني "الجيل القادم" . يشبه TestNG JUnit ، ولكنه أكثر قوة عندما يتعلق الأمر بالتحكم في تدفق البرنامج. تساعدنا بنية الإطار في جعل الاختبارات أكثر تنظيماً وتوفر نقاط تحقق أفضل.

بعض ميزات TestNG التي تستحق الاهتمام:

  • تعليقات توضيحية قوية ومتنوعة لدعم حالات الاختبار الخاصة بك.
  • تشغيل الاختبارات بالتوازي ، باستخدام التبعيات بين الاختبارات.
  • المرونة في تشغيل الاختبارات الخاصة بك على مجموعات بيانات مختلفة ، من خلال ملف TestNG.xml أو من خلال مفهوم موفري البيانات.
  • تجميع وترتيب أولويات حالات الاختبار.
  • توليد تقارير HTML ، التخصيص باستخدام الإضافات المختلفة.
  • إنشاء سجلات تنفيذ الاختبار.
  • سهولة التكامل مع Eclipse ، Maven ، Jenkins ، إلخ.

عادةً ما تتضمن عملية الاختبار باستخدام TestNG الخطوات التالية:



قبل الانتقال إلى التعليقات التوضيحية لـ TestNG لـ Selenium ، نوضح المتطلبات الأساسية لإعداد TestNG.

الشروط:

  • مجموعة تطوير جافا
  • كسوف أو أي بيئة تطوير متكاملة أخرى
  • تثبيت TestNG في الكسوف أو في IDE الخاص بك

ملاحظة: لا يمكن استخدام التعليقات التوضيحية لـ Java إلا مع إصدار Java 1.5 والإصدارات الأحدث.

إذا كنت جديدًا في TestNG ، فراجع مقالة حول كيفية تشغيل البرنامج النصي الأول للأتمتة باستخدام TestNG .

فما هو الشرح؟

التعليق التوضيحي هو تسمية توفر معلومات إضافية حول الفصل الدراسي أو الطريقة ( ملاحظة المترجم: يمكن تطبيق التعليقات التوضيحية في جافا ليس فقط على الفصول الدراسية والأساليب ، ولكن أيضًا على العناصر الأخرى ). بالنسبة للتعليقات التوضيحية ، يتم استخدام البادئة "@". يستخدم TestNG التعليقات التوضيحية للمساعدة في إنشاء إطار اختبار قوي. دعونا نلقي نظرة على تعليقات TestNG المستخدمة لأتمتة الاختبار باستخدام السيلينيوم.


@Test

هذا هو أهم تعليق توضيحي في TestNG ، والذي يحتوي على منطق الاختبار الرئيسي . جميع الوظائف الآلية في الطريقة مع تعليق توضيحي @Test . له سمات متعددة يمكن من خلالها تكوين طريقة التشغيل.

يتحقق نموذج التعليمة البرمجية أدناه من انتقال url:

 @Test public void testCurrentUrl() throws InterruptedException { driver.findElement(By.xpath("//*[@id='app']/header/aside/ul/li[4]/a")) .click(); String currentUrl = driver.getCurrentUrl(); assertEquals( currentUrl, "https://automation.lambdatest.com/timeline/?viewType=build&page=1", "url did not matched"); } 

@BeforeTest

يتم تشغيل طريقة مع هذا التعليق التوضيحي قبل تشغيل الطريقة الأولى مع تعليق توضيحي @Test . (ملاحظة المترجم: كجزء من الاختبار المحدد في قسم test بملف تكوين XML) . يمكنك استخدام هذا التعليق التوضيحي في TestNG مع السيلينيوم لتكوين متصفحك. على سبيل المثال ، قم بتشغيل متصفح وتوسيعه إلى وضع ملء الشاشة ، وتعيين إعدادات متصفح معينة ، إلخ.

فيما يلي مثال لـ BeforeTest ، حيث يتم توسيع المستعرض إلى وضع ملء الشاشة:

 @BeforeTest public void profileSetup() { driver.manage().window().maximize(); } 

@AfterTest

يتم تشغيل الطرق التي تحمل هذا التعليق التوضيحي بعد جميع طرق اختبار @Test . ( ملاحظة المترجم: كجزء من الاختبار المحدد في قسم test في ملف تكوين xml ، لم تتم كتابة "الفئة الحالية" بشكل صحيح باللغة الأصلية ). هذا شرح توضيحي مفيد مفيد لتقديم نتائج الاختبار. يمكنك استخدام هذا التعليق التوضيحي لإنشاء تقرير عن اختباراتك وإرساله بالبريد الإلكتروني إلى الأطراف المعنية.

مثال على الكود:

 @AfterTest public void reportReady() { System.out.println("Report is ready to be shared, with screenshots of tests"); } 

@BeforeMethod

يتم تشغيل الطرق مع هذا التعليق التوضيحي قبل كل طريقة @Test . يمكنك استخدامه لاختبار الاتصال بقاعدة البيانات قبل تشغيل الاختبار. أو ، على سبيل المثال ، عند اختبار الوظيفة التي تعتمد على تسجيل دخول المستخدم ، ضع الرمز لدخول النظام هنا.
التالي هو مقتطف شفرة يوضح تسجيل الدخول LambdaTest:

 @BeforeMethod public void checkLogin() { driver.get("https://accounts.lambdatest.com/login"); driver.findElement(By.xpath("//input[@name='email']")).sendKeys("sadhvisingh24@gmail.com"); driver.findElement(By.xpath("//input[@name='password']")).sendKeys("activa9049"); driver.findElement(By.xpath("//*[@id='app']/section/form/div/div/button")).click(); } 

@AfterMethod

يتم تشغيل الطرق مع هذا التعليق التوضيحي بعد كل طريقة @Test . يمكنك استخدام هذا التعليق التوضيحي لالتقاط لقطات شاشة في كل مرة تقوم فيها بإجراء الاختبار.
فيما يلي مقتطف من الشفرة يوضح كيفية التقاط لقطة للشاشة:

 @AfterMethod public void screenShot() throws IOException { TakesScreenshot scr = ((TakesScreenshot) driver); File file1 = scr.getScreenshotAs(OutputType.FILE); FileUtils.copyFile(file1, new File(":\\test-output\\test1.PNG")); } 

@BeforeClass

سيتم تنفيذ طريقة مع هذا التعليق التوضيحي قبل طريقة الاختبار الأولى في الفصل الحالي. يمكنك استخدام هذا التعليق التوضيحي لتكوين خصائص المتصفح ، وتهيئة برنامج التشغيل ، وفتح متصفح باستخدام عنوان URL المطلوب ، إلخ.

نموذج التعليمة البرمجية لـ BeforeClass:

 @BeforeClass public void appSetup() { driver.get(url); } 

@AfterClass

سيتم تنفيذ طريقة مع هذا التعليق التوضيحي بعد آخر طريقة اختبار في الفصل الحالي. يمكن استخدام هذا التعليق التوضيحي في TestNG لتنفيذ إجراءات لتنظيف الموارد بعد الانتهاء من الاختبار ، مثل إغلاق برنامج التشغيل ، إلخ.
فيما يلي مثال على مقتطف شفرة يعرض إغلاق برنامج التشغيل:

 @AfterClass public void closeUp() { driver.close(); } 

@BeforeSuite

يمكن أن تتكون مجموعة الاختبار (مجموعة) من عدة فصول ، يتم تشغيل هذا التعليق التوضيحي قبل جميع طرق الاختبار لجميع الفئات. يشير هذا التعليق التوضيحي إلى نقطة الدخول عند بدء التشغيل. يمكن @BeforeSuite في @BeforeSuite لأداء وظائف شائعة ، مثل إعداد وتشغيل السيلينيوم أو برامج تشغيل الويب عن بعد ، إلخ.
مثال توضيحي في @BeforeSuite في @BeforeSuite يُظهر إعداد برنامج التشغيل:

 @BeforeSuite public void setUp() { System.setProperty( "webdriver.chrome.driver", ":\\selenium\\chromedriver.exe"); driver = new ChromeDriver(); } 

@AfterSuite

يبدأ هذا التعليق التوضيحي في TestNG بعد تشغيل جميع طرق الاختبار في جميع الفئات. يمكن استخدام هذا التعليق التوضيحي للتنظيف قبل إكمال الاختبارات عند استخدام عدة فئات ، على سبيل المثال ، إغلاق برامج التشغيل ، إلخ.
يوجد أدناه مقتطف شفرة @AfterSuite التوضيحي @AfterSuite في @AfterSuite for Selenium:

 @AfterSuite public void cleanUp() { System.out.println("All close up activities completed"); } 

@BeforeGroups

يمكن لـ TestNG تجميع الاختبارات معًا باستخدام سمة المجموعة في التعليقات التوضيحية @Test . على سبيل المثال ، إذا كنت تريد دمج جميع الوظائف المشابهة المتعلقة بإدارة المستخدم معًا ، فيمكنك وضع علامة على الاختبارات ، مثل لوحة المعلومات (لوحة المستخدم) ، والملف الشخصي (الملف الشخصي) ، والمعاملات (المعاملات) وما شابه ذلك ، في مجموعة واحدة ، مثل user_management. @BeforeGroups في @BeforeGroups على بدء إجراءات معينة أمام مجموعة الاختبار المحددة. يمكن استخدام هذا التعليق التوضيحي إذا كانت المجموعة تركز على وظيفة واحدة ، كما هو موضح في المثال أعلاه. قد يحتوي @BeforeGroup على وظيفة تسجيل دخول مطلوبة لتشغيل الاختبارات في مجموعة ، على سبيل المثال ، اختبار لوحة المستخدم أو ملف تعريف المستخدم ، إلخ.

مثال على استخدام @BeforeGroups :

 @BeforeGroups("urlValidation") public void setUpSecurity() { System.out.println("url validation test starting"); } 

@AfterGroups

يتم تشغيل هذا التعليق التوضيحي بعد تنفيذ جميع طرق اختبار المجموعة المحددة.

نموذج التعليمة البرمجية @AfterGroups التوضيحي @AfterGroups في @AfterGroups لـ Selenium:

 @AfterGroups("urlValidation") public void tearDownSecurity() { System.out.println("url validation test finished"); } 

مثال

يعرض الكود أدناه أمثلة لاستخدام جميع التعليقات التوضيحية التي نوقشت أعلاه:

 import org.apache.commons.io.FileUtils; import org.openqa.selenium.By; import org.openqa.selenium.OutputType; import org.openqa.selenium.TakesScreenshot; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.testng.annotations.*; import java.io.File; import java.io.IOException; import java.util.concurrent.TimeUnit; import static org.testng.Assert.assertEquals; public class AnnotationsTestNG { private WebDriver driver; private String url = "https://www.lambdatest.com/"; @BeforeSuite public void setUp() { System.setProperty( "webdriver.chrome.driver", ":\\selenium\\chromedriver.exe"); driver = new ChromeDriver(); driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS); System.out.println("The setup process is completed"); } @BeforeTest public void profileSetup() { driver.manage().window().maximize(); System.out.println("The profile setup process is completed"); } @BeforeClass public void appSetup() { driver.get(url); System.out.println("The app setup process is completed"); } @BeforeMethod public void checkLogin() { driver.get("https://accounts.lambdatest.com/login"); driver.findElement(By.xpath("//input[@name='email']")).sendKeys("sadhvisingh24@gmail.com"); driver.findElement(By.xpath("//input[@name='password']")).sendKeys("activa9049"); driver.findElement(By.xpath("//*[@id='app']/section/form/div/div/button")).click(); System.out.println("The login process on lamdatest is completed"); } @Test(groups = "urlValidation") public void testCurrentUrl() throws InterruptedException { driver.findElement(By.xpath("//*[@id='app']/header/aside/ul/li[4]/a")).click(); Thread.sleep(6000); String currentUrl = driver.getCurrentUrl(); assertEquals(currentUrl, "https://automation.lambdatest.com/timeline/?viewType=build&page=1", "url did not matched"); System.out.println("The url validation test is completed"); } @AfterMethod public void screenShot() throws IOException { TakesScreenshot scr = ((TakesScreenshot) driver); File file1 = scr.getScreenshotAs(OutputType.FILE); FileUtils.copyFile(file1, new File(":\\test-output\\test1.PNG")); System.out.println("Screenshot of the test is taken"); } @AfterClass public void closeUp() { driver.close(); System.out.println("The close_up process is completed"); } @AfterTest public void reportReady() { System.out.println("Report is ready to be shared, with screenshots of tests"); } @AfterSuite public void cleanUp() { System.out.println("All close up activities completed"); } @BeforeGroups("urlValidation") public void setUpSecurity() { System.out.println("url validation test starting"); } @AfterGroups("urlValidation") public void tearDownSecurity() { System.out.println("url validation test finished"); } } 

تقرير TestNG:



إخراج وحدة التحكم:



ملاحظة المترجم:

  • لتشغيل الاختبار ، قم بتغيير المسار إلى chromedriver.exe في طريقة setUp () ، والمسار إلى مجلد screenshot في طريقة screenShot (). أيضًا ، من أجل التنفيذ الناجح للاختبار ، يجب أن يكون لطريقة checkLogin () اسم مستخدم وكلمة مرور صالحين.
  • التبعيات المستخدمة مخضرم:

 <dependencies> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6.14.3</version> <scope>test</scope> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-chrome-driver</artifactId> <version>3.141.59</version> <scope>test</scope> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> <scope>test</scope> </dependency> </dependencies> 
TestNG تسلسل الشرح للسيلينيوم

يتم تنفيذ التعليقات التوضيحية الموضحة أعلاه في وقت التشغيل بالترتيب التالي:

  • BeforeSuite
  • BeforeTest
  • BeforeClass
  • BeforeGroups
  • BeforeMethod
  • اختبار
  • AfterMethod
  • AfterGroups
  • AfterClass
  • AfterTest
  • AfterSuite

هنا هو ترتيب تنفيذها:



السمات المستخدمة مع التعليقات التوضيحية في TestNG

تحتوي التعليقات التوضيحية في TestNG على سمات يمكنك استخدامها للتخصيص. أنها تساعد في إعداد ترتيب تنفيذ طرق الاختبار.

هذه الصفات هي:

  • الوصف : يمكنك تحديد وصف لطريقة الاختبار.
    على سبيل المثال ، @Test (description = "هذا الاختبار يتحقق من تسجيل الدخول").
  • alwaysRun : تضمن هذه السمة دائمًا تنفيذ طريقة الاختبار ، حتى لو تم إسقاط الاختبارات التي تعتمد عليها. عندما تكون قيمة السمة صحيحة ، ستعمل هذه الطريقة دائمًا.
    على سبيل المثال ، @Test (alwaysRun = true).
  • dataProvider : تعيين اسم موفر البيانات لطريقة الاختبار. افترض أنك ستقوم بإجراء اختباراتك في العديد من المتصفحات ، ثم في طريقة الاختبار باستخدام سمة dataProvider ، يمكنك إضافة معلمات للمتصفح وإصداره ، والتي سيتم تمريرها إلى الطريقة بواسطة موفر البيانات. في هذه الحالة ، سيستخدم الاختبار الذي يحتوي على هذه السمة هذا الإدخال لتشغيل الاختبارات في متصفحات متعددة.
    على سبيل المثال ، @Test (dataProvider = "cross-browser-test").
  • dependOnMethods : يوفر معلومات حول الترتيب الذي يتم به تشغيل الاختبارات. لن يتم تنفيذ اختبار بهذه السمة إلا إذا نجح الاختبار الذي يعتمد عليه. إذا وقع الاختبار الذي تعتمد عليه الطريقة ، فلن يبدأ الاختبار.
    على سبيل المثال ، @Test (depenOnmethod = "تسجيل الدخول").
  • مجموعات : يساعد على تجميع طرق الاختبار الخاصة بك التي تركز على وظيفة واحدة في مجموعة واحدة.
    على سبيل المثال ، @Test (groups = "Payment_Module").
    تتيح لك هذه السمة أيضًا التحكم في الاختبارات التي سيتم تشغيلها. عند إجراء الاختبارات ، يمكنك تجاهل بعض المجموعات أو ، على العكس ، تشغيل بعض المجموعات فقط. كل ما عليك القيام به هو تحديد المجموعات الضرورية في ملف TestNG.xml. في علامة include ، حدد المجموعات التي تريد تشغيلها ، وفي علامة exclude التي تريد تجاهلها.
  • dependOnGroups : ينفذ وظائف السمتين المذكورتين أعلاه ، أي أنه يحدد اعتماد طريقة الاختبار على المجموعة المحددة. لن يتم إطلاق طريقة الاختبار هذه إلا بعد الانتهاء من مجموعة الاختبارات المحددة.
    على سبيل المثال ، @Test (depenOnMethods = "Payment_Module").
  • الأولوية : تساعدنا في تحديد أولويات طرق الاختبار. عندما تدير TestNG طرق الاختبار ، يمكن أن تفعل ذلك بترتيب عشوائي. في سيناريو تريد فيه تشغيل اختباراتك بالترتيب الصحيح ، يمكنك استخدام سمة الأولوية. الأولوية الافتراضية لجميع طرق الاختبار هي 0. أولاً ، يتم تشغيل الاختبارات بقيمة أقل أولوية.
    على سبيل المثال ، @Test (الأولوية = 1) ، @Test (الأولوية = 2). في هذه الحالة ، سيتم تنفيذ الاختبار ذي الأولوية مساويًا للاختبار أولاً ، ثم الاختبار ذي الأولوية الثانية.
  • ممكّن : يتم استخدام هذه السمة عندما تحتاج إلى تجاهل اختبار معين وعدم تشغيله. كل ما عليك فعله هو ضبطه على "خطأ".
    على سبيل المثال ، @Test ( @Test = false).
  • المهلة : يحدد الوقت الذي يجب أن يكتمل الاختبار. إذا تجاوز تنفيذ الاختبار الوقت المحدد بواسطة السمة ، فسيفشل الاختبار مع استثناء رمي org.testng.internal.thread.ThreadTimeoutException
    على سبيل المثال ، @Test (timeOut = 500). يرجى ملاحظة أن الوقت مبين بالمللي ثانية .
  • invocationCount : يعمل تمامًا مثل حلقة. سيتم تشغيل الاختبار عدة مرات كما هو محدد في invocationCount.
    على سبيل المثال ، سيتم تشغيل @Test (invocationCount = 5) 5 مرات.
  • invocationTimeOut : يُستخدم بالاقتران مع سمة invocationCount أعلاه. تشير قيمة هذه السمة مع invocationCount إلى أنه سيتم تشغيل الاختبار عدة مرات كما هو محدد في invocationCount ، وخلال الوقت المحدد في سمة invocationTimeOut.
    على سبيل المثال ، @Test (invocationCount = 5 ، invocationTimeOut = 20).
  • expectedExceptions : يساعد في معالجة الاستثناءات التي من المتوقع طرحها في طريقة الاختبار. إذا تم طرح الاستثناء المحدد في السمة بواسطة طريقة الاختبار ، فسيكون الاختبار ناجحًا. خلاف ذلك ، فإن عدم وجود استثناء أو رمي استثناء آخر غير محدد في السمة سيفشل في الاختبار.
    على سبيل المثال ، @Test (expectedExceptions = {ArithmeticException.class}).

أعلاه هي السمات المستخدمة مع التعليقات التوضيحية في TestNG مع السيلينيوم. فيما يلي مقتطف شفرة يوضح استخدام السمات أعلاه:

 import static org.testng.Assert.assertEquals; import java.io.File; import java.io.IOException; import org.apache.commons.io.FileUtils; import org.openqa.selenium.By; import org.openqa.selenium.OutputType; import org.openqa.selenium.TakesScreenshot; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterGroups; import org.testng.annotations.AfterMethod; import org.testng.annotations.AfterSuite; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeGroups; import org.testng.annotations.BeforeSuite; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; public class AnnotationsTest { private WebDriver driver; private String url = "https://www.lambdatest.com/"; @BeforeSuite public void setUp() { System.setProperty( "webdriver.chrome.driver", ":\\selenium\\chromedriver.exe"); driver = new ChromeDriver(); System.out.println("The setup process is completed"); } @BeforeTest public void profileSetup() { driver.manage().window().maximize(); System.out.println("The profile setup process is completed"); } @BeforeClass public void appSetup() { driver.get(url); System.out.println("The app setup process is completed"); } @Test(priority = 2) public void checkLogin() { driver.get("https://accounts.lambdatest.com/login"); driver.findElement(By.xpath("//input[@name='email']")).sendKeys("sadhvisingh24@gmail.com"); driver.findElement(By.xpath("//input[@name='password']")).sendKeys("xxxxx"); driver.findElement(By.xpath("//*[@id='app']/section/form/div/div/button")).click(); System.out.println("The login process on lamdatest is completed"); } @Test(priority = 0, description = "this test validates the sign-up test") public void signUp() throws InterruptedException { WebElement link = driver.findElement(By.xpath("//a[text()='Free Sign Up']")); link.click(); WebElement organization = driver.findElement(By.xpath("//input[@name='organization_name']")); organization.sendKeys("LambdaTest"); WebElement firstName = driver.findElement(By.xpath("//input[@name='name']")); firstName.sendKeys("Test"); WebElement email = driver.findElement(By.xpath("//input[@name='email']")); email.sendKeys("User622@gmail.com"); WebElement password = driver.findElement(By.xpath("//input[@name='password']")); password.sendKeys("TestUser123"); WebElement phoneNumber = driver.findElement(By.xpath("//input[@name='phone']")); phoneNumber.sendKeys("9412262090"); WebElement termsOfService = driver.findElement(By.xpath("//input[@name='terms_of_service']")); termsOfService.click(); WebElement button = driver.findElement(By.xpath("//button[text()='Signup']")); button.click(); } @Test(priority = 3, alwaysRun = true, dependsOnMethods = "check_login", description = "this test validates the URL post logging in", groups = "url_validation") public void testCurrentUrl() throws InterruptedException { driver.findElement(By.xpath("//*[@id='app']/header/aside/ul/li[4]/a")).click(); String currentUrl = driver.getCurrentUrl(); assertEquals( currentUrl, "https://automation.lambdatest.com/timeline/?viewType=build&page=1", "url did not matched"); System.out.println("The url validation test is completed"); } @Test(priority = 1, description = "this test validates the logout functionality", timeOut = 25000) public void logout() throws InterruptedException { Thread.sleep(6500); driver.findElement(By.xpath("//*[@id='userName']")).click(); driver.findElement(By.xpath("//*[@id='navbarSupportedContent']/ul[2]/li/div/a[5]")).click(); } @Test(enabled = false) public void skipMethod() { System.out.println("this method will be skipped from the test run using the attribute enabled=false"); } @Test(priority = 6, invocationCount = 5, invocationTimeOut = 20) public void invocationcountShowCaseMethod() { System.out.println("this method will be executed by 5 times"); } @AfterMethod() public void screenshot() throws IOException { TakesScreenshot scr = ((TakesScreenshot) driver); File file1 = scr.getScreenshotAs(OutputType.FILE); FileUtils.copyFile(file1, new File(":\\test-output\\test1.PNG")); System.out.println("Screenshot of the test is taken"); } @AfterClass public void closeUp() { driver.close(); System.out.println("The close_up process is completed"); } @AfterTest public void reportReady() { System.out.println("Report is ready to be shared, with screenshots of tests"); } @AfterSuite public void cleanUp() { System.out.println("All close up activities completed"); } @BeforeGroups("urlValidation") public void setUpSecurity() { System.out.println("url validation test starting"); } @AfterGroups("urlValidation") public void tearDownSecurity() { System.out.println("url validation test finished"); } } 

الإخراج إلى وحدة التحكم:



تقرير TestNG:



تعليقات توضيحية إضافية في TestNG

هناك عدد قليل من التعليقات التوضيحية المفيدة التي تساعدنا في تحقيق أهدافنا.

@DataProvider

يتم استخدام طريقة مع هذا التعليق التوضيحي لتوفير البيانات إلى طريقة اختبار يتم فيها تعيين سمة dataProvider. تساعد هذه الطريقة في إنشاء اختبارات تعتمد على البيانات يمكن من خلالها تمرير مجموعات متعددة من قيم الإدخال. يجب أن ترجع الطريقة صفيفًا أو كائنًا ثنائي الأبعاد.

يحتوي التعليق التوضيحي @DataProvider على سمتين:

  • name - يتم استخدام هذه السمة للإشارة إلى اسم موفر البيانات. إذا لم يتم تحديد ذلك ، فسيتم استخدام اسم الأسلوب الافتراضي.
  • بالتوازي - تتيح لك هذه السمة إجراء اختبارات بالتوازي مع بيانات مختلفة. وجود هذه السمة هي واحدة من مزايا TestNG على Junit. الافتراضي هو خطأ.

يوضح المثال التالي استخدام التعليق التوضيحي @DataProvider بالاسم المعطى والسمات المتوازية.

 @DataProvider(name = "SetEnvironment", parallel = true) public Object[][] getData() { Object[][] browserProperty = new Object[][]{ {Platform.WIN8, "chrome", "70.0"}, {Platform.WIN8, "chrome", "71.0"} }; return browserProperty; } 

@Factory

يساعد هذا التعليق التوضيحي في تشغيل فئات اختبار متعددة خلال فصل اختبار واحد. ببساطة ، فإنه يحدد ويخلق الاختبارات بشكل حيوي.

يعرض مقتطف الشفرة أدناه استخدام التعليق التوضيحي @Factory ، مما يساعد على استدعاء أساليب فئة الاختبار.

 import org.testng.annotations.Test; import org.testng.annotations.Factory; class FactorySimplyTest1 { @Test public void testMethod1() { System.out.println("This is to test for method 1 for Factor Annotation"); } } class FactorySimpleTest2 { @Test public void testMethod2() { System.out.println("This is to test for method 2 for Factor Annotation"); } } public class FactoryAnnotation { @Factory() @Test public Object[] getTestFactoryMethod() { Object[] factoryTest = new Object[2]; factoryTest[0] = new FactorySimplyTest1(); factoryTest[1] = new FactorySimpleTest2(); return factoryTest; } } 

إخراج وحدة التحكم:



@Parameters

يسمح لك هذا التعليق التوضيحي بتمرير المعلمات إلى اختباراتك من خلال ملف TestNG.xml. هذا مفيد عندما تحتاج إلى نقل كمية محدودة من البيانات إلى الاختبارات الخاصة بك. بالنسبة إلى مجموعات البيانات المعقدة والكبيرة ، من الأفضل استخدام التعليق التوضيحي @DataProvider أو Excel.

مثال للاستخدام:

 @Parameters({"username", "password"}) @Test() public void checkLogin(String username, String password) { driver.get("https://accounts.lambdatest.com/login"); driver.findElement(By.xpath("//input[@name='email']")).sendKeys(username); driver.findElement(By.xpath("//input[@name='password']")).sendKeys(password); driver.findElement(By.xpath("//*[@id='app']/section/form/div/div/button")).click(); System.out.println("The login process on lamdatest is completed"); } 

في ملف TestNG.xml ، يتم تعريف المعلمات كما يلي:

 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="Suite"> <test thread-count="5" name="Annotations"> <parameter name="username" value="sadhvisingh24@gmail.com" /> <parameter name="password" value="XXXXX" /> <classes> <class name="Parameter_annotation"/> </classes> </test> <!-- Annotations --> </suite> <!-- Suite --> 

@Listener

يساعد هذا التعليق التوضيحي في التسجيل والإبلاغ. هناك العديد من المستمع:

  • IExecutionListener
  • IAnnotationTransformer
  • ISuiteListener
  • ITestListener

لكننا سنترك وصف هؤلاء المستمعين واستخدامهم لمقال آخر.

هذا كل شئ!

النقطة الأساسية التي يجب مراعاتها عند العمل مع كل هذه التعليقات والسمات هي أنك بحاجة إلى استخدام Java الإصدار 1.5 أو أعلى ، لأن التعليقات غير مدعومة في الإصدارات السابقة من java.

تساعد جميع التعليقات التوضيحية أعلاه وخصائص TestNG على تحسين بنية الشفرة وإمكانية قراءتها. هذا يساعد على تقديم تقارير مفصلة ، مما يجعل تقارير الحالة أسهل وأكثر فائدة. استخدام هذه التعليقات التوضيحية في TestNG for Selenium يرجع إلى متطلبات عملك تمامًا. لذلك ، من المهم اختيار التعليقات التوضيحية الصحيحة واستخدامها بشكل صحيح. يمكنك تجربة هذه التعليقات التوضيحية في TestNG على شبكة السيلينيوم LambdaTest الآن!

أولئك الذين قرأوا حتى النهاية مدعوون لحضور ندوة مفتوحة مجانية على الإنترنت ، والتي ستعقد يوم 14 مايو من قبل مدرسنا ، ديمتري إريمين . حسنًا ، وفقًا للتقاليد المعمول بها ، نحن في انتظار تعليقاتكم ، أيها الأصدقاء.

Source: https://habr.com/ru/post/ar450872/


All Articles