एक ही समय में कई टेस्ट केस कैसे चलाएं TestNG सूट

⚡ स्मार्ट सारांश

के साथ कई परीक्षण मामले चलाएँ TestNG सुइट में Selenium यह आपको एक ही testng.xml से कई क्लास, पैकेज या चाइल्ड सूट को ट्रिगर करने की सुविधा देता है। यह विस्तृत गाइड पैरेलल थ्रेड्स, सूट हायरार्की, रिपोर्टिंग और आधुनिक AI सहायता को कवर करता है। TestNG 7.x परियोजनाएं।

  • 🧵 समानांतर धागे: ब्राउज़रों और पैकेजों में कुल रनटाइम को कम करने के लिए thread-count और parallel=”tests” सेट करें।
  • सुइट पदानुक्रम: एक पैरेंट testng.xml फ़ाइल चाइल्ड suite-file प्रविष्टियों को सूचीबद्ध कर सकती है ताकि एक ही ट्रिगर में कई suites को एक साथ जोड़ा जा सके।
  • ⚙️ TestNG 7.x तैयार: उदाहरणों का मिलान होता है TestNG 7.10 और Selenium 4 W3C ड्राइवर, पुराने ड्राइवरों की जगह लेंगे Firefoxड्राइवर वायरिंग।
  • 📊 स्मार्ट रिपोर्टिंग: लेवल 1 से 10 तक की विस्तृत जानकारी और ईमेल करने योग्य HTML रिपोर्ट, विफल समानांतर थ्रेड्स का शीघ्र निदान करने में मदद करती हैं।
  • 🤖 एआई ऑर्केस्ट्रेशन: एआई-संचालित शेड्यूलर ऐतिहासिक फ्लेक और अवधि डेटा के आधार पर सूट को पुनर्व्यवस्थित, पुनः प्रयास और शार्ड करते हैं।

के साथ कई परीक्षण मामले चलाएँ TestNG सुइट में Selenium

TestNG यह आपको एक ही प्रोजेक्ट के भीतर समानांतर रूप से परीक्षण विधियों, कक्षाओं और पूर्ण परीक्षण सूट चलाने की सुविधा देता है। समानांतर निष्पादन कुल रनटाइम को कम करता है क्योंकि थ्रेड एक के बाद एक के बजाय एक साथ परीक्षण शुरू करते हैं। यह गाइड बताता है कि इसका उपयोग करके कई कक्षाओं (विभिन्न परीक्षण सूट) को कैसे चलाया जाए। TestNG 7.x के साथ Selenium वेबड्राइवर.

चरण १) एक बनाना TestNGपरीक्षणों को निष्पादित करने के लिए .xml फ़ाइल

कॉन्फ़िगरेशन बनाने के लिए, नीचे दिए गए चरणों का पालन करें।

  1. एक नया प्रोजेक्ट बनाएं Eclipse.
  2. प्रोजेक्ट में दो पैकेज बनाएं (उन्हें नाम दें) कॉम.सुइट1 और कॉम.सुइट2).
  3. प्रत्येक पैकेज में एक क्लास बनाएं (उन्हें नाम दें) फ्लिपकार्ट.जावा और Snapdeal.java) और नीचे दिए गए कोड को संबंधित क्लास में कॉपी करें।
  4. अपने प्रोजेक्ट में एक नई फ़ाइल बनाएं और उसे नाम दें testng.xml। सुनिश्चित करें कि TestNG प्लगइन इंस्टॉल हो गया है (निर्देश उपलब्ध हैं) यहाँ उत्पन्न करेंtestng.xml फ़ाइल में क्लास नाम, टेस्ट नाम और सूट नाम जैसे सभी कॉन्फ़िगरेशन होते हैं।

फ्लिपकार्ट.जावा

package com.suite1;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Actions;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

public class Flipkart {

    WebDriver driver = new FirefoxDriver();
    String username = ""; // Change to your username and password
    String password = "";

    // This method navigates to the Flipkart URL
    @BeforeClass
    public void init() {
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
        driver.navigate().to("https://www.flipkart.com");
    }

    // Log in to Flipkart
    @Test
    public void login() {
        driver.findElement(By.partialLinkText("Login")).click();
        driver.findElement(By.cssSelector(".fk-input.login-form-input.user-email")).sendKeys(username);
        driver.findElement(By.cssSelector(".fk-input.login-form-input.user-pwd")).sendKeys(password);
        driver.findElement(By.cssSelector(".submit-btn.login-btn.btn")).click();
    }

    // Search for a product
    @Test
    public void searchAndSelectProduct() {
        driver.findElement(By.id("fk-top-search-box")).sendKeys("moto g3");
        driver.findElement(By.cssSelector("search-bar-submit.fk-font-13.fk-font-bold")).click();
        String css = ".gd-row.browse-grid-row:nth-of-type(1) > div:nth-child(1)>div>div:nth-child(2)>div>a";
        driver.findElement(By.cssSelector(css)).click();
    }

    @Test
    public void buyAndRemoveFromCart() {
        driver.findElement(By.cssSelector(".btn-express-checkout.btn-big.current")).click();
        driver.findElement(By.cssSelector(".remove.fk-inline-block")).click();
        Alert a = driver.switchTo().alert();
        a.accept();
    }

    @Test
    public void logout() {
        Actions s = new Actions(driver);
        WebElement user = driver.findElement(By.partialLinkText(username));
        s.moveToElement(user).build().perform();
        driver.findElement(By.linkText("Logout")).click();
    }

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

स्नैपडील.जावा

package com.suite2;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Actions;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

public class SnapDeal {

    WebDriver driver = new FirefoxDriver();
    String username = ""; // Change to your username and password
    String password = "";
    String pinCode = "";

    // This method navigates to the Snapdeal URL
    @BeforeClass
    public void init() {
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
        driver.navigate().to("https://www.snapdeal.com");
    }

    @Test
    public void login() {
        driver.findElement(By.xpath("//button[text()='Login']")).click();
        driver.switchTo().frame("loginIframe");
        driver.findElement(By.cssSelector("div[onClick='getLoginForm()']")).click();
        driver.findElement(By.id("j_username")).sendKeys(username);
        driver.findElement(By.id("j_password_login")).sendKeys(password);
        driver.findElement(By.id("signin_submit")).click();
        driver.switchTo().defaultContent();
    }

    @Test
    public void searchAndSelectProduct() {
        driver.findElement(By.cssSelector(".col-xs-20.searchformInput.keyword")).sendKeys("iphone 6s");
        driver.findElement(By.cssSelector(".sd-icon.sd-icon-search")).click();
        String css = ".product_grid_row:nth-of-type(1)>div:nth-child(1)";
        driver.findElement(By.cssSelector(css)).click();
    }

    @Test
    public void buyAndRemoveFromCart() {
        driver.findElement(By.xpath("//li[contains(text(),'Silver')]")).click();
        driver.findElement(By.id("pincode-check")).sendKeys(pinCode);
        driver.findElement(By.id("buy-button-id")).click();
        driver.findElement(By.cssSelector("i[title='Delete Item']")).click();
        Alert a = driver.switchTo().alert();
        a.accept();
    }

    @Test
    public void logout() {
        driver.findElement(By.linkText("START SHOPPING NOW")).click();
        Actions s = new Actions(driver);
        WebElement user = driver.findElement(By.cssSelector(".sd-icon.sd-icon-user"));
        s.moveToElement(user).build().perform();
        driver.findElement(By.linkText("Logout")).click();
    }

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

TestNG. Xml

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">

<suite thread-count="2" verbose="1" name="Gmail Suite" parallel="tests">

  <test name="flipkart">
    <classes>
      <class name="com.suite1.Flipkart"/>
    </classes>
  </test>

  <test name="Myntra">
    <classes>
      <class name="com.suite2.SnapDeal"/>
    </classes>
  </test>
</suite>

अंतिम परियोजना संरचना नीचे दिए गए उदाहरण के समान दिखती है।

बनाना TestNGपरीक्षण निष्पादित करने के लिए .xml फ़ाइल

चरण 2) समानांतर निष्पादन TestNG

ऊपर दी गई XML फ़ाइल को सेव करने के बाद, अगला चरण पैरेलल टेस्ट चलाना है। कोड नीचे दिखाया गया है।

समानांतर निष्पादन TestNG

1) धागा-गिनती: यह परिभाषित करता है कि कितने थ्रेड्स होंगे TestNG पैरेलल एग्जीक्यूशन के लिए स्पिन अप किया जा सकता है। उच्च मान एक साथ अधिक परीक्षण चलाता है, सीपीयू सीमा तक।

2) वाचाल: कंसोल में निष्पादन विवरण लॉग करता है। अनुमत मान 1 से 10 तक हैं। उच्च मान अधिक विस्तृत और बारीक लॉग उत्पन्न करते हैं।

3) नामसुइट का नाम। यह रहा “Gmail सुइट”।

4) समानांतरबताता है TestNG एक साथ क्या चलाना है। मान्य मान टेस्ट, क्लास, मेथड या इंस्टेंस हैं। डिफ़ॉल्ट मान है कोई नहीं.

testng.xml फ़ाइल पर राइट-क्लिक करें और चुनें इस रूप में चलाएँ > TestNG सूटएक बार यह प्रक्रिया पूरी हो जाने पर, आपको समेकित परिणाम दिखाई देंगे।

जब आप उपरोक्त कोड निष्पादित करेंगे, तो आपको निम्नलिखित आउटपुट मिलेगा।

आउटपुट:

समानांतर निष्पादन TestNG

1) testng.xml में परिभाषित सूट का नाम।

समानांतर निष्पादन TestNG

2) testng.xml में परिभाषित परीक्षण का नाम।

समानांतर निष्पादन TestNG

3) testng.xml में घोषित क्लास का नाम।

समानांतर निष्पादन TestNG

4) .java फ़ाइल में @Test एनोटेशन वाले मेथड नाम।

समानांतर निष्पादन TestNG

स्नैपडील टेस्ट के लिए भी यही प्रक्रिया अपनाई जाती है, इसलिए दोनों क्लास साथ-साथ चलती हैं।

चरण 3) एक ही पैरेंट testng.xml से कई सूट चलाना

बड़े प्रोजेक्ट्स में एक आम आवश्यकता यह होती है कि कई testng.xml फाइलों को एक ही ट्रिगर में जोड़ा जाए। TestNG 7.x पैरेंट सूट का समर्थन करता है जो चाइल्ड सूट को संदर्भित करता है। सूट-फ़ाइल प्रविष्टियाँ इस प्रकार रखें कि प्रत्येक चाइल्ड अपने थ्रेड काउंट, लिसनर और पैरामीटर को अलग-अलग रख सके। प्रत्येक चाइल्ड सूट को अलग से सेव करें, फिर पैरेंट को उसके पाथ पर पॉइंट करें। केवल पैरेंट फ़ाइल को ही चलाएँ। Eclipseमेवन या कमांड लाइन के माध्यम से।

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Parent Suite" parallel="tests" thread-count="4">
  <suite-files>
    <suite-file path="./flipkart-suite.xml"/>
    <suite-file path="./snapdeal-suite.xml"/>
  </suite-files>
</suite>

यह पैटर्न रिग्रेशन, स्मोक और सैनिटी सूट को अलग-अलग रखते हुए भी उन्हें पुन: प्रयोज्य बनाता है। आप सेटिंग करके मेवन श्योरफायर से पैरेंट फ़ाइल को भी ट्रिगर कर सकते हैं। <suiteXmlFile>parent-suite.xml</suiteXmlFile> प्लगइन कॉन्फ़िगरेशन के अंदर, जो निरंतर एकीकरण पाइपलाइनों में समान समानांतर लेआउट को काम करने में सक्षम बनाता है।

चरण 4) समानांतर संचालन के लिए सर्वोत्तम अभ्यास TestNG चलाता है

  • पिन TestNG 7.x: उपयोग TestNG 7.10 या उसके बाद के संस्करण के साथ Selenium 4. इसलिए W3C-अनुरूप ड्राइवर थ्रेड्स में लगातार व्यवहार करते हैं।
  • साझा स्थिति से बचें: चाल वेबड्राइवर फ़ील्ड को थ्रेडलोकल में स्थानांतरित करें ताकि प्रत्येक थ्रेड अपना स्वयं का सत्र रख सके।
  • थ्रेड-काउंट को ट्यून करें: पहले सीपीयू कोर की संख्या से शुरुआत करें, फिर ईमेल करने योग्य एचटीएमएल रिपोर्ट और ग्रिड के लोड होने का इंतजार करें, उसके बाद ही इसे बढ़ाएं।
  • परीक्षण डेटा को अलग करें: प्रत्येक थ्रेड के लिए अद्वितीय उपयोगकर्ता, कार्ट और पिन कोड का उपयोग करें ताकि लॉगिन कभी आपस में टकराएं नहीं।
  • विफलता होने पर स्क्रीनशॉट कैप्चर करें: उन्हें एक के माध्यम से जोड़ें आईटेस्ट लिस्टनर अस्थिर समानांतर रन को तेजी से डीबग करने के लिए।
  • एआई की सहायता का उपयोग करें: उपकरण जैसे Testimmabl और CodiumAI अस्थिर परीक्षणों को चिह्नित कर सकते हैं और अगले रन से पहले स्थिर चयनकर्ताओं का सुझाव दे सकते हैं।

निष्कर्ष

ऊपर दिया गया उदाहरण दिखाता है कि इसका उपयोग कैसे करें। TestNG समानांतर परीक्षणों को निष्पादित करने के लिए। TestNG 7.x आपको एक ही XML फ़ाइल से कई टेस्ट क्लास लॉन्च करने, कई चाइल्ड सूट को लिंक करने और पैरेलल थ्रेड्स को ट्यून करने की सुविधा देता है, जिससे बड़े पैमाने पर काम करना आसान हो जाता है। Selenium परियोजनाएं बहुत तेजी से पूरी हो जाती हैं।

अक्सर पूछे जाने वाले प्रश्न

प्रत्येक कक्षा को उसके अपने अनुभाग में रखें testng.xml के अंदर टैग डालें, फिर parallel=”tests” और थ्रेड-काउंट को कम से कम 2 पर सेट करें। TestNG यह दोनों परीक्षणों को अलग-अलग थ्रेड्स पर शुरू करता है, इसलिए क्लासें क्रमिक रूप से चलने के बजाय समवर्ती रूप से निष्पादित होती हैं।

हाँ। एक पैरेंट सूट बनाएँ जो उसके अंदर की चाइल्ड फ़ाइलों को सूचीबद्ध करे। प्रत्येक चाइल्ड सूट-फ़ाइल पथ अपना स्वयं का कॉन्फ़िगरेशन चलाता है। यह पैटर्न इसमें काम करता है। Eclipseमेवन श्योरफायर, और Gradleऔर इसे समर्थन प्राप्त है TestNG 6 और उसके बाद के संस्करण, जिनमें वर्तमान 7.x रिलीज़ भी शामिल है।

पैरेलल एट्रीब्यूट टेस्ट, क्लास, मेथड, इंस्टेंस या इनमें से कोई भी स्वीकार नहीं करता है। जब प्रत्येक विकल्प मौजूद हो तो टेस्ट चुनें। टैग स्व-निहित है, क्लास संपूर्ण क्लास अलगाव के लिए हैं, और मेथड तब उपयोग किए जाते हैं जब व्यक्तिगत @Test मेथड थ्रेड-सेफ होते हैं। डिफ़ॉल्ट मान 'none' है, जिसका अर्थ है कि सब कुछ क्रमिक रूप से चलता है।

थ्रेडलोकल का उपयोग करें या फिर ड्राइवर को स्टैटिक फ़ील्ड के बजाय @BeforeMethod ब्लॉक के अंदर इनिशियलाइज़ करें। इससे प्रत्येक थ्रेड का अपना ब्राउज़र सेशन होगा, जिससे समानांतर थ्रेड क्रैश होने वाली रेस कंडीशन खत्म हो जाएंगी। TestNG इससे संचालित Selenium ग्रिड।

एआई ऑर्केस्ट्रेटर विफलताओं का अनुमान लगाने, अस्थिर परीक्षणों को अलग करने और धीमे परीक्षणों को पुनर्व्यवस्थित करने के लिए पिछले रन डेटा का अध्ययन करते हैं। लॉन्चेबल जैसे प्लेटफ़ॉर्म, Testimऔर mabl प्लग इन करें TestNG इसलिए, सबसे अधिक विफल होने की संभावना वाले सूट पहले चलते हैं, जिससे निरंतर एकीकरण सर्वरों पर फीडबैक लूप छोटा हो जाता है।

जी हां। लॉन्चेबल और बिल्डपल्स में AI-आधारित शेड्यूलर प्रत्येक टेस्ट के लिए ऐतिहासिक अवधि और विफलता दर को मापते हैं, फिर testng.xml को संतुलित शार्ड में विभाजित करते हैं। प्रत्येक शार्ड एक अलग एजेंट पर चलता है, जिससे कुल समय कम हो जाता है जबकि समानांतर उपयोग उच्च बना रहता है।

इस पोस्ट को संक्षेप में इस प्रकार लिखें: