Dostawca danych & TestNG XML: Parametryzacja w Selenium(Przykład)

Tworząc oprogramowanie, zawsze pragniemy, aby działało ono inaczej z innym zestawem danych. Jeśli chodzi o Testowanie tego samego oprogramowania, nie może być niesprawiedliwe przetestowanie go przy użyciu tylko jednego zestawu danych. Tutaj ponownie musimy sprawdzić, czy nasz system przyjmuje wszystkie zestawy kombinacji, które mają obsługiwać. W tym celu musimy sparametryzować nasze skrypty testowe. Oto parametryzacja na zdjęciu.

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

  1. Dzięki parametry adnotacja i TestNG XML plik.

    Rodzaj parametryzacji w TestNG

  2. Dzięki Dostawca danych adnotacja.

    Rodzaj parametryzacji w TestNG

Rodzaj parametryzacji 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

Adnotacja parametrów za pomocą Testng.Xml

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

Adnotacja parametrów za pomocą Testng.Xml

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)

ParametrZTestNGPlik XML.java

Teraz parametry można definiować na 2 poziomach

  1. Poziom pakietu – parametry wewnątrz znacznik TestNG Plik XML będzie parametrem na poziomie pakietu.
  2. Poziom testu — parametry wewnątrz znacznik testowego pliku XML będzie parametrem poziomu testu.

Oto ten sam test z parametrami na poziomie pakietu

ParametrZTestNGPlik XML.java

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.

ParametrZTestNGPlik XML.java

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

Rozwiązywanie problemów

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.

Rozwiązywanie problemów

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.

Parametry przy użyciu dostawcy danych

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.

Parametry przy użyciu dostawcy danych

Kompletny przykład

Parametry przy użyciu dostawcy 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.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.

Wywołaj DataProvider z innej klasy

Przykład kodu

Wywołaj DataProvider z innej klasy

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.

Typy parametrów w Dataprovider

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

Typy parametrów w Dataprovider

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.

Typy parametrów w Dataprovider

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 i Kontekst testowy.