데이터 제공자 및 TestNG XML: 매개변수화 Selenium(예)

소프트웨어를 만들 때 우리는 항상 소프트웨어가 다른 데이터 세트와 다르게 작동하기를 바랍니다. 때에 온다 지원 동일한 소프트웨어라도 단 하나의 데이터 세트로 테스트하는 것은 불공평할 수 없습니다. 여기서도 우리 시스템이 지원할 것으로 예상되는 모든 조합 세트를 취하고 있는지 확인해야 합니다. 이를 위해서는 테스트 스크립트를 매개변수화해야 합니다. 여기 그림에 매개변수화가 있습니다.

매개변수화 Selenium

매개변수화 Selenium 런타임 시 여러 데이터를 애플리케이션에 전달하기 위해 테스트 스크립트를 매개변수화하는 프로세스입니다. 서로 다른 값을 사용하여 테스트 케이스를 여러 번 자동으로 실행하는 실행 전략입니다. 테스트 스크립트를 매개변수화하여 얻은 개념을 데이터 기반 테스트.

매개변수화 유형 TestNG-

매개변수화를 더 명확하게 하기 위해 가장 널리 사용되는 프레임워크 중 하나에서 매개변수화 옵션을 살펴보겠습니다. Selenium 웹드라이버 – TestNG.

다음의 두 가지 방법 이를 통해 매개변수화를 달성할 수 있습니다. TestNG

  1. 의 도움으로 파라미터 주석TestNG XML 파일.

    매개변수화 유형 TestNG

  2. 의 도움으로 데이터 제공자 주석.

    매개변수화 유형 TestNG

매개변수화 유형 TestNG

Testng.xml의 매개변수는 스위트 또는 테스트 수준일 수 있습니다.

DataProvider의 매개변수는 Method 및 ITestContext를 매개변수로 사용할 수 있습니다.

자세히 연구해 봅시다 –

매개변수 주석 TestNG

매개변수 주석 TestNG .xml 파일을 사용하여 테스트 메서드에 값을 인수로 전달하는 데 사용되는 메서드입니다. 사용자는 런타임 중에 테스트 메서드에 값을 전달해야 할 수도 있습니다. @Parameters 주석 메서드는 @Test, @Before, @After 또는 @Factory 주석이 있는 모든 메서드에서 사용할 수 있습니다.

Testng.xml을 사용한 매개변수 주석

복잡성을 처리하고 싶거나 입력 조합의 수가 적은 경우 주석을 사용하여 매개변수화를 선택하세요.

이것이 어떻게 작동하는지 봅시다

테스트 시나리오

1단계) 브라우저를 실행하고 Google.com으로 이동합니다.

2단계) 검색어를 입력하세요

Testng.Xml을 사용한 매개변수 주석

Step 3) 입력된 값이 테스트 데이터에서 제공한 값과 동일한지 확인

4단계) 모든 값이 입력될 때까지 2, 3을 반복합니다.

테스트 작성자 검색키
Guru99 인도
Krishna USA
부페 쉬 중국

매개변수 없이 이를 수행하는 방법의 예는 다음과 같습니다.

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));
}
}

위의 예에 대한 연구. 3개의 입력 조합에 대해 이렇게 하면 코드가 얼마나 복잡해질지 상상해 보세요.

이제 이를 다음을 사용하여 매개변수화해 보겠습니다. TestNG

그렇게 하려면 다음을 수행해야 합니다.

  • 매개변수를 저장할 XML 파일을 만듭니다.
  • 테스트에서 @Parameters 주석을 추가합니다.

Testng.Xml을 사용한 매개변수 주석

다음은 완전한 코드입니다.

테스트 레벨 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>

매개변수TestNGXML.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));

}
}

스크립트 실행, XML 파일 선택 및 Test NG Suite로 실행에 대한 지침

.xml 파일을 마우스 오른쪽 버튼으로 클릭 -> 다음 계정으로 실행 -> 테스트 중 스위트룸(참고: 스위트룸)

매개변수TestNGXML.java 파일

이제 매개변수를 2단계로 정의할 수 있습니다.

  1. Suite 수준 – 내부 매개변수 태그 TestNG XML 파일은 제품군 수준 매개변수입니다.
  2. 테스트 수준 — 내부 매개변수 테스트 XML 파일의 태그는 테스트 수준 매개변수가 됩니다.

다음은 제품군 수준 매개변수를 사용한 동일한 테스트입니다.

매개변수TestNGXML.java 파일

알림: 매개변수 이름이 제품군 수준과 테스트 수준에서 동일한 경우 테스트 수준 매개변수가 제품군 수준보다 우선 적용됩니다. 따라서 이 경우 해당 테스트 레벨 내부의 모든 클래스는 재정의된 매개변수를 공유하고, 테스트 레벨 외부의 다른 클래스는 스위트 레벨 매개변수를 공유합니다.

매개변수TestNGXML.java 파일

문제해결

문제 번호 1 testng.xml의 매개변수 값을 해당 테스트 메서드의 매개변수로 형변환할 수 없으며, 이를 사용하면 오류가 발생합니다.

다음 예를 고려하십시오.

문제 해결

여기서 'author' 속성은 문자열인 'Guru99'와 동일하며 해당 테스트 메서드에서는 정수 값을 기대하므로 여기서는 예외가 발생합니다.

문제 번호 2 @Parameters에는 test.xml에 해당 값이 없습니다.

추가하면 이 상황을 해결할 수 있습니다. @선택 과목 주석 테스트 방법의 해당 매개변수에 있습니다.

문제 해결

문제 # 3: Testng.xml을 사용하여 동일한 매개변수의 여러 값을 테스트하려고 합니다.

간단한 대답은 이것이 불가능하다는 것입니다! 여러 개의 서로 다른 매개변수를 가질 수 있지만 각 매개변수는 단일 값만 가질 수 있습니다. 이는 값을 스크립트에 하드코딩하는 것을 방지하는 데 도움이 됩니다. 이렇게 하면 코드를 재사용할 수 있습니다. 스크립트의 구성 파일이라고 생각하세요. 매개변수에 여러 값을 사용하려면 DataProvider를 사용하세요.

데이터 공급자 TestNG

데이터 공급자 TestNG 사용자가 복잡한 매개변수를 전달해야 할 때 사용되는 방법입니다. 복잡한 매개변수는 다음에서 생성해야 합니다. Java 복잡한 객체, 속성 파일 또는 데이터베이스의 객체와 같은 객체는 데이터 제공자 메서드에 의해 전달될 수 있습니다. 이 메서드는 @DataProvider로 주석이 달려 있으며 객체 배열을 반환합니다.

Dataprovider를 사용하는 매개변수

@Parameters 주석은 쉽지만 Data Provider를 사용하는 데 필요한 여러 데이터 세트로 테스트합니다.

테스트 프레임워크를 사용하여 수천 개의 웹 양식을 작성하려면 단일 실행 흐름에서 매우 큰 데이터 세트를 제공할 수 있는 다른 방법론이 필요합니다.

이 데이터 기반 개념은 다음을 통해 달성됩니다. @DataProvider 주석 TestNG.

Dataprovider를 사용하는 매개변수

단 하나뿐이에요 속성 '이름'. name 특성을 지정하지 않으면 DataProvider의 이름이 해당 메서드 이름과 동일해집니다.

데이터 공급자 반환 XNUMX차원 JAVA 객체 테스트 메소드와 테스트 메소드는 M*N 유형의 객체 배열에서 M번 호출됩니다. 예를 들어 DataProvider가 2*3 개체의 배열을 반환하는 경우 해당 테스트 사례는 매번 2개의 매개 변수를 사용하여 3번 호출됩니다.

Dataprovider를 사용하는 매개변수

완전한 예

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" }
        };

    }

}

다른 클래스에서 DataProvider 호출

기본적으로 DataProvider는 테스트 메서드가 있는 동일한 클래스 또는 해당 기본 클래스에 있습니다. 이를 다른 클래스에 넣으려면 데이터 공급자 메서드를 정적으로 만들어야 하고 테스트 메서드에 속성을 추가해야 합니다. dataProviderClass in @테스트 주석.

다른 클래스에서 DataProvider 호출

코드 예제

다른 클래스에서 DataProvider 호출

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" }
            };  
}}

Dataprovider의 매개변수 유형

DataProvider 메서드에서 지원하는 매개 변수에는 두 가지 유형이 있습니다.

방법- 같은 DataProvider는 테스트 메서드에 따라 다르게 작동해야 합니다. Method 매개 변수를 사용하세요.

Dataprovider의 매개변수 유형

다음 예에서,

  • 메소드 이름이 testMethodA인지 확인합니다.
  • 그렇다면 한 세트의 값을 반환합니다.
  • 그렇지 않으면 다른 값 세트를 반환합니다.
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" }
            };}       
    }
}

다음은 출력입니다.

Dataprovider의 매개변수 유형

ITestContext– 그룹을 기반으로 테스트 케이스에 대한 다양한 매개변수를 생성하는 데 사용할 수 있습니다.

실제로는 ITestContext를 사용하여 테스트 방법, 호스트, 테스트 구성에 따라 매개변수 값을 변경할 수 있습니다.

Dataprovider의 매개변수 유형

다음 코드 예제에서는

  • A, B 2개 그룹이 있어요
  • 각 테스트 방법은 그룹에 할당됩니다.
  • 그룹의 값이 A이면 특정 데이터 세트가 반환됩니다.
  • 그룹의 값이 B이면 다른 데이터 세트가 반환됩니다.
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;		
	}
}

참고: testng 클래스를 직접 실행하는 경우 먼저 dataprovider를 호출하는데, 이 클래스는 그룹을 사용할 수 없기 때문에 그룹 정보를 가져올 수 없습니다. 하지만 대신 testng.xml을 통해 이 클래스를 호출하면 ITestContext에서 그룹 정보를 사용할 수 있습니다. 다음 XML을 사용하여 테스트를 호출합니다.

<!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>

제품 개요

  • 매개변수화 생성이 필요합니다 데이터 기반 테스트.
  • TestNG 다음을 사용하여 두 가지 종류의 매개변수화를 지원합니다. @매개변수+TestNG. XML 그리고@DataProvider
  • In @매개변수+TestNG. XML 매개변수는 스위트 레벨과 테스트 레벨에 배치될 수 있습니다. 만약에

    동일한 매개변수 이름이 두 위치 모두에서 선언됩니다. 테스트 수준 매개변수는 슈트 수준 매개변수보다 우선권을 갖습니다.

  • @Parameter+ 사용TestNG.xml 한 번에 하나의 값만 설정할 수 있지만 @DataProvider는 반환합니다. 객체의 2차원 배열.
  • DataProvider가 테스트 메서드가 있는 클래스와 다른 클래스에 있는 경우데이터 제공자 되어야 정적 방법.
  • 에서 지원하는 두 가지 매개변수가 있습니다. 데이터 제공자 are 방법ITestContext.

이 게시물을 요약하면 다음과 같습니다.