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

Καθώς δημιουργούμε λογισμικό, θέλουμε πάντα να λειτουργεί σωστά με διαφορετικά σύνολα δεδομένων. Όσον αφορά δοκιμών Σε αυτό το λογισμικό, ο έλεγχος ενός μόνο συνόλου δεδομένων δεν είναι αρκετός. Πρέπει να επαληθεύσουμε ότι το σύστημα δέχεται κάθε συνδυασμό που αναμένεται να υποστηρίξει. Για αυτό, πρέπει να παραμετροποιήσουμε τα σενάρια δοκιμών μας. Εδώ ακριβώς έρχεται η παραμετροποίηση.
Παραμετροποίηση σε Selenium
Παραμετροποίηση σε Selenium είναι μια διαδικασία παραμετροποίησης των δοκιμαστικών σεναρίων προκειμένου να περάσουν πολλά δεδομένα στην εφαρμογή κατά το χρόνο εκτέλεσης. Είναι μια στρατηγική εκτέλεσης που εκτελεί αυτόματα δοκιμαστικές περιπτώσεις πολλές φορές χρησιμοποιώντας διαφορετικές τιμές. Η έννοια που επιτυγχάνεται με την παραμετροποίηση των σεναρίων δοκιμής ονομάζεται Δοκιμές βάσει δεδομένων.
Τύπος παραμετροποίησης σε TestNG
Για να κάνουμε την παραμετροποίηση πιο σαφή, θα εξετάσουμε τις επιλογές παραμετροποίησης σε ένα από τα πιο δημοφιλή πλαίσια για Selenium Πρόγραμμα οδήγησης ιστού — TestNG.
Υπάρχουν δύο τρόποι με την οποία μπορούμε να επιτύχουμε παραμετροποίηση σε TestNG:
- Με τη βοήθεια του Σχολιασμός παραμέτρων και την TestNG XML αρχείο.
- Με τη βοήθεια του DataProvider σχόλιο.
Το παραπάνω διάγραμμα συνοψίζει τη διαίρεση: οι παράμετροι από το testng.xml μπορούν να δηλωθούν σε επίπεδο suite ή test, ενώ μια παράμετρος από ένα DataProvider μπορεί να δεχτεί Method και ITestContext ως δικό του επιχείρημα. Ας τα μελετήσουμε λεπτομερώς.
Σχολιασμός παραμέτρων σε TestNG
Σχολιασμός παραμέτρων σε TestNG είναι μια μέθοδος που χρησιμοποιείται για τη μεταβίβαση τιμών στις μεθόδους δοκιμής ως ορίσματα χρησιμοποιώντας ένα αρχείο .xml. Ενδέχεται να απαιτείται από τους χρήστες να μεταβιβάσουν τις τιμές στις μεθόδους δοκιμής κατά τη διάρκεια της εκτέλεσης. Η μέθοδος σχολιασμού @Parameters μπορεί να χρησιμοποιηθεί σε οποιαδήποτε μέθοδο που έχει σχολιασμό @Test, @Before, @After ή @Factory.
Σχολιασμός παραμέτρων με Testng.xml
Επιλέξτε παραμετροποίηση χρησιμοποιώντας σχολιασμούς όταν δεν θέλετε να αντιμετωπίσετε πολυπλοκότητα και ο αριθμός των συνδυασμών εισόδου είναι μικρός.
Ας δούμε πώς λειτουργεί αυτό.
Σενάριο δοκιμής
Βήμα 1) Ανοίξτε το πρόγραμμα περιήγησης και μεταβείτε στο Google.com
Βήμα 2) Εισαγάγετε μια λέξη-κλειδί αναζήτησης
Βήμα 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
<?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 Σουίτα (Σημείωση: Σουίτα)
Οι παράμετροι μπορούν να οριστούν σε δύο επίπεδα:
- Επίπεδο σουίτας — οι παράμετροι εντός του
<suite>ετικέτα του TestNG Τα αρχεία XML είναι παράμετροι επιπέδου σουίτας. - Επίπεδο δοκιμής — οι παράμετροι εντός του
<test>ετικέτα του TestNG Το αρχείο XML είναι παράμετροι επιπέδου δοκιμής.
Ακολουθεί η ίδια δοκιμή με παραμέτρους επιπέδου σουίτας:
ΣΗΜΕΊΩΣΗ: Εάν το όνομα της παραμέτρου είναι το ίδιο σε επίπεδο σουίτας και σε επίπεδο δοκιμής, η παράμετρος επιπέδου δοκιμής έχει προτεραιότητα έναντι της παραμέτρου επιπέδου σουίτας ένα. Σε αυτήν την περίπτωση, όλες οι κλάσεις εντός αυτού του επιπέδου δοκιμής μοιράζονται την παράμετρο που έχει παρακαμφθεί και οι κλάσεις εκτός αυτού του επιπέδου δοκιμής συνεχίζουν να χρησιμοποιούν την παράμετρο επιπέδου σουίτας.
Αντιμετώπιση προβλημάτων
Τεύχος # 1: Μια τιμή παραμέτρου στο testng.xml που δεν μπορεί να μετατραπεί σε τυποποίηση στην αντίστοιχη παράμετρο της μεθόδου δοκιμής εμφανίζει σφάλμα.
Εξετάστε το ακόλουθο παράδειγμα:
Εδώ, το χαρακτηριστικό 'author' ισούται με 'Guru99', το οποίο είναι μια συμβολοσειρά, ενώ η αντίστοιχη μέθοδος δοκιμής αναμένει μια ακέραια τιμή, επομένως δημιουργείται μια εξαίρεση.
Τεύχος # 2: Οι @Parameters σας δεν έχουν αντίστοιχη τιμή στο testng.xml.
Μπορείτε να το λύσετε αυτό προσθέτοντας το @Προαιρετική σχολίαση στην αντίστοιχη παράμετρο στη μέθοδο δοκιμής.
Τεύχος # 3: Θέλετε να δοκιμάσετε πολλαπλές τιμές της ίδιας παραμέτρου χρησιμοποιώντας το testng.xml.
Η απλή απάντηση είναι ότι αυτό δεν μπορεί να γίνει. Μπορείτε να έχετε πολλές διαφορετικές παραμέτρους, αλλά κάθε παράμετρος μπορεί να περιέχει μόνο μία τιμή. Αυτό αποτρέπει την ενσωμάτωση τιμών στο σενάριο και διατηρεί τον κώδικα επαναχρησιμοποιήσιμο — σκεφτείτε το ως ένα αρχείο ρυθμίσεων για το σενάριο σας. Εάν χρειάζεστε πολλές τιμές για μία παράμετρο, χρησιμοποιήστε ένα DataProvider.
Πάροχος δεδομένων σε TestNG
Πάροχος δεδομένων σε TestNG είναι μια μέθοδος που χρησιμοποιείται όταν ένας χρήστης χρειάζεται να περάσει σύνθετες παραμέτρους. Οι σύνθετες παράμετροι πρέπει να δημιουργηθούν από Java — σύνθετα αντικείμενα, αντικείμενα από αρχεία ιδιοτήτων ή αντικείμενα από μια βάση δεδομένων μπορούν να διαβιβαστούν με τη μέθοδο data provider. Η μέθοδος σχολιάζεται με @DataProvider και επιστρέφει έναν πίνακα αντικειμένων.
Παράμετροι με χρήση του Dataprovider
Η σχολίαση @Parameters είναι εύκολη, αλλά για να δοκιμάσουμε με πολλαπλά σύνολα δεδομένων πρέπει να χρησιμοποιήσουμε έναν πάροχο δεδομένων.
Για να συμπληρώσουμε χιλιάδες διαδικτυακές φόρμες χρησιμοποιώντας το πλαίσιο δοκιμών μας, χρειαζόμαστε μια διαφορετική μεθοδολογία που μπορεί να παρέχει ένα πολύ μεγάλο σύνολο δεδομένων σε μία μόνο ροή εκτέλεσης.
Αυτή η ιδέα που βασίζεται σε δεδομένα επιτυγχάνεται με την @DataProvider σχολιασμός σε TestNG.
Έχει μόνο ένα χαρακτηριστικό, «όνομα»Εάν δεν καθορίσετε το χαρακτηριστικό name, το όνομα του DataProvider είναι το ίδιο με το αντίστοιχο όνομα μεθόδου.
Ένας πάροχος δεδομένων επιστρέφει ένα δισδιάστατο Java αντικείμενο στη μέθοδο δοκιμής και η μέθοδος δοκιμής καλείται M φορές για έναν πίνακα αντικειμένων M×N. Για παράδειγμα, εάν το DataProvider επιστρέψει έναν πίνακα 2×3 αντικειμένων, η αντίστοιχη περίπτωση δοκιμής καλείται 2 φορές με 3 παραμέτρους κάθε φορά.
Πλήρες Παράδειγμα
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 στο @Δοκιμή σχόλιο.
Code Παράδειγμα
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.
Στο ακόλουθο παράδειγμα:
- Ελέγχουμε αν το όνομα της μεθόδου είναι 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" } }; } } }
Εδώ είναι η έξοδος:
ITestContext — αυτό μπορεί να χρησιμοποιηθεί για τη δημιουργία διαφορετικών παραμέτρων για δοκιμαστικές περιπτώσεις με βάση ομάδες.
Στην πραγματική ζωή, μπορείτε να χρησιμοποιήσετε το ITestContext για να μεταβάλλετε τις τιμές των παραμέτρων με βάση μεθόδους δοκιμής, κεντρικούς υπολογιστές ή διαμορφώσεις δοκιμών.
Στο ακόλουθο παράδειγμα κώδικα:
- Έχουμε 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 μετατρέπει κάθε γραμμή σε μία δοκιμαστική κλήση.
- Προσθέστε την εξάρτηση. Συμπεριλάβετε
org.apache.poi:poi-ooxmlστο Maven σας ή Gradle κατασκευή. ΤοooxmlΤο artifact χειρίζεται τη μορφή .xlsx. απλόpoiΔιαβάζει μόνο παλαιότερα αρχεία .xls. - Δημιουργήστε το βιβλίο εργασίας. Τοποθετήστε τη γραμμή κεφαλίδας στη γραμμή 0 και μία περίπτωση δοκιμής ανά γραμμή από κάτω της, με μία στήλη ανά όρισμα μεθόδου δοκιμής.
- Διαβάστε το φύλλο σε έναν πίνακα. Προσαρμόστε το μέγεθος του αντικειμένου[][] από τον αριθμό των γραμμών και των κελιών, ώστε να επιλέγονται νέες γραμμές χωρίς αλλαγές στον κώδικα.
- Επιστρέψτε το από τον πάροχο. Η υπογραφή της μεθόδου δοκιμής παραμένει ακριβώς όπως πριν.
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 χαρακτηριστικό που παρουσιάστηκε νωρίτερα.
















