Dostawca danych & TestNG XML: Parametryzacja w Selenium(Przykład)
Parametryzacja w Selenium
Parametryzacja w Selenium to proces parametryzacji skryptów testowych w celu przekazania wielu danych do aplikacji w czasie wykonywania. Jest to strategia wykonania, która automatycznie uruchamia przypadki testowe wiele razy, używając różnych wartości. Koncepcja osiągnięta poprzez parametryzację skryptów testowych nazywa się Testowanie oparte na danych.
Rodzaj parametryzacji w TestNG-
Aby parametryzacja była bardziej przejrzysta, omówimy opcje parametryzacji w jednym z najpopularniejszych frameworków Selenium Sterownik internetowy – TestNG.
Tam są dwie drogi dzięki któremu możemy osiągnąć parametryzację w TestNG
Parametry z Testng.xml mogą być na poziomie pakietu lub testu
Parametr z DataProvider może przyjmować metodę i ITestContext jako parametr.
Przeanalizujmy je szczegółowo –
Parametry Adnotacja w TestNG
Parametry Adnotacja w TestNG to metoda używana do przekazywania wartości do metod testowych jako argumentów przy użyciu pliku .xml. Użytkownicy mogą być zobowiązani do przekazania wartości do metod testowych w czasie wykonywania. Metodę adnotacji @Parameters można zastosować w dowolnej metodzie posiadającej adnotację @Test, @Before, @After lub @Factory.
Adnotacja parametrów za pomocą Testng.xml
Wybierz parametryzację za pomocą adnotacji, jeśli chcesz mieć do czynienia ze złożonością, a liczba kombinacji wejściowych jest mniejsza.
Zobaczmy jak to działa
Scenariusz testowy
Krok 1) Uruchom przeglądarkę i przejdź do Google.com
Krok 2) Wprowadź wyszukiwane słowo kluczowe
Krok 3) Sprawdź, czy wprowadzona wartość jest taka sama, jak ta podana w naszych danych testowych
Krok 4) Powtarzaj kroki 2 i 3, aż zostaną wprowadzone wszystkie wartości
| Autor testu | Klucz wyszukiwania |
|---|---|
| Guru99 | India |
| Krishna | USA |
| Bhupesz | Chiny |
Oto przykład, jak to zrobić BEZ parametrów
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));
}
}
Studium, powyższy przykład. Wyobraź sobie, jak skomplikowany stanie się kod, gdy zrobimy to dla 3 kombinacji wejściowych
Teraz sparametryzujmy to za pomocą TestNG
Aby to zrobić, będziesz musiał
- Utwórz plik XML, w którym będą przechowywane parametry
-
W teście dodaj adnotację @Parameters
Oto pełny kod
Poziom testowy 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>
ParametrZTestNGPlik 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));
}
}
Instrukcje dotyczące uruchomienia skryptu wybierz plik XML i Uruchom jako Test NG Suite
Kliknij prawym przyciskiem myszy plik .xml -> Uruchom jako -> Testowanie Apartament (Uwaga: Apartament)
Teraz parametry można definiować na 2 poziomach
- Poziom pakietu – parametry wewnątrz znacznik TestNG Plik XML będzie parametrem na poziomie pakietu.
- Poziom testu — parametry wewnątrz znacznik testowego pliku XML będzie parametrem poziomu testu.
Oto ten sam test z parametrami na poziomie pakietu
UWAGA: W przypadku, gdy nazwa parametru jest taka sama na poziomie pakietu i na poziomie testu, parametr poziomu testu będzie miał pierwszeństwo przed poziomem pakietu. Zatem w takim przypadku wszystkie klasy znajdujące się na tym poziomie testu będą miały wspólny parametr z nadpisanym parametrem, a inne klasy znajdujące się poza poziomem testu będą miały wspólny parametr z poziomu zestawu.
Rozwiązywanie problemów
Wydanie nr 1 Wartość parametru w pliku testng.xml nie może być rzutowana na parametr odpowiadającej mu metody testowej, gdyż spowoduje to błąd.
Rozważmy następujący przykład
Tutaj atrybut „autor” jest równy „Guru99”, który jest ciągiem znaków i w odpowiedniej metodzie testowej oczekuje wartości całkowitej, więc tutaj otrzymamy wyjątek.
Wydanie nr 2 Twoje @Parametry nie mają odpowiedniej wartości w pliku testowym.xml.
Możesz rozwiązać tę sytuację, dodając @opcjonalny adnotacja w odpowiednim parametrze metody badawczej.
Kwestia nr 3: Chcesz przetestować wiele wartości tego samego parametru za pomocą Testng.xml
Prosta odpowiedź brzmi: nie da się tego zrobić! Możesz mieć wiele różnych parametrów, ale każdy parametr może mieć tylko jedną wartość. Pomaga to zapobiec zakodowaniu wartości na stałe w skrypcie. Dzięki temu kod nadaje się do ponownego użycia. Pomyśl o tym jak o plikach konfiguracyjnych swojego skryptu. Jeśli chcesz użyć wielu wartości parametru, użyj DataProviders
Dostawca danych w TestNG
Dostawca danych w TestNG jest metodą używaną, gdy użytkownik musi przekazać złożone parametry. Złożone parametry muszą być tworzone z Java takie jak złożone obiekty, obiekty z plików właściwości lub z bazy danych mogą być przekazywane przez metodę dostawcy danych. Metoda jest adnotowana przez @DataProvider i zwraca tablicę obiektów.
Parametry przy użyciu dostawcy danych
Adnotacja @Parameters jest łatwa, ale aby przetestować wiele zestawów danych, musimy skorzystać z dostawcy danych.
Aby wypełnić tysiące formularzy internetowych przy użyciu naszego środowiska testowego, potrzebujemy innej metodologii, która może zapewnić nam bardzo duży zbiór danych w jednym przepływie wykonania.
Tę koncepcję opartą na danych osiąga się poprzez @Dostawca danych adnotacja w TestNG.
Ma tylko jeden atrybut „nazwa”. Jeśli nie określisz atrybutu name, nazwa dostawcy danych będzie taka sama, jak odpowiednia nazwa metody.
Zwroty dostawców danych dwuwymiarowy obiekt Java do metody testowej i metody testowej, wywoła M razy w tablicy obiektów typu M*N. Na przykład, jeśli DataProvider zwróci tablicę obiektów 2*3, odpowiedni przypadek testowy zostanie wywołany 2 razy z 3 parametrami za każdym razem.
Kompletny przykład
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" }
};
}
}
Wywołaj DataProvider z innej klasy
Domyślnie DataProvider znajduje się w tej samej klasie, w której znajduje się metoda testowa lub jej klasa bazowa. Aby umieścić go w innej klasie, musimy ustawić metodę dostawcy danych jako statyczną, a w metodzie testowej musimy dodać atrybut klasa dostawcy danych in @Test adnotacja.
Przykład kodu
TestClass ParametrDataproviderWithClassLevel.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" }
};
}}
Typy parametrów w dostawcy danych
Istnieją dwa rodzaje parametrów obsługiwanych przez metodę DataProvider.
Metoda wykonania- Jeśli PODOBNIE DataProvider powinien zachowywać się inaczej w przypadku różnych metod testowych, użyj parametru Method.
W poniższym przykładzie,
- Sprawdzamy, czy nazwa metody to testMethodA.
- Jeśli tak, zwróć jeden zestaw wartości
- W przeciwnym razie zwróć inny zestaw wartości
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" }
};}
}
}
Oto wynik
Kontekst testowy– Może służyć do tworzenia różnych parametrów dla przypadków testowych w oparciu o grupy.
W prawdziwym życiu możesz użyć ITestContext do różnicowania wartości parametrów w oparciu o metody testowe, hosty i konfiguracje testu.
W poniższym przykładzie kodu
- Mamy 2 grupy A i B
- Każda metoda badawcza jest przypisana do grupy
- Jeśli wartością grupy jest A, zwracany jest określony zestaw danych
- Jeśli wartością grupy jest B, zwracany jest inny zestaw danych
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;
}
}
Uwaga: Jeśli bezpośrednio uruchomisz klasę testng, najpierw wywoła ona dataprovider, który nie może uzyskać informacji o grupach, ponieważ grupy nie są dostępne. Ale jeśli zamiast tego wywołasz tę klasę za pomocą testng.xml, będzie ona miała informacje o grupach dostępne w ITestContext. Użyj następującego XML, aby wywołać 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>
Podsumowanie
- Parametryzacja jest wymagane do utworzenia Testowanie oparte na danych.
- TestNG obsługują dwa rodzaje parametryzacji, używając @Parametr+TestNG. Xml i za pomocą@Dostawca danych
-
In @Parametr+TestNG. Xml Parametry można umieścić na poziomie zestawu i poziomie testu. Jeśli
W obu miejscach zadeklarowana jest ta sama nazwa parametru; parametr poziomu testu będzie miał pierwszeństwo przed parametrem poziomu kombinezonu.
- używając @Parametr+TestNG.xml można ustawić tylko jedną wartość na raz, ale @DataProvider zwraca wartość tablica 2d obiektów.
- Jeśli DataProvider jest obecny w innej klasie, to jest to klasa, w której znajduje się metoda testowa,Dostawca danych powinno być metoda statyczna.
- Obsługiwane są dwa parametry Dostawca danych jest Metoda wykonania oraz Kontekst testowy.
















