Πώς να εκτελέσετε πολλαπλές δοκιμαστικές περιπτώσεις σε TestNG Σουίτα

⚡ Έξυπνη Σύνοψη

Εκτέλεση πολλαπλών δοκιμαστικών περιπτώσεων με TestNG Σουίτα μέσα Selenium σας επιτρέπει να ενεργοποιήσετε πολλές κλάσεις, πακέτα ή θυγατρικές σουίτες από ένα μόνο testng.xml. Αυτή η αναλυτική παρουσίαση καλύπτει παράλληλα νήματα, ιεραρχία σουίτας, αναφορές και βοήθεια με την Τεχνητή Νοημοσύνη για σύγχρονες TestNG Έργα 7.x.

  • 🧵 Παράλληλα νήματα: Ορίστε τις τιμές thread-count και parallel=”tests” για να μειώσετε τον συνολικό χρόνο εκτέλεσης σε όλα τα προγράμματα περιήγησης και τα πακέτα.
  • 🗂️ Ιεραρχία Σουίτας: Ένα γονικό testng.xml μπορεί να παραθέσει καταχωρήσεις θυγατρικών αρχείων σουίτας για να συνδέσει πολλαπλές σουίτες σε ένα έναυσμα.
  • ⚙️ TestNG 7.x Έτοιμο: Παραδείγματα που συμφωνούν με TestNG 7.10 και Selenium 4 προγράμματα οδήγησης W3C, που αντικαθιστούν τα παλαιότερα FirefoxΚαλωδίωση προγράμματος οδήγησης.
  • 📊 Έξυπνη Αναφορά: Τα λεπτομερή επίπεδα 1 έως 10 και οι αναφορές HTML που μπορούν να μεταφερθούν μέσω email βοηθούν στη γρήγορη διάγνωση παράλληλων νημάτων που έχουν αποτύχει.
  • 🤖 Ενορχήστρωση Τεχνητής Νοημοσύνης: Οι προγραμματιστές που βασίζονται στην τεχνητή νοημοσύνη αναδιατάσσουν, επαναλαμβάνουν και διασπούν τις σουίτες με βάση τα ιστορικά δεδομένα flake και διάρκειας.

Εκτέλεση πολλαπλών δοκιμαστικών περιπτώσεων με TestNG Σουίτα μέσα Selenium

TestNG σας επιτρέπει να εκτελείτε μεθόδους δοκιμών, κλάσεις και πλήρεις σουίτες παράλληλα μέσα σε ένα έργο. Η παράλληλη εκτέλεση μειώνει τον συνολικό χρόνο εκτέλεσης επειδή τα νήματα ξεκινούν τις δοκιμές ταυτόχρονα αντί για το ένα μετά το άλλο. Αυτός ο οδηγός εξηγεί πώς να εκτελέσετε πολλαπλές κλάσεις (διαφορετικές σουίτες) χρησιμοποιώντας TestNG 7.x με Selenium WebDriver.

Βήμα 1) Δημιουργία α TestNGΑρχείο .xml για την εκτέλεση δοκιμών

Για να δημιουργήσετε τη διαμόρφωση, ακολουθήστε τα παρακάτω βήματα.

  1. Δημιουργήστε ένα νέο έργο στο Eclipse.
  2. Δημιουργήστε δύο πακέτα στο έργο (ονομάστε τα com.suite1 και com.suite2).
  3. Δημιουργήστε μια κλάση σε κάθε πακέτο (ονομάστε την Flipkart.java και Snapdeal.java) και αντιγράψτε τον παρακάτω κώδικα στις αντίστοιχες κλάσεις.
  4. Δημιουργήστε ένα νέο αρχείο στο έργο σας και ονομάστε το testng.xml. Βεβαιωθείτε ότι το TestNG το πρόσθετο είναι εγκατεστημένο (διατίθενται οδηγίες) εδώ). Το αρχείο testng.xml περιέχει όλες τις ρυθμίσεις, όπως ονόματα κλάσεων, ονόματα δοκιμών και ονόματα σουιτών.

Flipkart.java

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();
    }
}

SnapDeal.java

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 μπορεί να περιστραφεί για παράλληλη εκτέλεση. Μια υψηλότερη τιμή εκτελεί περισσότερες δοκιμές ταυτόχρονα, μέχρι το όριο της CPU.

2) πολυλεκτικόςΚαταγράφει λεπτομέρειες εκτέλεσης στην κονσόλα. Οι επιτρεπόμενες τιμές κυμαίνονται από 1 έως 10. Οι υψηλότερες τιμές παράγουν πιο λεπτομερή και λεπτομερή αρχεία καταγραφής.

3) όνομα: Όνομα της σουίτας. Ορίστε το «Gmail Σουίτα".

4) παράλληλο: Λέει TestNG τι να εκτελεστεί ταυτόχρονα. Οι έγκυρες τιμές είναι δοκιμές, κλάσεις, μέθοδοι ή στιγμιότυπα. Η προεπιλεγμένη τιμή είναι κανένας.

Κάντε δεξί κλικ στο αρχείο testng.xml και επιλέξτε Εκτέλεση ως > TestNG ΣουίταΜόλις ολοκληρωθεί, θα δείτε τα συγκεντρωτικά αποτελέσματα.

Όταν εκτελέσετε τον παραπάνω κώδικα, θα λάβετε την ακόλουθη έξοδο.

Παραγωγή:

Παράλληλη εκτέλεση σε TestNG

1) Όνομα της σουίτας που ορίζεται στο testng.xml.

Παράλληλη εκτέλεση σε TestNG

2) Όνομα της δοκιμής που ορίζεται στο testng.xml.

Παράλληλη εκτέλεση σε TestNG

3) Όνομα της κλάσης που δηλώνεται στο testng.xml.

Παράλληλη εκτέλεση σε TestNG

4) Ονόματα μεθόδων με σχολιασμό @Test στο αρχείο .java.

Παράλληλη εκτέλεση σε TestNG

Η ίδια ροή εκτελείται για τη δοκιμή SnapDeal, επομένως και οι δύο κλάσεις εκτελούνται παράλληλα.

Βήμα 3) Εκτέλεση πολλαπλών σουιτών από ένα γονικό testng.xml

Μια συνηθισμένη απαίτηση σε μεγαλύτερα έργα είναι η αλυσιδωτή σύνδεση αρκετών αρχείων testng.xml σε ένα μόνο trigger. TestNG Το 7.x υποστηρίζει μια γονική σουίτα που αναφέρεται στο παιδί αρχείο-σουίτας καταχωρήσεις, ώστε κάθε θυγατρικό αρχείο να μπορεί να διατηρεί τον δικό του αριθμό νημάτων, ακροατές και παραμέτρους. Αποθηκεύστε κάθε θυγατρική σουίτα ξεχωριστά και, στη συνέχεια, κατευθύνετε το γονικό αρχείο στη διαδρομή του. Εκτελέστε μόνο το γονικό αρχείο από Eclipse, το Maven ή τη γραμμή εντολών.

<!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>

Αυτό το μοτίβο διατηρεί τις σουίτες παλινδρόμησης, καπνού και λογικής ξεχωριστές αλλά και επαναχρησιμοποιήσιμες. Μπορείτε επίσης να ενεργοποιήσετε το γονικό αρχείο από το Maven Surefire ορίζοντας <suiteXmlFile>parent-suite.xml</suiteXmlFile> μέσα στη διαμόρφωση του πρόσθετου, η οποία κάνει την ίδια παράλληλη διάταξη να λειτουργεί σε συνεχείς αγωγούς ολοκλήρωσης.

Βήμα 4) καλυτερα πρακτικές για παράλληλο TestNG τρέχει

  • Καρφώστε TestNG 7.x: Χρήση TestNG 7.10 ή νεότερη έκδοση με Selenium 4, έτσι ώστε τα προγράμματα οδήγησης που είναι συμβατά με το W3C να συμπεριφέρονται με συνέπεια σε όλα τα νήματα.
  • Αποφυγή κοινόχρηστης κατάστασης: Μετακινήστε το Πρόγραμμα οδήγησης Web πεδίο σε ένα ThreadLocal, έτσι ώστε κάθε νήμα να διατηρεί τη δική του συνεδρία.
  • Συντονισμός αριθμού νημάτων: Ξεκινήστε με τον αριθμό των πυρήνων της CPU και, στη συνέχεια, παρακολουθήστε την αναφορά HTML που μπορείτε να χρησιμοποιήσετε μέσω email και το φορτίο του πλέγματος πριν τον αυξήσετε.
  • Δεδομένα δοκιμής απομόνωσης: Χρησιμοποιήστε μοναδικούς χρήστες, καρότσια και κωδικούς PIN ανά νήμα, ώστε οι συνδέσεις να μην συγκρούονται ποτέ.
  • Λήψη στιγμιότυπων οθόνης σε περίπτωση βλάβης: Συνδέστε τα μέσω ενός ITestListener για την ταχύτερη διόρθωση σφαλμάτων σε ασταθείς παράλληλες εκτελέσεις.
  • Χρησιμοποιήστε βοήθεια από την Τεχνητή Νοημοσύνη: Εργαλεία όπως TestimΤα , mabl και CodiumAI μπορούν να επισημάνουν ασταθείς δοκιμές και να προτείνουν σταθερούς επιλογείς πριν από την επόμενη εκτέλεση.

Συμπέρασμα

Το παραπάνω παράδειγμα δείχνει πώς να χρησιμοποιήσετε TestNG για την εκτέλεση παράλληλων δοκιμών. TestNG Η έκδοση 7.x σας παρέχει ένα μόνο αρχείο XML για να ξεκινήσετε πολλαπλές κλάσεις δοκιμών, να συνδέσετε πολλές θυγατρικές σουίτες και να συντονίσετε παράλληλα νήματα, τόσο μεγάλα Selenium τα έργα ολοκληρώνονται πολύ πιο γρήγορα.

Συχνές Ερωτήσεις

Τοποθετήστε κάθε τάξη στη δική της θέση μέσα στο testng.xml και, στη συνέχεια, ορίστε την τιμή parallel=”tests” και έναν αριθμό νημάτων τουλάχιστον 2. TestNG ξεκινά και τις δύο δοκιμές σε ξεχωριστά νήματα, επομένως οι κλάσεις εκτελούνται ταυτόχρονα και όχι διαδοχικά.

Ναι. Δημιουργήστε μια γονική σουίτα που παραθέτει τα θυγατρικά αρχεία μέσα σε αυτά. Κάθε διαδρομή θυγατρικού αρχείου σουίτας εκτελεί τη δική της διαμόρφωση. Το μοτίβο λειτουργεί σε Eclipse, Maven Surefire, και Gradle, και υποστηρίζεται από TestNG 6 και μετά, συμπεριλαμβανομένης της τρέχουσας έκδοσης 7.x.

Το χαρακτηριστικό παράλληλο δέχεται δοκιμές, κλάσεις, μεθόδους, στιγμιότυπα ή κανένα. Επιλέξτε δοκιμές όταν το καθένα Η ετικέτα είναι αυτοτελής, οι κλάσεις για απομόνωση ολόκληρης της κλάσης και οι μέθοδοι όταν οι μεμονωμένες μέθοδοι @Test είναι ασφαλείς για νήματα. Η προεπιλεγμένη τιμή είναι none, η οποία εκτελεί τα πάντα διαδοχικά.

Χρήση ThreadLocal ή αρχικοποιήστε το πρόγραμμα οδήγησης μέσα σε ένα μπλοκ @BeforeMethod αντί ως στατικό πεδίο. Κάθε νήμα κατέχει στη συνέχεια τη δική του συνεδρία προγράμματος περιήγησης, η οποία εξαλείφει τις συνθήκες κούρσας που παρουσιάζουν παράλληλη σφάλματα. TestNG τρέχει Selenium Πλέγμα.

Οι διαχειριστές της τεχνητής νοημοσύνης μελετούν δεδομένα προηγούμενων εκτελέσεων για να προβλέψουν αποτυχίες, να θέσουν σε καραντίνα ασταθείς δοκιμές και να αναδιατάξουν τις αργές. Πλατφόρμες όπως το Launchable, Testimκαι συνδέστε το mabl σε TestNG επομένως οι πιο πιθανές σουίτες που αποτυγχάνουν εκτελούνται πρώτες, γεγονός που μειώνει τους βρόχους ανατροφοδότησης σε διακομιστές συνεχούς ενοποίησης.

Ναι. Τα χρονοπρογραμματιστές που βασίζονται στην τεχνητή νοημοσύνη στα Launchable και BuildPulse μετρούν την ιστορική διάρκεια και τον ρυθμό διακοπής λειτουργίας ανά δοκιμή και, στη συνέχεια, χωρίζουν το testng.xml σε ισορροπημένα shards. Κάθε shard εκτελείται σε ξεχωριστό agent, επομένως ο συνολικός χρόνος χρονισμού μειώνεται ενώ η παράλληλη χρήση παραμένει υψηλή.

Συνοψίστε αυτήν την ανάρτηση με: