자동화테스트/Selenium2018. 12. 4. 08:00

우리가 소프트웨어를 만들 때, 우리는 항상 다른 데이터 집합과 다르게 작동해야한다고 생각합니다. 그것이 올 때 테스트 소프트웨어의 동일한 조각을, 우리는 데이터를 하나의 세트로 테스트하는 불공정 수 없습니다. 여기서도 우리 시스템이 지원할 것으로 예상되는 모든 조합을 취하고 있는지 확인해야합니다.

여기 그림에서 매개 변수화가 있습니다. 런타임에 여러 데이터를 응용 프로그램에 전달하려면 테스트 스크립트를 매개 변수화해야합니다.

매개 변수화로 달성 할 수있는 개념을 데이터 기반 테스트 라고  합니다.

TestNG에서 매개 변수화 유형 -

매개 변수화를보다 명확하게하기 위해 Selenium Webdriver ( TestNG) 에서 가장 널리 사용되는 프레임 워크에서 매개 변수화 옵션을 살펴 보겠습니다  .

거기  두 가지 방법이  있는 우리가 TestNG의에서 파라미터를 달성 할 수는

  1. 매개 변수  주석  및  TestNG XML  파일 의 도움으로  .

    TestNG : Selenium에서 XML 및 DataProvider를 사용하여 매개 변수화

  2. DataProvider  주석 의 도움으로  .

    TestNG : Selenium에서 XML 및 DataProvider를 사용하여 매개 변수화

TestNG : Selenium에서 XML 및 DataProvider를 사용하여 매개 변수화

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

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

자세히 연구 해 봅시다.

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

복잡성을 처리하고 입력 조합의 수가 적을 때 특수 효과를 사용하여 매개 변수화를 선택하십시오.

이것이 어떻게 작동하는지 보자.

테스트 시나리오

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

2 단계) 검색 키워드 입력

TestNG : Selenium에서 XML 및 DataProvider를 사용하여 매개 변수화

3) 입력 된 값이 테스트 데이터에서 제공 한 값과 같은지 확인하십시오.

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

테스트 저자검색 키
구루 99인도
크리슈나미국
부페시중국

다음은 매개 변수없이 수행하는 방법의 예입니다.

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.firefox.marionette", driverPath);        
        driver= new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        
        driver.get("https://google.com");
        WebElement searchText = driver.findElement(By.name("q"));
        // Google 텍스트 상자에서 텍스트 검색하기
        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);
        // Google 검색 창에서 값을 확인합니다.
        AssertJUnit.assertTrue(searchText.getAttribute("value").equalsIgnoreCase(searchKey));
}
}

 

연구, 위의 예. 3 개의 입력 조합에 대해 코드를 얼마나 복잡하게하는지 상상해보십시오.

이제 TestNG를 사용하여 이것을 매개 변수화 해 봅시다.

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

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

TestNG : Selenium에서 XML 및 DataProvider를 사용하여 매개 변수화

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

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

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.firefox.marionette", driverPath);
        driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.get("https://google.com");

        WebElement searchText = driver.findElement(By.name("q"));
        // Google 텍스트 상자에서 텍스트 검색하기
        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);
        // Google 검색 창에서 값을 확인합니다.
        AssertJUnit.assertTrue(searchText.getAttribute("value").equalsIgnoreCase(searchKey));

}
}

스크립트를 실행하고 XML 파일을 선택한 다음 Test NG Suite로 실행 지침

.xml 파일 -> Run as -> Testng Suite (Note : Suite)를 마우스 오른쪽 버튼으로 클릭 하십시오.

TestNG : Selenium에서 XML 및 DataProvider를 사용하여 매개 변수화

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

  1. 스위트 레벨 - TestNG XML 파일의 <suite> 태그 안에있는 매개 변수는 스위트 레벨 매개 변수가됩니다.
  2. 테스트 레벨 - 테스트 XML 파일의 <Test> 태그 안의 매개 변수는 테스트 레벨 매개 변수가됩니다.

스위트 레벨 매개 변수를 사용한 동일한 테스트가 있습니다.

TestNG : Selenium에서 XML 및 DataProvider를 사용하여 매개 변수화

참고 :  매개 변수 이름이 스위트 수준 및 테스트 수준에서 동일하면 테스트 수준 매개 변수가 스위트 수준보다 우선 적용됩니다. 따라서이 경우 테스트 레벨 내의 모든 클래스가 재정의 된 매개 변수를 공유하며 테스트 레벨 외부의 다른 클래스는 스위트 레벨 매개 변수를 공유합니다.

TestNG : Selenium에서 XML 및 DataProvider를 사용하여 매개 변수화

문제 해결

문제 # 1  testng.xml의 매개 변수 값을 해당 테스트 메소드의 매개 변수로 유형 변환 할 수 없으므로 오류가 발생합니다.

다음 예제를 고려해보십시오. TestNG : Selenium에서 XML 및 DataProvider를 사용하여 매개 변수화

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

이슈 # 2  @Parameters에는 testing.xml에 해당 값이 없습니다.

 테스트 메소드의 해당 매개 변수에 @optional  주석 을 추가 하여이 상황을 해결할 수 있습니다  .

TestNG : Selenium에서 XML 및 DataProvider를 사용하여 매개 변수화

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

간단한 대답은 이것이 할 수 없다는 것입니다! 여러 매개 변수를 가질 수 있지만 각 매개 변수는 하나의 값만 가질 수 있습니다. 이렇게하면 스크립트로 값을 하드 코딩하는 것을 방지 할 수 있습니다. 이렇게하면 코드를 재사용 할 수 있습니다. 스크립트의 설정 파일로 생각하십시오. 매개 변수에 여러 값을 사용하려면 DataProviders

Dataprovider를 사용하는 매개 변수

@Parameters 주석은 쉽지만 여러 데이터 집합을 테스트하려면 데이터 공급자를 사용해야합니다.

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

이 데이터 중심 개념은 TestNG의 @DataProvider  주석에 의해 달성됩니다  .

TestNG : Selenium에서 XML 및 DataProvider를 사용하여 매개 변수화

'name'속성 은 하나뿐입니다  name 특성을 지정하지 않으면 DataProvider의 이름이 해당 메서드 이름과 동일하게됩니다.

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

TestNG : Selenium에서 XML 및 DataProvider를 사용하여 매개 변수화

완전한 예

TestNG : Selenium에서 XML 및 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(){
        // firefox 드라이버 객체를 만듭니다.
         System.setProperty("webdriver.firefox.marionette", 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"));
        // 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();
        // Google 검색의 값이 올바른지 확인하십시오.
        Assert.assertTrue(testValue.equalsIgnoreCase(searchKey));
    }
    }
    /**
     * @return Object [] [] 첫 번째 열에 'author'가 포함되어 있습니다.
     * 두 번째 열에는 'searchKey'가 포함되어 있습니다.
     */

    @DataProvider(name="SearchProvider")
    public Object[][] getDataFromDataprovider(){
    return new Object[][] 
    	{
            { "Guru99", "India" },
            { "Krishna", "UK" },
            { "Bhupesh", "USA" }
        };

    }

}

다른 클래스에서 DataProvider 호출

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

TestNG : Selenium에서 XML 및 DataProvider를 사용하여 매개 변수화

코드 예제

TestNG : Selenium에서 XML 및 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.firefox.marionette", 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"));
        // Google 텍스트 상자에서 텍스트 검색
        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();
        // 검색 창에 올바른 값이 있는지 확인합니다.
        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 메서드에서 지원하는 매개 변수에는 두 가지 유형이 있습니다.

메서드 -  Same  DataProvider가 다른 테스트 메서드와 다르게 동작해야하는 경우 Method 매개 변수를 사용합니다.

TestNG : Selenium에서 XML 및 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.firefox.marionette", 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"));
        // 검색 창에서 텍스트 검색
        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();
        // Google 입력란에 올바른 값이 표시되는지 확인합니다.
        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);
             // 검색 문자열 만 출력
            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();
            // Google 입력란에 올바른 값이 표시되는지 확인합니다.
            Assert.assertTrue(testValue.equalsIgnoreCase(searchKey));
        }
    }    
    /**
     * 여기 테스트 메소드 이름에 따라 값을 반환하는 DataProvider
     * @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" }
            };}       
    }
}

다음은 결과물입니다.

TestNG : Selenium에서 XML 및 DataProvider를 사용하여 매개 변수화

ITestContext - 그룹을 기반으로하는 테스트 케이스에 대해 다른 매개 변수를 만드는 데 사용할 수 있습니다.

현실에서는 ITestContext를 사용하여 테스트 메서드, 호스트 및 테스트 구성을 기반으로 매개 변수 값을 변경할 수 있습니다.

TestNG : Selenium에서 XML 및 DataProvider를 사용하여 매개 변수화

다음 코드 예제에서

  • 우리는 2 개의 그룹 A & B를 가지고 있습니다.
  • 각 테스트 방법은 그룹에 할당됩니다.
  • 그룹의 값이 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.firefox.marionette", 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{
		{
		  / Google 텍스트 상자 검색
			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.getAttribute("value");
			System.out.println(testValue +"::::"+searchKey);
			searchText.clear();
			// searchbox에서 올바른 값을 확인하십시오.
			Assert.assertTrue(testValue.equalsIgnoreCase(searchKey));
	}
	}
	
	@Test(dataProvider="SearchProvider",groups="B")
	public void testMethodB(String searchKey) throws InterruptedException{
		{
		   // Google 검색 창 찾기
			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.getAttribute("value");
			System.out.println(testValue +"::::"+searchKey);
			searchText.clear();
			// searchbox에서 올바른 값을 확인하십시오.
			Assert.assertTrue(testValue.equalsIgnoreCase(searchKey));
	}
	}
	
	/**
	 * DAtaProvider는 ITestContext를 기반으로 Object 배열을 제공합니다.
	 * @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를 지원 파라미터 두 종류, 사용  @ 파라미터 + TestNG.xml을  하고 사용  @DataProvider을
  • 에서  @ 매개 변수 + TestNG.xml  매개 변수 스위트 룸 수준과 시험 수준에 배치 할 수 있습니다. 만약

    동일한 매개 변수 이름은 두 위치 모두에서 선언됩니다. 테스트 레벨 매개 변수는 정장 레벨 매개 변수보다 우선 적용됩니다.

  • @ Parameter + TestNG.xml을 사용하면 한 번에 하나의 값만 설정할 수 있지만 @DataProvider 는 Object의 2 차원 배열을 반환  합니다 .
  • DataProvider가 다른 클래스에 있고 테스트 클래스가 상주하는 클래스 인 경우  DataProvider  는 정적 메서드 여야합니다  .
  • DataProvider에서 지원하는 두 가지 매개 변수   는  Method  및  ITestContext입니다.


"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
Posted by 프리스케이터