Nhà cung cấp dữ liệu & TestNG XML: Tham số hóa trong Selenium(Thí dụ)
Tham số hóa trong Selenium
Tham số hóa trong Selenium là một quá trình tham số hóa các tập lệnh kiểm thử để truyền nhiều dữ liệu đến ứng dụng trong thời gian chạy. Đó là một chiến lược thực thi tự động chạy các trường hợp thử nghiệm nhiều lần bằng các giá trị khác nhau. Khái niệm đạt được bằng cách tham số hóa các kịch bản thử nghiệm được gọi là Kiểm tra theo hướng dữ liệu.
Loại tham số hóa trong TestNG-
Để làm cho việc tham số hóa rõ ràng hơn, chúng ta sẽ xem xét các tùy chọn tham số hóa trong một khung phổ biến nhất cho Selenium Trình điều khiển web – TestNG.
Có hai lối nhờ đó chúng ta có thể đạt được tham số hóa trong TestNG
- Với sự giúp đỡ của Thông số Kỹ thuật chú thích và TestNG XML tập tin.
- Với sự giúp đỡ của Nhà cung cấp dữ liệu chú thích.
Các tham số từ Testng.xml có thể ở cấp độ bộ hoặc cấp độ thử nghiệm
Tham số từ DataProvider có thể lấy Method và ITestContext làm tham số.
Hãy nghiên cứu chúng một cách chi tiết –
Chú thích tham số trong TestNG
Chú thích tham số trong TestNG là một phương thức được sử dụng để truyền các giá trị cho các phương thức thử nghiệm dưới dạng đối số bằng tệp .xml. Người dùng có thể được yêu cầu chuyển các giá trị cho các phương pháp thử nghiệm trong thời gian chạy. Phương thức chú thích @Parameters có thể được sử dụng trong bất kỳ phương thức nào có chú thích @Test, @Before, @After hoặc @Factory.
Chú thích tham số bằng Testng.xml
Chọn tham số hóa bằng chú thích khi bạn muốn xử lý độ phức tạp và số lượng kết hợp đầu vào ít hơn.
Hãy xem cách nó hoạt động
Kịch bản thử nghiệm
Bước 1) Khởi chạy trình duyệt và truy cập Google.com
Bước 2) Nhập từ khóa tìm kiếm
Bước 3) Xác minh giá trị đã nhập giống với giá trị được cung cấp bởi dữ liệu thử nghiệm của chúng tôi
Bước 4) Lặp lại 2 & 3 cho đến khi tất cả các giá trị được nhập
Tác giả kiểm tra | Khóa tìm kiếm |
---|---|
Guru99 | Ấn Độ |
Krishna | US |
Bhupesh | Trung Quốc |
Đây là một ví dụ về cách thực hiện KHÔNG CÓ tham số
package parameters; import org.testng.annotations.Test; import org.testng.AssertJUnit; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; public class NoParameterWithTestNGXML { String driverPath = "C:\\geckodriver.exe"; WebDriver driver; @Test public void testNoParameter() throws InterruptedException{ String author = "guru99"; String searchKey = "india"; System.setProperty("webdriver.gecko.driver", driverPath); driver= new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("https://google.com"); WebElement searchText = driver.findElement(By.name("q")); //Searching text in google text box searchText.sendKeys(searchKey); System.out.println("Welcome ->"+author+" Your search key is->"+searchKey); System.out.println("Thread will sleep now"); Thread.sleep(3000); System.out.println("Value in Google Search Box = "+searchText.getAttribute("value") +" ::: Value given by input = "+searchKey); //verifying the value in google search box AssertJUnit.assertTrue(searchText.getAttribute("value").equalsIgnoreCase(searchKey)); } }
Một nghiên cứu, ví dụ trên. Hãy tưởng tượng xem mã sẽ phức tạp như thế nào khi chúng ta thực hiện điều này cho 3 kết hợp đầu vào
Bây giờ, hãy tham số hóa điều này bằng cách sử dụng TestNG
Để làm như vậy, bạn sẽ cần phải
- Tạo một tệp XML sẽ lưu trữ các tham số
-
Trong bài kiểm tra, thêm chú thích @Parameters
Đây là mã hoàn chỉnh
Cấp độ kiểm tra TestNG. Xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://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>
Tham sốVớiTestNGTệp XML.java
package parameters; import org.testng.AssertJUnit; import java.util.concurrent.TimeUnit; 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 { String driverPath = "C:\\geckodriver.exe"; WebDriver driver; @Test @Parameters({"author","searchKey"}) public void testParameterWithXML( @Optional("Abc") String author,String searchKey) throws InterruptedException{ System.setProperty("webdriver.gecko.driver", driverPath); driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("https://google.com"); WebElement searchText = driver.findElement(By.name("q")); //Searching text in google text box searchText.sendKeys(searchKey); System.out.println("Welcome ->"+author+" Your search key is->"+searchKey); System.out.println("Thread will sleep now"); Thread.sleep(3000); System.out.println("Value in Google Search Box = "+searchText.getAttribute("value") +" ::: Value given by input = "+searchKey); //verifying the value in google search box AssertJUnit.assertTrue(searchText.getAttribute("value").equalsIgnoreCase(searchKey)); } }
Hướng dẫn chạy script, chọn file XML và Run as Test NG Suite
Nhấp chuột phải vào tệp .xml -> Chạy dưới dạng -> Kiểm tra Suite (Lưu ý: Suite)
Bây giờ, các tham số có thể được xác định ở 2 cấp độ
- Cấp độ bộ – Các tham số bên trong thẻ của TestNG Tệp XML sẽ là một tham số cấp bộ.
- Cấp độ kiểm tra - Các thông số bên trong thẻ của tệp XML kiểm tra sẽ là tham số cấp độ Kiểm tra.
Đây là thử nghiệm tương tự với các tham số cấp bộ
LƯU Ý: Trong trường hợp nếu tên tham số giống nhau ở cấp độ bộ và cấp độ kiểm tra thì tham số cấp độ kiểm tra sẽ được ưu tiên hơn cấp độ bộ. Vì vậy, trong trường hợp đó, tất cả các lớp bên trong cấp độ kiểm tra đó sẽ chia sẻ tham số được ghi đè và các lớp khác nằm ngoài cấp độ kiểm tra sẽ chia sẻ tham số cấp bộ.
Xử lý sự cố
Số phát hành 1 Giá trị tham số trong testng.xml không thể được định kiểu thành tham số của phương thức kiểm tra tương ứng, nó sẽ báo lỗi.
Hãy xem xét ví dụ sau
Ở đây, thuộc tính 'tác giả' bằng 'Guru99', là một chuỗi và trong phương thức kiểm tra tương ứng, nó mong đợi một giá trị nguyên, vì vậy chúng ta sẽ có một ngoại lệ ở đây.
Số phát hành 2 @Parameters của bạn không có giá trị tương ứng trong testing.xml.
Bạn có thể giải quyết tình huống này bằng cách thêm @không bắt buộc chú thích trong tham số tương ứng trong phương pháp thử.
Vấn đề số 3: Bạn muốn kiểm tra nhiều giá trị của cùng một tham số bằng Testng.xml
Câu trả lời đơn giản là điều này không thể thực hiện được! Bạn có thể có nhiều tham số khác nhau nhưng mỗi tham số chỉ có thể có một giá trị duy nhất. Điều này giúp ngăn chặn các giá trị mã hóa cứng vào tập lệnh. Điều này làm cho mã có thể tái sử dụng được. Hãy coi nó như các tập tin cấu hình cho tập lệnh của bạn. Nếu bạn muốn sử dụng nhiều giá trị cho một tham số, hãy sử dụng DataProviders
Nhà cung cấp dữ liệu ở TestNG
Nhà cung cấp dữ liệu ở TestNG là một phương pháp được sử dụng khi người dùng cần truyền các tham số phức tạp. Các tham số phức tạp cần được tạo từ Java chẳng hạn như các đối tượng phức tạp, các đối tượng từ tệp thuộc tính hoặc từ cơ sở dữ liệu có thể được truyền qua phương thức cung cấp dữ liệu. Phương thức được chú thích bởi @DataProvider và trả về một mảng các đối tượng.
Các thông số sử dụng Dataprovider
Chú thích @Parameters rất dễ dàng nhưng để kiểm tra với nhiều bộ dữ liệu, chúng tôi cần sử dụng Nhà cung cấp dữ liệu.
Để điền vào hàng nghìn biểu mẫu web bằng khung thử nghiệm của chúng tôi, chúng tôi cần một phương pháp khác có thể cung cấp cho chúng tôi tập dữ liệu rất lớn trong một luồng thực thi duy nhất.
Khái niệm điều khiển dữ liệu này đạt được bằng cách @Nhà cung cấp dữ liệu chú thích trong TestNG.
Nó chỉ có một thuộc tính 'tên'. Nếu bạn không chỉ định thuộc tính name thì tên của DataProvider sẽ giống với tên phương thức tương ứng.
Nhà cung cấp dữ liệu trả về một đối tượng JAVA hai chiều đối với phương thức thử nghiệm và phương thức thử nghiệm, sẽ gọi M lần trong loại mảng đối tượng M*N. Ví dụ: nếu DataProvider trả về một mảng gồm các đối tượng 2*3, testcase tương ứng sẽ được gọi 2 lần với 3 tham số mỗi lần.
Hoàn thành ví dụ
package parameters; import java.util.concurrent.TimeUnit; 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; String driverPath = "C:\\geckodriver.exe"; @BeforeTest public void setup(){ //Create firefox driver object System.setProperty("webdriver.gecko.driver", driverPath); driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("https://google.com"); } /** Test case to verify google search box * @param author * @param searchKey * @throws InterruptedException */ @Test(dataProvider="SearchProvider") public void testMethod(String author,String searchKey) throws InterruptedException{ { WebElement searchText = driver.findElement(By.name("q")); //search value in google searchbox searchText.sendKeys(searchKey); System.out.println("Welcome ->"+author+" Your search key is->"+searchKey); Thread.sleep(3000); String testValue = searchText.getAttribute("value"); System.out.println(testValue +"::::"+searchKey); searchText.clear(); //Verify if the value in google search box is correct Assert.assertTrue(testValue.equalsIgnoreCase(searchKey)); } } /** * @return Object[][] where first column contains 'author' * and second column contains 'searchKey' */ @DataProvider(name="SearchProvider") public Object[][] getDataFromDataprovider(){ return new Object[][] { { "Guru99", "India" }, { "Krishna", "UK" }, { "Bhupesh", "USA" } }; } }
Gọi DataProvider từ lớp khác
Theo mặc định, DataProvider nằm trong cùng một lớp nơi phương thức kiểm tra hoặc lớp cơ sở của nó. Để đặt nó vào một số lớp khác, chúng ta cần tạo phương thức cung cấp dữ liệu ở dạng tĩnh và trong phương thức thử nghiệm, chúng ta cần thêm một thuộc tính lớp nhà cung cấp dữ liệu in @Thử nghiệm chú thích.
Ví dụ về mã
TestClass ParameterDataproviderWithClassLevel.java
package parameters; import java.util.concurrent.TimeUnit; 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; String driverPath = "C:\\geckodriver.exe"; @BeforeTest public void setup(){ System.setProperty("webdriver.gecko.driver", driverPath); driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 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 google text box searchText.sendKeys(searchKey); System.out.println("Welcome ->"+author+" Your search key is->"+searchKey); Thread.sleep(3000); //get text from search box String testValue = searchText.getAttribute("value"); System.out.println(testValue +"::::"+searchKey); searchText.clear(); //verify if search box has 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" } }; }}
Các loại tham số trong Dataprovider
Có hai loại tham số được phương thức DataProvider hỗ trợ.
Phương pháp- Nếu TƯƠNG TỰ DataProvider sẽ hoạt động khác với phương pháp thử nghiệm khác, hãy sử dụng tham số Method.
Trong ví dụ sau đây,
- Chúng tôi kiểm tra xem tên phương thức có phải là testMethodA hay không.
- Nếu có trả về một bộ giá trị
- Ngược lại trả về một tập hợp giá trị khác
package parameters; import java.lang.reflect.Method; import java.util.concurrent.TimeUnit; 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; String driverPath = "C:\\geckodriver.exe"; @BeforeTest public void setup(){ System.setProperty("webdriver.gecko.driver", driverPath); driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("https://google.com"); } @Test(dataProvider="SearchProvider") public void testMethodA(String author,String searchKey) throws InterruptedException{ WebElement searchText = driver.findElement(By.name("q")); //Search text in search box searchText.sendKeys(searchKey); //Print author and search string System.out.println("Welcome ->"+author+" Your search key is->"+searchKey); Thread.sleep(3000); String testValue = searchText.getAttribute("value"); System.out.println(testValue +"::::"+searchKey); searchText.clear(); //Verify if google text box is showing correct value Assert.assertTrue(testValue.equalsIgnoreCase(searchKey)); } @Test(dataProvider="SearchProvider") public void testMethodB(String searchKey) throws InterruptedException{ { WebElement searchText = driver.findElement(By.name("q")); //Search text in search box searchText.sendKeys(searchKey); //Print only search string System.out.println("Welcome ->Unknown user Your search key is->"+searchKey); Thread.sleep(3000); String testValue = searchText.getAttribute("value"); System.out.println(testValue +"::::"+searchKey); searchText.clear(); //Verify if google text box is showing correct value Assert.assertTrue(testValue.equalsIgnoreCase(searchKey)); } } /** * Here DataProvider returning value on the basis of test method name * @param m * @return **/ @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" } };} } }
Đây là đầu ra
ITestContext– Nó có thể sử dụng để tạo các tham số khác nhau cho các trường hợp thử nghiệm dựa trên các nhóm.
Trong thực tế, bạn có thể sử dụng ITestContext để thay đổi các giá trị tham số dựa trên Phương thức kiểm tra, máy chủ, cấu hình của thử nghiệm.
Trong ví dụ mã sau đây
- Chúng ta có 2 nhóm A & B
- Mỗi phương pháp thử nghiệm được gán cho một nhóm
- Nếu giá trị của nhóm là A, một tập dữ liệu cụ thể sẽ được trả về
- Nếu giá trị của nhóm là B, tập dữ liệu khác sẽ được trả về
package parameters; import java.util.concurrent.TimeUnit; 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; String driverPath = "C:\\geckodriver.exe"; @BeforeTest(groups={"A","B"}) public void setup(){ System.setProperty("webdriver.gecko.driver", driverPath); driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("https://google.com"); } @Test(dataProvider="SearchProvider",groups="A") public void testMethodA(String author,String searchKey) throws InterruptedException{ { //search google textbox WebElement searchText = driver.findElement(By.name("q")); //search a value on it searchText.sendKeys(searchKey); System.out.println("Welcome ->"+author+" Your search key is->"+searchKey); Thread.sleep(3000); String testValue = searchText.getAttribute("value"); System.out.println(testValue +"::::"+searchKey); searchText.clear(); //verify correct value in searchbox Assert.assertTrue(testValue.equalsIgnoreCase(searchKey)); } } @Test(dataProvider="SearchProvider",groups="B") public void testMethodB(String searchKey) throws InterruptedException{ { //find google search box WebElement searchText = driver.findElement(By.name("q")); //search a value on it searchText.sendKeys(searchKey); System.out.println("Welcome ->Unknown user Your search key is->"+searchKey); Thread.sleep(3000); String testValue = searchText.getAttribute("value"); System.out.println(testValue +"::::"+searchKey); searchText.clear(); //verify correct value in searchbox Assert.assertTrue(testValue.equalsIgnoreCase(searchKey)); } } /** * Here the DAtaProvider will provide Object array on the basis on ITestContext * @param c * @return */ @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; } }
Lưu ý: Nếu bạn chạy trực tiếp lớp testng của mình, trước tiên nó sẽ gọi dataprovider, lớp này không thể lấy thông tin nhóm vì nhóm không khả dụng. Nhưng thay vào đó, nếu bạn gọi lớp này qua testng.xml, nó sẽ có thông tin nhóm khả dụng với ITestContext. Sử dụng XML sau để gọi lớp test
<!DOCTYPE suite SYSTEM "http://beust.com/testng/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>
Tổng kết
- Tham số hóa được yêu cầu tạo ra Kiểm tra theo hướng dữ liệu.
- TestNG hỗ trợ hai loại tham số hóa, sử dụng @Thông số+TestNG. Xml và sử dụng@Nhà cung cấp dữ liệu
-
In @Thông số+TestNG. Xml các tham số có thể được đặt ở cấp độ bộ và cấp độ kiểm tra. Nếu như
Tên tham số giống nhau được khai báo ở cả hai nơi; tham số cấp độ kiểm tra sẽ được ưu tiên hơn tham số cấp độ phù hợp.
- sử dụng @Parameter+TestNG.xml mỗi lần chỉ có thể đặt một giá trị, nhưng @DataProvider trả về một mảng đối tượng 2d.
- Nếu DataProvider có trong lớp khác thì lớp chứa phương thức kiểm tra,Nhà cung cấp dữ liệu nên là phương pháp tĩnh.
- Có hai tham số được hỗ trợ bởi Nhà cung cấp dữ liệu đang Phương pháp và ITestContext.