Πάροχος Δεδομένων σε TestNG: Selenium Παράδειγμα παραμετροποίησης

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

Παραμετροποίηση σε Selenium Εκτελεί επανειλημμένα μια ενιαία μέθοδο δοκιμής σε διαφορετικά σύνολα δεδομένων, μετατρέποντας ένα σενάριο σε κάλυψη που βασίζεται σε δεδομένα. TestNG προσφέρει δύο μηχανισμούς για αυτό: την σχολίαση @Parameters που υποστηρίζεται από το testng.xml και την σχολίαση @DataProvider που επιστρέφει έναν πίνακα δισδιάστατων αντικειμένων.

  • 🎯 Βασικός Σκοπός: Η παραμετροποίηση αφαιρεί τις ενσωματωμένες τιμές από τα σενάρια δοκιμών, έτσι ώστε η ίδια λογική να επικυρώνει κάθε συνδυασμό εισόδου που πρέπει να υποστηρίζει η εφαρμογή.
  • 📄 Μηχανισμός XML: Η σχολίαση @Parameters διαβάζει ζεύγη ονόματος-τιμής που δηλώνονται στο testng.xml, κάτι που ταιριάζει σε εισόδους τύπου διαμόρφωσης όπου ο αριθμός των συνδυασμών παραμένει μικρός.
  • 🏷️ Προτεραιότητα πεδίου εφαρμογής: Οι παράμετροι που δηλώνονται σε επίπεδο δοκιμής αντικαθιστούν τις παραμέτρους με το ίδιο όνομα σε επίπεδο σουίτας, ενώ οι κλάσεις εκτός αυτής της δοκιμής συνεχίζουν να διαβάζουν την τιμή της σουίτας.
  • 🗂️ Μηχανισμός Παρόχου Δεδομένων: Μια μέθοδος με σχολιασμό @DataProvider επιστρέφει Object[][], και TestNG καλεί το test μία φορά ανά γραμμή, περνώντας κάθε στήλη ως όρισμα.
  • 🔗 Εξωτερικοί Πάροχοι: Η επισήμανση του παρόχου ως στατικού και ο ορισμός της dataProviderClass στο @Test επιτρέπει σε πολλές κλάσεις δοκιμών να μοιράζονται μία πηγή δεδομένων.
  • 🧭 Δυναμικά σύνολα δεδομένων: Η αποδοχή της μεθόδου ή του ITestContext ως ορίσματος παρόχου επιστρέφει διαφορετικά δεδομένα ανά μέθοδο δοκιμής ή ανά συμπεριλαμβανόμενη ομάδα.
  • Συνήθεις βλάβες: Οι αναντιστοιχίες τύπων μεταξύ των τιμών XML και των ορισμάτων της μεθόδου, καθώς και οι ελλείπουσες παράμετροι που επιλύονται με το @Optional, προκαλούν τα περισσότερα σφάλματα σχολιασμού.

Πάροχος Δεδομένων σε TestNG

Καθώς δημιουργούμε λογισμικό, θέλουμε πάντα να λειτουργεί σωστά με διαφορετικά σύνολα δεδομένων. Όσον αφορά δοκιμών Σε αυτό το λογισμικό, ο έλεγχος ενός μόνο συνόλου δεδομένων δεν είναι αρκετός. Πρέπει να επαληθεύσουμε ότι το σύστημα δέχεται κάθε συνδυασμό που αναμένεται να υποστηρίξει. Για αυτό, πρέπει να παραμετροποιήσουμε τα σενάρια δοκιμών μας. Εδώ ακριβώς έρχεται η παραμετροποίηση.

Παραμετροποίηση σε Selenium

Παραμετροποίηση σε Selenium είναι μια διαδικασία παραμετροποίησης των δοκιμαστικών σεναρίων προκειμένου να περάσουν πολλά δεδομένα στην εφαρμογή κατά το χρόνο εκτέλεσης. Είναι μια στρατηγική εκτέλεσης που εκτελεί αυτόματα δοκιμαστικές περιπτώσεις πολλές φορές χρησιμοποιώντας διαφορετικές τιμές. Η έννοια που επιτυγχάνεται με την παραμετροποίηση των σεναρίων δοκιμής ονομάζεται Δοκιμές βάσει δεδομένων.

Τύπος παραμετροποίησης σε TestNG

Για να κάνουμε την παραμετροποίηση πιο σαφή, θα εξετάσουμε τις επιλογές παραμετροποίησης σε ένα από τα πιο δημοφιλή πλαίσια για Selenium Πρόγραμμα οδήγησης ιστού — TestNG.

Υπάρχουν δύο τρόποι με την οποία μπορούμε να επιτύχουμε παραμετροποίηση σε TestNG:

  1. Με τη βοήθεια του Σχολιασμός παραμέτρων και την TestNG XML αρχείο.

Τύπος παραμετροποίησης In TestNG

  1. Με τη βοήθεια του DataProvider σχόλιο.

Τύπος παραμετροποίησης In TestNG

Τύπος παραμετροποίησης In TestNG

Το παραπάνω διάγραμμα συνοψίζει τη διαίρεση: οι παράμετροι από το testng.xml μπορούν να δηλωθούν σε επίπεδο suite ή test, ενώ μια παράμετρος από ένα DataProvider μπορεί να δεχτεί Method και ITestContext ως δικό του επιχείρημα. Ας τα μελετήσουμε λεπτομερώς.

Σχολιασμός παραμέτρων σε TestNG

Σχολιασμός παραμέτρων σε TestNG είναι μια μέθοδος που χρησιμοποιείται για τη μεταβίβαση τιμών στις μεθόδους δοκιμής ως ορίσματα χρησιμοποιώντας ένα αρχείο .xml. Ενδέχεται να απαιτείται από τους χρήστες να μεταβιβάσουν τις τιμές στις μεθόδους δοκιμής κατά τη διάρκεια της εκτέλεσης. Η μέθοδος σχολιασμού @Parameters μπορεί να χρησιμοποιηθεί σε οποιαδήποτε μέθοδο που έχει σχολιασμό @Test, @Before, @After ή @Factory.

Σχολιασμός παραμέτρων με Testng.xml

Επιλέξτε παραμετροποίηση χρησιμοποιώντας σχολιασμούς όταν δεν θέλετε να αντιμετωπίσετε πολυπλοκότητα και ο αριθμός των συνδυασμών εισόδου είναι μικρός.

Ας δούμε πώς λειτουργεί αυτό.

Σενάριο δοκιμής

Βήμα 1) Ανοίξτε το πρόγραμμα περιήγησης και μεταβείτε στο Google.com

Βήμα 2) Εισαγάγετε μια λέξη-κλειδί αναζήτησης

Σχολιασμός παραμέτρων με Testng.Xml

Βήμα 3) Επαληθεύστε ότι η τιμή που εισαγάγατε είναι η ίδια με την τιμή που παρέχεται από τα δεδομένα δοκιμής μας

Βήμα 4) Επαναλάβετε τα βήματα 2 και 3 μέχρι να εισαχθούν όλες οι τιμές

Συγγραφέας δοκιμής SearchKey
Guru99 India
Krishna ΗΠΑ
Μπουπές Κίνα

Ακολουθεί ένα παράδειγμα για το πώς να το κάνετε without παραμέτρους:

package parameters;

import org.testng.annotations.Test;
import org.testng.AssertJUnit;
import java.time.Duration;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;

public class NoParameterWithTestNGXML {
    WebDriver driver;

    @Test
    public void testNoParameter() throws InterruptedException {
        String author = "guru99";
        String searchKey = "india";

        driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));

        driver.get("https://google.com");
        WebElement searchText = driver.findElement(By.name("q"));
        // Searching text in the Google text box
        searchText.sendKeys(searchKey);

        System.out.println("Welcome ->" + author + " Your search key is->" + searchKey);
        Thread.sleep(3000);
        System.out.println("Value in Google Search Box = " + searchText.getDomProperty("value")
                + " ::: Value given by input = " + searchKey);
        // Verifying the value in the Google search box
        AssertJUnit.assertTrue(searchText.getDomProperty("value").equalsIgnoreCase(searchKey));
    }
}

⚠️ Selenium Σημείωση 4: Τρεις γραμμές στην αρχική έκδοση αυτού του παραδείγματος δεν μεταγλωττίζονται πλέον ή δεν χρησιμοποιούνται πλέον στην τρέχουσα έκδοση. Selenium κυκλοφορίες. System.setProperty("webdriver.gecko.driver", …) είναι περιττό από Selenium 4.6 και μετά επειδή Selenium Ο διαχειριστής επιλύει αυτόματα το δυαδικό αρχείο του προγράμματος οδήγησης. implicitlyWait(10, TimeUnit.SECONDS) η υπερφόρτωση αφαιρέθηκε Selenium 4 και αντικαταστάθηκε από implicitlyWait(Duration.ofSeconds(10)). getAttribute() είχε καταργηθεί το Selenium 4.27, επομένως η ανάγνωση ενός πλαισίου κειμένου χρησιμοποιεί getDomProperty("value")Κάθε παρακάτω παράδειγμα εφαρμόζει τις ίδιες τρεις διορθώσεις.

Μελετήστε το παραπάνω παράδειγμα και φανταστείτε πόσο πολύπλοκος γίνεται ο κώδικας όταν αυτό επαναλαμβάνεται για τρεις συνδυασμούς εισόδου.

Τώρα ας το παραμετροποιήσουμε χρησιμοποιώντας TestNGΓια να το κάνετε αυτό, πρέπει να:

  • Δημιουργήστε ένα αρχείο XML που θα αποθηκεύει τις παραμέτρους
  • Στη δοκιμή, προσθέστε την σχολίαση @Parameters

Σχολιασμός παραμέτρων με Testng.Xml

Εδώ είναι ο πλήρης κώδικας.

Επίπεδο δοκιμής TestNG. Xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="TestSuite" thread-count="3">
  <parameter name="author" value="Guru99" />
  <parameter name="searchKey" value="India" />
  <test name="testGuru">
    <parameter name="searchKey" value="UK" />
    <classes>
      <class name="parameters.ParameterWithTestNGXML"></class>
    </classes>
  </test>
</suite>

ΠαράμετροςΜεTestNGΑρχείο XML.java

package parameters;

import org.testng.AssertJUnit;
import java.time.Duration;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;

import org.testng.annotations.Optional;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

public class ParameterWithTestNGXML {
    WebDriver driver;

    @Test
    @Parameters({"author", "searchKey"})
    public void testParameterWithXML(@Optional("Abc") String author, String searchKey)
            throws InterruptedException {

        driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
        driver.get("https://google.com");

        WebElement searchText = driver.findElement(By.name("q"));
        // Searching text in the Google text box
        searchText.sendKeys(searchKey);

        System.out.println("Welcome ->" + author + " Your search key is->" + searchKey);
        Thread.sleep(3000);
        System.out.println("Value in Google Search Box = " + searchText.getDomProperty("value")
                + " ::: Value given by input = " + searchKey);
        // Verifying the value in the Google search box
        AssertJUnit.assertTrue(searchText.getDomProperty("value").equalsIgnoreCase(searchKey));
    }
}

Για να εκτελέσετε το σενάριο, επιλέξτε το αρχείο XML και εκτελέστε το ως TestNG για.

Κάντε δεξί κλικ στο αρχείο .xml -> Εκτέλεση ως -> TestNG Σουίτα (Σημείωση: Σουίτα)

ΠαράμετροςΜεTestNGΑρχείο XML.java

Οι παράμετροι μπορούν να οριστούν σε δύο επίπεδα:

  1. Επίπεδο σουίτας — οι παράμετροι εντός του <suite> ετικέτα του TestNG Τα αρχεία XML είναι παράμετροι επιπέδου σουίτας.
  2. Επίπεδο δοκιμής — οι παράμετροι εντός του <test> ετικέτα του TestNG Το αρχείο XML είναι παράμετροι επιπέδου δοκιμής.

Ακολουθεί η ίδια δοκιμή με παραμέτρους επιπέδου σουίτας:

ΠαράμετροςΜεTestNGΑρχείο XML.java

ΣΗΜΕΊΩΣΗ: Εάν το όνομα της παραμέτρου είναι το ίδιο σε επίπεδο σουίτας και σε επίπεδο δοκιμής, η παράμετρος επιπέδου δοκιμής έχει προτεραιότητα έναντι της παραμέτρου επιπέδου σουίτας ένα. Σε αυτήν την περίπτωση, όλες οι κλάσεις εντός αυτού του επιπέδου δοκιμής μοιράζονται την παράμετρο που έχει παρακαμφθεί και οι κλάσεις εκτός αυτού του επιπέδου δοκιμής συνεχίζουν να χρησιμοποιούν την παράμετρο επιπέδου σουίτας.

ΠαράμετροςΜεTestNGΑρχείο XML.java

Αντιμετώπιση προβλημάτων

Τεύχος # 1: Μια τιμή παραμέτρου στο testng.xml που δεν μπορεί να μετατραπεί σε τυποποίηση στην αντίστοιχη παράμετρο της μεθόδου δοκιμής εμφανίζει σφάλμα.

Εξετάστε το ακόλουθο παράδειγμα:

Αντιμετώπιση προβλημάτων

Εδώ, το χαρακτηριστικό 'author' ισούται με 'Guru99', το οποίο είναι μια συμβολοσειρά, ενώ η αντίστοιχη μέθοδος δοκιμής αναμένει μια ακέραια τιμή, επομένως δημιουργείται μια εξαίρεση.

Τεύχος # 2: Οι @Parameters σας δεν έχουν αντίστοιχη τιμή στο testng.xml.

Μπορείτε να το λύσετε αυτό προσθέτοντας το @Προαιρετική σχολίαση στην αντίστοιχη παράμετρο στη μέθοδο δοκιμής.

Αντιμετώπιση προβλημάτων

Τεύχος # 3: Θέλετε να δοκιμάσετε πολλαπλές τιμές της ίδιας παραμέτρου χρησιμοποιώντας το testng.xml.

Η απλή απάντηση είναι ότι αυτό δεν μπορεί να γίνει. Μπορείτε να έχετε πολλές διαφορετικές παραμέτρους, αλλά κάθε παράμετρος μπορεί να περιέχει μόνο μία τιμή. Αυτό αποτρέπει την ενσωμάτωση τιμών στο σενάριο και διατηρεί τον κώδικα επαναχρησιμοποιήσιμο — σκεφτείτε το ως ένα αρχείο ρυθμίσεων για το σενάριο σας. Εάν χρειάζεστε πολλές τιμές για μία παράμετρο, χρησιμοποιήστε ένα DataProvider.

Πάροχος δεδομένων σε TestNG

Πάροχος δεδομένων σε TestNG είναι μια μέθοδος που χρησιμοποιείται όταν ένας χρήστης χρειάζεται να περάσει σύνθετες παραμέτρους. Οι σύνθετες παράμετροι πρέπει να δημιουργηθούν από Java — σύνθετα αντικείμενα, αντικείμενα από αρχεία ιδιοτήτων ή αντικείμενα από μια βάση δεδομένων μπορούν να διαβιβαστούν με τη μέθοδο data provider. Η μέθοδος σχολιάζεται με @DataProvider και επιστρέφει έναν πίνακα αντικειμένων.

Παράμετροι με χρήση του Dataprovider

Η σχολίαση @Parameters είναι εύκολη, αλλά για να δοκιμάσουμε με πολλαπλά σύνολα δεδομένων πρέπει να χρησιμοποιήσουμε έναν πάροχο δεδομένων.

Για να συμπληρώσουμε χιλιάδες διαδικτυακές φόρμες χρησιμοποιώντας το πλαίσιο δοκιμών μας, χρειαζόμαστε μια διαφορετική μεθοδολογία που μπορεί να παρέχει ένα πολύ μεγάλο σύνολο δεδομένων σε μία μόνο ροή εκτέλεσης.

Αυτή η ιδέα που βασίζεται σε δεδομένα επιτυγχάνεται με την @DataProvider σχολιασμός σε TestNG.

Παράμετροι με χρήση του Dataprovider

Έχει μόνο ένα χαρακτηριστικό, «όνομα»Εάν δεν καθορίσετε το χαρακτηριστικό name, το όνομα του DataProvider είναι το ίδιο με το αντίστοιχο όνομα μεθόδου.

Ένας πάροχος δεδομένων επιστρέφει ένα δισδιάστατο Java αντικείμενο στη μέθοδο δοκιμής και η μέθοδος δοκιμής καλείται M φορές για έναν πίνακα αντικειμένων M×N. Για παράδειγμα, εάν το DataProvider επιστρέψει έναν πίνακα 2×3 αντικειμένων, η αντίστοιχη περίπτωση δοκιμής καλείται 2 φορές με 3 παραμέτρους κάθε φορά.

Παράμετροι με χρήση του Dataprovider

Πλήρες Παράδειγμα

Παράμετροι με χρήση του Dataprovider

package parameters;

import java.time.Duration;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;

import org.testng.Assert;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class ParameterByDataprovider {
    WebDriver driver;

    @BeforeTest
    public void setup() {
        // Create the Firefox driver object
        driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
        driver.get("https://google.com");
    }

    /** Test case to verify the Google search box */
    @Test(dataProvider = "SearchProvider")
    public void testMethod(String author, String searchKey) throws InterruptedException {
        WebElement searchText = driver.findElement(By.name("q"));
        // Search value in the Google search box
        searchText.sendKeys(searchKey);
        System.out.println("Welcome ->" + author + " Your search key is->" + searchKey);
        Thread.sleep(3000);
        String testValue = searchText.getDomProperty("value");
        System.out.println(testValue + "::::" + searchKey);
        searchText.clear();
        // Verify if the value in the Google search box is correct
        Assert.assertTrue(testValue.equalsIgnoreCase(searchKey));
    }

    /**
     * @return Object[][] where the first column contains 'author'
     * and the second column contains 'searchKey'
     */
    @DataProvider(name = "SearchProvider")
    public Object[][] getDataFromDataprovider() {
        return new Object[][] {
            { "Guru99", "India" },
            { "Krishna", "UK" },
            { "Bhupesh", "USA" }
        };
    }
}

Κλήση DataProvider από διαφορετική κλάση

Από προεπιλογή, ένας DataProvider βρίσκεται στην ίδια κλάση με τη μέθοδο δοκιμής ή στη βασική της κλάση. Για να τον τοποθετήσετε σε άλλη κλάση, ορίστε τη μέθοδο data provider στατικός και προσθέστε το χαρακτηριστικό dataProviderClass στο @Δοκιμή σχόλιο.

Κλήση DataProvider από διαφορετική κλάση

Code Παράδειγμα

Κλήση DataProvider από διαφορετική κλάση

TestClass ParameterDataproviderWithClassLevel.java

package parameters;

import java.time.Duration;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

public class ParameterDataproviderWithClassLevel {
    WebDriver driver;

    @BeforeTest
    public void setup() {
        driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
        driver.get("https://google.com");
    }

    @Test(dataProvider = "SearchProvider", dataProviderClass = DataproviderClass.class)
    public void testMethod(String author, String searchKey) throws InterruptedException {
        WebElement searchText = driver.findElement(By.name("q"));
        // Search text in the Google text box
        searchText.sendKeys(searchKey);
        System.out.println("Welcome ->" + author + " Your search key is->" + searchKey);
        Thread.sleep(3000);
        // Get text from the search box
        String testValue = searchText.getDomProperty("value");
        System.out.println(testValue + "::::" + searchKey);
        searchText.clear();
        // Verify if the search box has the correct value
        Assert.assertTrue(testValue.equalsIgnoreCase(searchKey));
    }
}

DataproviderClass.java

package parameters;

import org.testng.annotations.DataProvider;

public class DataproviderClass {

    @DataProvider(name = "SearchProvider")
    public static Object[][] getDataFromDataprovider() {
        return new Object[][] {
            { "Guru99", "India" },
            { "Krishna", "UK" },
            { "Bhupesh", "USA" }
        };
    }
}

Τύποι παραμέτρων στον Dataprovider

Υπάρχουν δύο τύποι παραμέτρων που υποστηρίζονται από τη μέθοδο DataProvider.

Μέθοδος — εάν το ίδιο Το DataProvider θα πρέπει να συμπεριφέρεται διαφορετικά για διαφορετικές μεθόδους δοκιμής, χρησιμοποιήστε την παράμετρο Method.

Τύποι παραμέτρων στον Dataprovider

Στο ακόλουθο παράδειγμα:

  • Ελέγχουμε αν το όνομα της μεθόδου είναι testMethodA
  • Εάν ναι, επιστρέψτε ένα σύνολο τιμών
  • Διαφορετικά, επιστρέψτε ένα άλλο σύνολο τιμών
package parameters;

import java.lang.reflect.Method;
import java.time.Duration;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class ParameterByMethodInDataprovider {

    WebDriver driver;

    @BeforeTest
    public void setup() {
        driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
        driver.get("https://google.com");
    }

    @Test(dataProvider = "SearchProvider")
    public void testMethodA(String author, String searchKey) throws InterruptedException {
        WebElement searchText = driver.findElement(By.name("q"));
        searchText.sendKeys(searchKey);
        // Print author and search string
        System.out.println("Welcome ->" + author + " Your search key is->" + searchKey);
        Thread.sleep(3000);
        String testValue = searchText.getDomProperty("value");
        System.out.println(testValue + "::::" + searchKey);
        searchText.clear();
        Assert.assertTrue(testValue.equalsIgnoreCase(searchKey));
    }

    @Test(dataProvider = "SearchProvider")
    public void testMethodB(String searchKey) throws InterruptedException {
        WebElement searchText = driver.findElement(By.name("q"));
        searchText.sendKeys(searchKey);
        // Print only the search string
        System.out.println("Welcome ->Unknown user Your search key is->" + searchKey);
        Thread.sleep(3000);
        String testValue = searchText.getDomProperty("value");
        System.out.println(testValue + "::::" + searchKey);
        searchText.clear();
        Assert.assertTrue(testValue.equalsIgnoreCase(searchKey));
    }

    /** The DataProvider returns values based on the test method name */
    @DataProvider(name = "SearchProvider")
    public Object[][] getDataFromDataprovider(Method m) {
        if (m.getName().equalsIgnoreCase("testMethodA")) {
            return new Object[][] {
                { "Guru99", "India" },
                { "Krishna", "UK" },
                { "Bhupesh", "USA" }
            };
        } else {
            return new Object[][] {
                { "Canada" },
                { "Russia" },
                { "Japan" }
            };
        }
    }
}

Εδώ είναι η έξοδος:

Τύποι παραμέτρων στον Dataprovider

ITestContext — αυτό μπορεί να χρησιμοποιηθεί για τη δημιουργία διαφορετικών παραμέτρων για δοκιμαστικές περιπτώσεις με βάση ομάδες.

Στην πραγματική ζωή, μπορείτε να χρησιμοποιήσετε το ITestContext για να μεταβάλλετε τις τιμές των παραμέτρων με βάση μεθόδους δοκιμής, κεντρικούς υπολογιστές ή διαμορφώσεις δοκιμών.

Τύποι παραμέτρων στον Dataprovider

Στο ακόλουθο παράδειγμα κώδικα:

  • Έχουμε 2 ομάδες, Α και Β
  • Κάθε μέθοδος δοκιμής εκχωρείται σε μια ομάδα
  • Εάν η τιμή ομάδας είναι A, επιστρέφεται ένα σύνολο δεδομένων
  • Εάν η τιμή ομάδας είναι B, επιστρέφεται ένα άλλο σύνολο δεδομένων
package parameters;

import java.time.Duration;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.ITestContext;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class ParameterByITestContextInDataprovider {
    WebDriver driver;

    @BeforeTest(groups = {"A", "B"})
    public void setup() {
        driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
        driver.get("https://google.com");
    }

    @Test(dataProvider = "SearchProvider", groups = "A")
    public void testMethodA(String author, String searchKey) throws InterruptedException {
        WebElement searchText = driver.findElement(By.name("q"));
        searchText.sendKeys(searchKey);
        System.out.println("Welcome ->" + author + " Your search key is->" + searchKey);
        Thread.sleep(3000);
        String testValue = searchText.getDomProperty("value");
        System.out.println(testValue + "::::" + searchKey);
        searchText.clear();
        Assert.assertTrue(testValue.equalsIgnoreCase(searchKey));
    }

    @Test(dataProvider = "SearchProvider", groups = "B")
    public void testMethodB(String searchKey) throws InterruptedException {
        WebElement searchText = driver.findElement(By.name("q"));
        searchText.sendKeys(searchKey);
        System.out.println("Welcome ->Unknown user Your search key is->" + searchKey);
        Thread.sleep(3000);
        String testValue = searchText.getDomProperty("value");
        System.out.println(testValue + "::::" + searchKey);
        searchText.clear();
        Assert.assertTrue(testValue.equalsIgnoreCase(searchKey));
    }

    /** The DataProvider supplies an Object array based on ITestContext */
    @DataProvider(name = "SearchProvider")
    public Object[][] getDataFromDataprovider(ITestContext c) {
        Object[][] groupArray = null;
        for (String group : c.getIncludedGroups()) {
            if (group.equalsIgnoreCase("A")) {
                groupArray = new Object[][] {
                    { "Guru99", "India" },
                    { "Krishna", "UK" },
                    { "Bhupesh", "USA" }
                };
                break;
            } else if (group.equalsIgnoreCase("B")) {
                groupArray = new Object[][] {
                    { "Canada" },
                    { "Russia" },
                    { "Japan" }
                };
                break;
            }
        }
        return groupArray;
    }
}

Σημείωση: Εάν εκτελέσετε το TestNG κλάσης απευθείας, καλεί πρώτα τον πάροχο δεδομένων και ο πάροχος δεν μπορεί να διαβάσει τις πληροφορίες ομάδας επειδή οι ομάδες δεν είναι ακόμη διαθέσιμες. Η κλήση της κλάσης μέσω του testng.xml καθιστά τις πληροφορίες ομάδας διαθέσιμες μέσω του ITestContext. Χρησιμοποιήστε το ακόλουθο XML για να εκτελέσετε τη δοκιμή:

<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="test-parameter">

  <test name="example1">
    <groups>
      <run>
        <include name="A" />
      </run>
    </groups>
    <classes>
      <class name="parameters.ParameterByITestContextInDataprovider" />
    </classes>
  </test>

  <test name="example2">
    <groups>
      <run>
        <include name="B" />
      </run>
    </groups>
    <classes>
      <class name="parameters.ParameterByITestContextInDataprovider" />
    </classes>
  </test>

</suite>

Και οι δύο μηχανισμοί καλύπτονται πλέον, επομένως το πρακτικό ερώτημα είναι ποιος να επιλέξουμε.

@Parameters vs @DataProvider: Ποιο να χρησιμοποιήσετε

Οι δύο προσεγγίσεις δεν είναι εναλλάξιμες. Η απόφαση εξαρτάται από το πόσους συνδυασμούς τιμών χρειάζεται μια δοκιμή και από πού προέρχονται αυτές οι τιμές.

Κριτήριο @Παράμετροι + testng.xml @DataProvider
Τιμές ανά παράμετρο Ακριβώς ένα Απεριόριστες σειρές
Πηγή δεδομένων Στατικό κείμενο στο αρχείο XML Java κώδικας, Excel, CSV, βάση δεδομένων, API
Υποστηριζόμενοι τύποι Τυποποίηση τιμών από συμβολοσειρά Κάθε Java αντικείμενο
Κλήσεις δοκιμών Μία φορά ανά διαμόρφωση Μία φορά ανά γραμμή δεδομένων
Η αλλαγή δεδομένων απαιτεί Επεξεργασία του αρχείου XML Επεξεργασία του πηγαίου κώδικα, συχνά χωρίς επαναμεταγλώττιση
κατάλληλο για Τιμές περιβάλλοντος και διαμόρφωσης, όπως πρόγραμμα περιήγησης, URL, διαπιστευτήρια Δοκιμές βάσει δεδομένων σε πολλούς συνδυασμούς εισόδου

Στην πράξη, οι περισσότερες σουίτες χρησιμοποιούν και τα δύο: το @Parameters μεταφέρει τις ρυθμίσεις περιβάλλοντος που παραμένουν σταθερές σε όλη την εκτέλεση και το @DataProvider παρέχει τα ποικίλα επιχειρηματικά δεδομένα. Όταν το σύνολο δεδομένων ξεπεράσει έναν σκληρό κώδικα πίνακα, το επόμενο βήμα είναι η ανάγνωσή του από ένα υπολογιστικό φύλλο.

Πώς να διαβάσετε δεδομένα δοκιμής από ένα αρχείο Excel χρησιμοποιώντας το DataProvider

Οι σκληροκωδικοποιημένοι πίνακες σταματούν να κλιμακώνονται μόλις οι δοκιμαστές που δεν γράφουν Java ανάγκη διατήρησης των δεδομένων. Η μετακίνηση των γραμμών σε ένα υπολογιστικό φύλλο διαχωρίζει τα δεδομένα δοκιμών από τη λογική των δοκιμών, η οποία είναι η πρακτική μορφή δοκιμές βάσει δεδομένωνΤο Apache POI διαβάζει το βιβλίο εργασίας και το DataProvider μετατρέπει κάθε γραμμή σε μία δοκιμαστική κλήση.

  1. Προσθέστε την εξάρτηση. Συμπεριλάβετε org.apache.poi:poi-ooxml στο Maven σας ή Gradle κατασκευή. Το ooxml Το artifact χειρίζεται τη μορφή .xlsx. απλό poi Διαβάζει μόνο παλαιότερα αρχεία .xls.
  2. Δημιουργήστε το βιβλίο εργασίας. Τοποθετήστε τη γραμμή κεφαλίδας στη γραμμή 0 και μία περίπτωση δοκιμής ανά γραμμή από κάτω της, με μία στήλη ανά όρισμα μεθόδου δοκιμής.
  3. Διαβάστε το φύλλο σε έναν πίνακα. Προσαρμόστε το μέγεθος του αντικειμένου[][] από τον αριθμό των γραμμών και των κελιών, ώστε να επιλέγονται νέες γραμμές χωρίς αλλαγές στον κώδικα.
  4. Επιστρέψτε το από τον πάροχο. Η υπογραφή της μεθόδου δοκιμής παραμένει ακριβώς όπως πριν.
import java.io.FileInputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.testng.annotations.DataProvider;

public class ExcelDataProvider {

    @DataProvider(name = "SearchProvider")
    public Object[][] readSearchData() throws Exception {
        FileInputStream file = new FileInputStream("src/test/resources/testdata.xlsx");
        Workbook workbook = new XSSFWorkbook(file);
        Sheet sheet = workbook.getSheetAt(0);

        // Skip the header row, so subtract one from the physical row count
        int rows = sheet.getLastRowNum();
        int cols = sheet.getRow(0).getPhysicalNumberOfCells();
        Object[][] data = new Object[rows][cols];

        for (int i = 1; i <= rows; i++) {
            for (int j = 0; j < cols; j++) {
                data[i - 1][j] = sheet.getRow(i).getCell(j).getStringCellValue();
            }
        }
        workbook.close();
        file.close();
        return data;
    }
}

💡 Συμβουλές: Καλέστε getStringCellValue() μόνο σε κελιά με μορφοποίηση κειμένου. Ένα αριθμητικό κελί IllegalStateException, η οποία είναι η πιο συνηθισμένη αποτυχία όταν ένα υπολογιστικό φύλλο περιέχει αναγνωριστικά ή ποσά. Χρησιμοποιήστε ένα DataFormatter για να διαβάσετε κάθε τύπο κελιού ως συμβολοσειρά ή να ενεργοποιήσετε cell.getCellType() και μετατρέψτε ρητά.

Με τα δεδομένα να εξωτερικεύονται, η προσθήκη εκατό ακόμη περιπτώσεων δοκιμών γίνεται επεξεργασία υπολογιστικού φύλλου και όχι αλλαγή κώδικα, και ο ίδιος πάροχος μπορεί να τροφοδοτήσει πολλές κλάσεις δοκιμών μέσω του dataProviderClass χαρακτηριστικό που παρουσιάστηκε νωρίτερα.

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

Ναι. Ρύθμιση @DataProvider(name="x", parallel=true) εκτελεί τις γραμμές ταυτόχρονα. Κάθε νήμα χρειάζεται τη δική του παρουσία WebDriver, επομένως αποθηκεύστε το πρόγραμμα οδήγησης σε ένα ThreadLocal, διαφορετικά οι δοκιμές αλληλεπιδρούν μεταξύ τους.

Ναί. TestNG αποδέχεται Iterator<Object[]>, η οποία παρέχει γραμμές αργά αντί να δημιουργεί ολόκληρο τον πίνακα στη μνήμη. Αυτό ταιριάζει σε πολύ μεγάλα σύνολα δεδομένων ή γραμμές που ρέουν από έναν κέρσορα βάσης δεδομένων.

Ναί. AI Τα εργαλεία δημιουργούν οριακές τιμές, μη έγκυρες εισόδους και ρεαλιστικές συνθετικές εγγραφές από μια προδιαγραφή πεδίου. RevΕλέγξτε την έξοδο για διπλότυπα και επιβεβαιώστε ότι τα αναμενόμενα αποτελέσματα είναι σωστά πριν προσθέσετε γραμμές στον πάροχο.

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

Οι τιμές στο testng.xml διαβάζονται πάντα ως κείμενο. TestNG τα μετατρέπει στον δηλωμένο τύπο ορίσματος, επομένως μια μη αριθμητική τιμή που είναι συνδεδεμένη με ένα όρισμα int αποτυγχάνει. Αντιστοιχίστε την τιμή XML με την υπογραφή της μεθόδου ή αποδεχτείτε μια συμβολοσειρά και αναλύστε την.

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