우리가 소프트웨어를 만들 때, 우리는 항상 다른 데이터 집합과 다르게 작동해야한다고 생각합니다. 그것이 올 때 테스트 소프트웨어의 동일한 조각을, 우리는 데이터를 하나의 세트로 테스트하는 불공정 수 없습니다. 여기서도 우리 시스템이 지원할 것으로 예상되는 모든 조합을 취하고 있는지 확인해야합니다.
여기 그림에서 매개 변수화가 있습니다. 런타임에 여러 데이터를 응용 프로그램에 전달하려면 테스트 스크립트를 매개 변수화해야합니다.
매개 변수화로 달성 할 수있는 개념을 데이터 기반 테스트 라고 합니다.
TestNG에서 매개 변수화 유형 -
매개 변수화를보다 명확하게하기 위해 Selenium Webdriver ( TestNG) 에서 가장 널리 사용되는 프레임 워크에서 매개 변수화 옵션을 살펴 보겠습니다 .
거기 두 가지 방법이 있는 우리가 TestNG의에서 파라미터를 달성 할 수는
Testng.xml의 매개 변수는 스위트 또는 테스트 수준 일 수 있습니다.
DataProvider의 매개 변수는 Method 및 ITestContext를 매개 변수로 사용할 수 있습니다.
자세히 연구 해 봅시다.
Testng.xml을 사용한 매개 변수 주석
복잡성을 처리하고 입력 조합의 수가 적을 때 특수 효과를 사용하여 매개 변수화를 선택하십시오.
이것이 어떻게 작동하는지 보자.
테스트 시나리오
1 단계) 브라우저를 시작하고 Google.com으로 이동합니다.
2 단계) 검색 키워드 입력
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.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)를 마우스 오른쪽 버튼으로 클릭 하십시오.
이제 매개 변수를 2 단계로 정의 할 수 있습니다.
- 스위트 레벨 - TestNG XML 파일의 <suite> 태그 안에있는 매개 변수는 스위트 레벨 매개 변수가됩니다.
- 테스트 레벨 - 테스트 XML 파일의 <Test> 태그 안의 매개 변수는 테스트 레벨 매개 변수가됩니다.
스위트 레벨 매개 변수를 사용한 동일한 테스트가 있습니다.
참고 : 매개 변수 이름이 스위트 수준 및 테스트 수준에서 동일하면 테스트 수준 매개 변수가 스위트 수준보다 우선 적용됩니다. 따라서이 경우 테스트 레벨 내의 모든 클래스가 재정의 된 매개 변수를 공유하며 테스트 레벨 외부의 다른 클래스는 스위트 레벨 매개 변수를 공유합니다.
문제 해결
문제 # 1 testng.xml의 매개 변수 값을 해당 테스트 메소드의 매개 변수로 유형 변환 할 수 없으므로 오류가 발생합니다.
여기에서 'author'속성은 문자열이고 해당 테스트 메소드에서 정수 값을 기대하는 'Guru99'와 같으므로 여기서 예외가 발생합니다.
이슈 # 2 @Parameters에는 testing.xml에 해당 값이 없습니다.
테스트 메소드의 해당 매개 변수에 @optional 주석 을 추가 하여이 상황을 해결할 수 있습니다 .
문제 # 3 : Testng.xml을 사용하여 동일한 매개 변수의 여러 값을 테스트하려고합니다.
간단한 대답은 이것이 할 수 없다는 것입니다! 여러 매개 변수를 가질 수 있지만 각 매개 변수는 하나의 값만 가질 수 있습니다. 이렇게하면 스크립트로 값을 하드 코딩하는 것을 방지 할 수 있습니다. 이렇게하면 코드를 재사용 할 수 있습니다. 스크립트의 설정 파일로 생각하십시오. 매개 변수에 여러 값을 사용하려면 DataProviders
Dataprovider를 사용하는 매개 변수
@Parameters 주석은 쉽지만 여러 데이터 집합을 테스트하려면 데이터 공급자를 사용해야합니다.
테스트 프레임 워크를 사용하여 수천 개의 웹 폼을 채우려면 단일 실행 흐름에서 매우 큰 데이터 세트를 제공 할 수있는 다른 방법이 필요합니다.
이 데이터 중심 개념은 TestNG의 @DataProvider 주석에 의해 달성됩니다 .
'name'속성 은 하나뿐입니다 . name 특성을 지정하지 않으면 DataProvider의 이름이 해당 메서드 이름과 동일하게됩니다.
데이터 공급자는 2 차원 JAVA 객체 를 테스트 메서드 및 테스트 메서드에 반환 하고 M * N 형식의 개체 배열에서 M 번 호출합니다. 예를 들어 DataProvider가 2 * 3 객체의 배열을 반환하면 매번 3 개의 매개 변수를 사용하여 해당 테스트 사례가 2 회 호출됩니다.
완전한 예
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 특성을 추가해야합니다 .
코드 예제
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 매개 변수를 사용합니다.
다음 예에서,
- 메소드 이름이 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" }
};}
}
}
다음은 결과물입니다.
ITestContext - 그룹을 기반으로하는 테스트 케이스에 대해 다른 매개 변수를 만드는 데 사용할 수 있습니다.
현실에서는 ITestContext를 사용하여 테스트 메서드, 호스트 및 테스트 구성을 기반으로 매개 변수 값을 변경할 수 있습니다.
다음 코드 예제에서
- 우리는 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입니다.
'자동화테스트 > Selenium' 카테고리의 다른 글
Selenium의 Page Object Model (POM) 및 페이지 팩토리 : 전체 자습서 (0) | 2018.12.06 |
---|---|
Selenium Webdriver의 Excel 파일에서 데이터 읽기 및 쓰기 : POI 및 JXL (0) | 2018.12.05 |
(selenium) 암시 적 대기 및 명시적인 셀레니움 대기 (0) | 2018.12.03 |
XPath에는 Selenium WebDriver의 형제, 조상 함수가 포함 (0) | 2018.12.02 |
Selenium WebDriver의 Alert(경고창) & Popup Window(팝업창) Handling(다루기) (1) | 2018.11.30 |