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

TestNG σας επιτρέπει να εκτελείτε μεθόδους δοκιμών, κλάσεις και πλήρεις σουίτες παράλληλα μέσα σε ένα έργο. Η παράλληλη εκτέλεση μειώνει τον συνολικό χρόνο εκτέλεσης επειδή τα νήματα ξεκινούν τις δοκιμές ταυτόχρονα αντί για το ένα μετά το άλλο. Αυτός ο οδηγός εξηγεί πώς να εκτελέσετε πολλαπλές κλάσεις (διαφορετικές σουίτες) χρησιμοποιώντας TestNG 7.x με Selenium WebDriver.
Βήμα 1) Δημιουργία α TestNGΑρχείο .xml για την εκτέλεση δοκιμών
Για να δημιουργήσετε τη διαμόρφωση, ακολουθήστε τα παρακάτω βήματα.
- Δημιουργήστε ένα νέο έργο στο Eclipse.
- Δημιουργήστε δύο πακέτα στο έργο (ονομάστε τα com.suite1 και com.suite2).
- Δημιουργήστε μια κλάση σε κάθε πακέτο (ονομάστε την Flipkart.java και Snapdeal.java) και αντιγράψτε τον παρακάτω κώδικα στις αντίστοιχες κλάσεις.
- Δημιουργήστε ένα νέο αρχείο στο έργο σας και ονομάστε το 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>
Η τελική δομή του έργου μοιάζει με το παρακάτω παράδειγμα.
Βήμα 2) Παράλληλη εκτέλεση σε TestNG
Αφού αποθηκεύσετε το παραπάνω αρχείο XML, το επόμενο βήμα είναι να εκτελέσετε τις παράλληλες δοκιμές. Ο κώδικας φαίνεται παρακάτω.
1) αριθμός νημάτων: Ορίζει τον αριθμό των νημάτων TestNG μπορεί να περιστραφεί για παράλληλη εκτέλεση. Μια υψηλότερη τιμή εκτελεί περισσότερες δοκιμές ταυτόχρονα, μέχρι το όριο της CPU.
2) πολυλεκτικόςΚαταγράφει λεπτομέρειες εκτέλεσης στην κονσόλα. Οι επιτρεπόμενες τιμές κυμαίνονται από 1 έως 10. Οι υψηλότερες τιμές παράγουν πιο λεπτομερή και λεπτομερή αρχεία καταγραφής.
3) όνομα: Όνομα της σουίτας. Ορίστε το «Gmail Σουίτα".
4) παράλληλο: Λέει TestNG τι να εκτελεστεί ταυτόχρονα. Οι έγκυρες τιμές είναι δοκιμές, κλάσεις, μέθοδοι ή στιγμιότυπα. Η προεπιλεγμένη τιμή είναι κανένας.
Κάντε δεξί κλικ στο αρχείο testng.xml και επιλέξτε Εκτέλεση ως > TestNG ΣουίταΜόλις ολοκληρωθεί, θα δείτε τα συγκεντρωτικά αποτελέσματα.
Όταν εκτελέσετε τον παραπάνω κώδικα, θα λάβετε την ακόλουθη έξοδο.
Παραγωγή:
1) Όνομα της σουίτας που ορίζεται στο testng.xml.
2) Όνομα της δοκιμής που ορίζεται στο testng.xml.
3) Όνομα της κλάσης που δηλώνεται στο testng.xml.
4) Ονόματα μεθόδων με σχολιασμό @Test στο αρχείο .java.
Η ίδια ροή εκτελείται για τη δοκιμή 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 τα έργα ολοκληρώνονται πολύ πιο γρήγορα.




