Nhà cung cấp dữ liệu & TestNG XML: Tham số hóa trong Selenium(Thí dụ)

Khi tạo ra phần mềm, chúng tôi luôn mong muốn nó sẽ hoạt động khác đi với một bộ dữ liệu khác. Khi nó đến Kiểm tra cùng một phần mềm, chúng tôi không thể không 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 ta cần xác minh rằng hệ thống của chúng ta đang sử dụng tất cả các tập hợp kết hợp dự kiến ​​sẽ hỗ trợ. Để làm được điều đó, chúng ta cần tham số hóa các đoạn mã kiểm tra của mình. Ở đây có Tham số hóa 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 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.

hai lối nhờ đó chúng ta có thể đạt được tham số hóa trong TestNG

  1. Với sự giúp đỡ của Thông số Kỹ thuật chú thíchTestNG XML tập tin.

    Loại tham số hóa trong TestNG

  2. Với sự giúp đỡ của Nhà cung cấp dữ liệu chú thích.

    Loại tham số hóa trong TestNG

Loại tham số hóa trong TestNG

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

Chú thích tham số với Testng.Xml

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

Chú thích tham số với Testng.Xml

Đâ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)

Tham sốVớiTestNGTệp XML.java

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ẻ của TestNG Tệp XML sẽ là một tham số cấp bộ.
  2. 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ộ

Tham sốVớiTestNGTệp XML.java

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ộ.

Tham sốVớiTestNGTệp XML.java

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

Xử lý sự cố

Ở đâ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ử.

Xử lý sự cố

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.

Các tham số sử dụng Dataprovider

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.

Các tham số sử dụng Dataprovider

Hoàn thành ví dụ

Các tham số sử dụng Dataprovider

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.

Gọi DataProvider từ lớp khác

Ví dụ về mã

Gọi DataProvider từ lớp khác

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.

Các loại tham số trong Dataprovider

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

Các loại tham số trong Dataprovider

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.

Các loại tham số trong Dataprovider

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ápITestContext.