Dataprovider & TestNG XML: Tham số hóa trong Selenium (Ví dụ)

Khi chúng tôi tạo ra phần mềm, chúng tôi luôn mong muốn nó sẽ hoạt động khác với một bộ dữ liệu khác. Khi nói đến Kiểm tra cùng một phần mềm, chúng ta không thể thiếu công bằng khi kiểm tra nó chỉ với một bộ dữ liệu. Ở đây một lần nữa, chúng tôi cần xác minh rằng hệ thống của chúng tôi đang sử dụng tất cả các tập hợp các kết hợp được mong đợi để hỗ trợ. Để làm được điều đó, chúng ta cần tham số hóa các scipts thử nghiệm của mình. Đây là Parameterization trong hình.

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 thử nghiệm để chuyển nhiều dữ liệu đến ứng dụng trong thời gian chạy. Nó 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ách sử dụng các giá trị khác nhau. Khái niệm đạt được bằng cách tham số hóa các tập lệnh thử nghiệm được gọi là Thử nghiệm theo hướng dữ liệu .

Loại tham số trong TestNG-

Để làm rõ hơn việc tham số hóa, chúng ta sẽ xem xét các tùy chọn tham số hóa trong một khuôn khổ phổ biến nhất cho Selenium Webdriver –  TestNG .

Có  hai cách  mà chúng ta có thể đạt được tham số hóa trong TestNG

  1. Với sự trợ giúp của  chú thích Tham số   và  tệp XML TestNG  .
    TestNG: Tham số hóa bằng XML & DataProvider trong Selenium
  2. Với sự trợ giúp của   chú thích DataProvider .
    TestNG: Tham số hóa bằng XML & DataProvider trong Selenium

Các thông số từ Testng.xml có thể là 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 pháp được sử dụng để chuyển các giá trị cho các phương thức thử nghiệm dưới dạng đối số bằng cách sử dụ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ố với Testng.xml

Chọn tham số hóa bằng cách sử dụ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ày hoạt động như thế nào

Test Scenario

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

Người thử nghiệmSearchKey
Guru99Ấn Độ
KrishnaHoa Kỳ
BhupeshTrung Quốc

Đây là một ví dụ về cách thực hiện mà 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. Chỉ cần tưởng tượng mã sẽ trở nên phức tạp như thế nào khi chúng ta làm đ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 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 thử nghiệm, hãy thêm chú thích @Parameters

Đây là mã hoàn chỉnh

Mức độ 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>

Tệp ParameterWithTestNGXML.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 -> Testng Suite (Lưu ý: Suite)

Bây giờ, các tham số có thể được xác định ở 2 cấp

  1. Cấp bộ – Các tham số bên trong thẻ <suite> của tệp XML TestNG sẽ là một tham số cấp bộ.
  2. Mức thử nghiệm – Các tham số bên trong thẻ <Test> của tệp XML thử nghiệm sẽ là một tham số mức Kiểm tra.

Đây là bài kiểm tra tương tự với các thông số cấp bộ

LƯU Ý:  Trong trường hợp nếu tên thông số giống nhau ở cấp độ bộ và cấp độ thử nghiệm thì thông số cấp độ thử nghiệm 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 mức thử nghiệm đó sẽ chia sẻ tham số được ghi đè và các lớp khác nằm ngoài mức thử nghiệm sẽ chia sẻ tham số mức bộ.

Xử lý sự cố

Sự cố # 1  Giá trị tham số trong testng.xml không thể được đánh máy cho tham số của phương pháp thử nghiệm tương ứng, nó sẽ gây ra lỗi.

Hãy xem xét ví dụ sau

Ở đây, thuộc tính ‘author’ bằng ‘Guru99’ là một chuỗi và trong phương pháp kiểm tra tương ứng, thuộc tính này mong đợi một giá trị nguyên, vì vậy chúng tôi sẽ nhận được một ngoại lệ ở đây.

Vấn đề # 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  chú thích @optional   trong tham số tương ứng trong phương pháp thử nghiệm.

Sự cố # 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ể được thực hiện! 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ể được sử dụng lại. Hãy coi nó như các tệp 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 trong TestNG

Trình cung cấp dữ liệu trong TestNG là một phương pháp được sử dụng khi người dùng cần chuyể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 bằng phương thức trình cung cấp dữ liệu. Phương thức được chú thích bởi @DataProvider và nó trả về một mảng đố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 ta cần sử dụng Trình cung cấp dữ liệu.

Để lấp đầy hàng nghìn biểu mẫu web bằng cách sử dụ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 một tập dữ liệu rất lớn trong một luồng thực thi duy nhất.

Khái niệm hướng dữ liệu này đạt được nhờ  chú thích @DataProvider  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  cho phương pháp thử nghiệm và phương pháp thử nghiệm, sẽ gọi M lần trong một mảng đối tượng kiểu M * N. Ví dụ: nếu DataProvider trả về một mảng 2 * 3 đối tượng, 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 là hoặc lớp cơ sở của nó. Để đặt nó trong một số lớp khác, chúng ta cần đặt phương thức trình cung cấp dữ liệu là tĩnh và trong phương thức thử nghiệm, chúng ta cần thêm một thuộc tính  dataProviderClass  trong  chú thích  @Test .

Ví dụ về mã

Tham số TestClassDataproviderWithClassLevel.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 hỗ trợ bởi phương thức DataProvider.

Phương pháp – Nếu  SAME  DataProvider hoạt động khác với phương pháp thử nghiệm khác, hãy sử dụng tham số Phương thức.

Trong ví dụ sau,

  • 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ị
  • Khác trả về một bộ 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 cuộc sống thực, bạn có thể sử dụng ITestContext để thay đổi các giá trị tham số dựa trên Phương pháp kiểm tra, máy chủ, cấu hình của bài kiểm tra.

Trong ví dụ mã sau

  • Chúng tôi có 2 nhóm A & B
  • Mỗi phương pháp thử nghiệm được chỉ định cho một nhóm
  • Nếu giá trị của nhóm là A, một tập dữ liệu cụ thể được trả về
  • Nếu giá trị của nhóm là B, một tập dữ liệu khác đượ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 trực tiếp chạy lớp testng của mình, trước tiên nó sẽ gọi trình cung cấp dữ liệu mà không thể lấy thông tin nhóm vì các 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ó sẵn thông tin nhóm với ITestContext. Sử dụng XML sau để gọi kiểm tra

<!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óm tắt :

  • Cần có tham số hóa để tạo Kiểm tra theo hướng dữ liệu .
  • TestNG hỗ trợ hai loại tham số hóa, sử dụng @ Parameter + TestNG.xml và sử dụng @DataProvider
  • Trong @ Parameter + TestNG.xml các thông số có thể được đặt ở cấp bộ và cấp thử nghiệm. Nếu như Tên tham số giống nhau được khai báo ở cả hai nơi; thông số mức thử nghiệm sẽ được ưu tiên hơn thông số mức phù hợp.
  • sử dụng @ Parameter + TestNG.xml chỉ có thể đặt một giá trị tại một thời điểm, nhưng @DataProvider trả về một mảng 2d của Đối tượng .
  • Nếu DataProvider có mặt trong lớp khác thì lớp chứa phương thức kiểm tra, DataProvider phải là phương thức tĩnh .
  • Có hai tham số được hỗ trợ bởi DataProviderMethodITestContext.
Check Also
Close
Back to top button