Tworząc oprogramowanie, zawsze chcemy, aby działało inaczej z innym zestawem danych. Jeśli chodzi o testowanie tego samego oprogramowania, nie możemy być niesprawiedliwi, testując go tylko z jednym zestawem 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. Na obrazku pojawia się parametryzacja.
Parametryzacja w selenie
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 wielokrotnie, używając różnych wartości. Koncepcja osiągnięta poprzez parametryzację skryptów testowych nazywa się testowaniem opartym na danych .
W tym samouczku nauczysz się:
- Rodzaj parametryzacji w TestNG-
- Adnotacja parametrów za pomocą Testng.xml
- Rozwiązywanie problemów
- Parametry używające Dataprovider
- Wywołaj dostawcę danych z innej klasy
- Typy parametrów w dostawcy danych
Rodzaj parametryzacji w TestNG-
Aby uczynić parametryzację bardziej przejrzystą, przejdziemy przez opcje parametryzacji w jednym z najpopularniejszych frameworków dla Selenium Webdriver - TestNG .
Istnieją dwa sposoby, dzięki którym możemy osiągnąć parametryzację w TestNG
- Za pomocą adnotacji parametrów i pliku XML TestNG .
- Za pomocą adnotacji DataProvider .
Parametry z Testng.xml mogą być na poziomie pakietu lub testu
Parametr z DataProvider może przyjmować Method i ITestContext jako parametr.
Przeanalizujmy je szczegółowo -
Opis parametrów w TestNG
Adnotacja parametrów w TestNG to metoda używana do przekazywania wartości do metod testowych jako argumentów za pomocą 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 z adnotacją @Test, @Before, @After lub @Factory.
Adnotacja parametrów za pomocą Testng.xml
Wybierz parametryzację za pomocą adnotacji, jeśli chcesz poradzić sobie ze złożonością, a liczba kombinacji danych wejściowych jest mniejsza.
Zobaczmy, jak to działa
Scenariusz testowy
Krok 1) Uruchom przeglądarkę i przejdź do Google.com
Krok 2) Wprowadź słowo kluczowe wyszukiwania
Krok 3) Sprawdź, czy wprowadzona wartość jest taka sama, jak ta dostarczona przez nasze dane testowe
Krok 4) Powtarzaj 2 i 3, aż wszystkie wartości zostaną wprowadzone
Autor testu | SearchKey |
Guru99 | Indie |
Kryszna | USA |
Bhupesh | Chiny |
Oto przykład jak to zrobić BEZ parametrów
parametry pakietu;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";Sterownik WebDriver;@Testpublic void testNoParameter () rzuca InterruptedException {Autor ciągu = "guru99";String searchKey = "indie";System.setProperty ("webdriver.gecko.driver", driverPath);driver = nowy FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get („https://google.com”);WebElement searchText = driver.findElement (By.name ("q"));// Wyszukiwanie tekstu w polu tekstowym GooglesearchText.sendKeys (searchKey);System.out.println ("Witamy ->" + autor + "Twój klucz wyszukiwania to ->" + searchKey);System.out.println ("Wątek będzie teraz spał");Thread.sleep (3000);System.out.println ("Wartość w polu wyszukiwania Google =" + searchText.getAttribute ("value") + "::: Wartość podana przez input =" + searchKey);// weryfikacja wartości w polu wyszukiwania GoogleAssertJUnit.assertTrue (searchText.getAttribute ("value"). EqualsIgnoreCase (searchKey));}}
Studium, powyższy przykład. Wyobraź sobie, jak skomplikowany stanie się kod, gdy zrobimy to dla 3 kombinacji danych 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 testu TestNG.xml
xml version = "1.0" encoding = "UTF-8"?>
Plik ParameterWithTestNGXML.java
parametry pakietu;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";Sterownik WebDriver;@Test@Parameters ({"author", "searchKey"})public void testParameterWithXML (@Optional ("Abc") String autor, String searchKey) rzuca InterruptedException {System.setProperty ("webdriver.gecko.driver", driverPath);driver = nowy FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get („https://google.com”);WebElement searchText = driver.findElement (By.name ("q"));// Wyszukiwanie tekstu w polu tekstowym GooglesearchText.sendKeys (searchKey);System.out.println ("Witamy ->" + autor + "Twój klucz wyszukiwania to ->" + searchKey);System.out.println ("Wątek będzie teraz spał");Thread.sleep (3000);System.out.println ("Wartość w polu wyszukiwania Google =" + searchText.getAttribute ("value") + "::: Wartość podana przez input =" + searchKey);// weryfikacja wartości w polu wyszukiwania GoogleAssertJUnit.assertTrue (searchText.getAttribute ("value"). EqualsIgnoreCase (searchKey));}}
Instrukcje uruchomienia skryptu, wybierz plik XML i Uruchom jako Test NG Suite
Kliknij prawym przyciskiem myszy plik .xml -> Uruchom jako -> Testng Suite (Uwaga: pakiet)
Teraz parametry można zdefiniować na 2 poziomach
- Poziom pakietu - parametry wewnątrz tagu
pliku XML TestNG będą parametrami na poziomie pakietu. - Poziom testu - parametry wewnątrz tagu
testowego pliku XML będą parametrem poziomu testu.
Oto ten sam test z parametrami na poziomie zestawu
UWAGA: W przypadku, gdy nazwa parametru jest taka sama na poziomie zestawu i na poziomie testu, wówczas parametr poziomu testu będzie miał pierwszeństwo przed poziomem zestawu. Tak więc w takim przypadku wszystkie klasy wewnątrz tego poziomu testów będą współdzieliły przesłonięty parametr, a inne klasy, które znajdują się poza poziomem testów, będą miały ten sam parametr poziomu zestawu.
Rozwiązywanie problemów
Problem nr 1 Wartość parametru w pliku testng.xml nie może zostać przypisana do parametru odpowiedniej metody testowej, spowoduje to zgłoszenie błędu.
Rozważmy następujący przykład
Tutaj atrybut „autor” jest równy „Guru99”, który jest łańcuchem znaków iw odpowiedniej metodzie testowej oczekuje wartości całkowitej, więc otrzymamy tutaj wyjątek.
Kwestia # 2 Twoje @Parameters nie mają odpowiedniej wartości w testing.xml.
Możesz rozwiązać tę sytuację, dodając adnotację @optional w odpowiednim parametrze w metodzie testowej.
Problem # 3: Chcesz przetestować wiele wartości tego samego parametru przy użyciu 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 w skrypcie. Dzięki temu kod można ponownie wykorzystać. Pomyśl o tym jak o plikach konfiguracyjnych swojego skryptu. Jeśli chcesz użyć wielu wartości parametru, użyj dostawców danych
Dostawca danych w TestNG
Dostawca danych w TestNG to metoda używana, gdy użytkownik musi przekazać złożone parametry. Złożone parametry muszą być tworzone w Javie, takie jak złożone obiekty, obiekty z plików właściwości lub z bazy danych mogą być przekazywane za pomocą metody dostawcy danych. Metoda jest opatrzona adnotacjami @DataProvider i zwraca tablicę obiektów.
Parametry używające Dataprovider
Adnotacja @Parameters jest łatwa, ale aby przetestować wiele zestawów danych, musimy użyć dostawcy danych.
Aby wypełnić tysiące formularzy internetowych przy użyciu naszego środowiska testowego, potrzebujemy innej metodologii, która może dać nam bardzo duży zbiór danych w jednym przepływie wykonania.
Ta koncepcja oparta na danych jest osiągnięta przez adnotację @DataProvider w TestNG.
Ma tylko jeden atrybut „nazwa” . Jeśli nie określisz atrybutu nazwy, nazwa dostawcy danych będzie taka sama, jak nazwa odpowiedniej metody.
Dostawca danych zwraca dwuwymiarowy obiekt JAVA do metody testowej, a metoda testowa wywoła M razy w tablicy obiektów typu M * N. Na przykład, jeśli DataProvider zwróci tablicę 2 * 3 obiektów, odpowiedni przypadek testowy zostanie wywołany 2 razy z 3 parametrami za każdym razem.
Kompletny przykład
parametry pakietu;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 {Sterownik WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTestpublic void setup () {// Utwórz obiekt sterownika firefoxSystem.setProperty ("webdriver.gecko.driver", driverPath);driver = nowy FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get („https://google.com”);}/ ** Przypadek testowy do weryfikacji pola wyszukiwania Google* Autor @param* @param searchKey* @throws InterruptedException* /@Test (dataProvider = "SearchProvider")public void testMethod (autor String, String searchKey) rzuca InterruptedException {{WebElement searchText = driver.findElement (By.name ("q"));// wartość wyszukiwania w polu wyszukiwania GooglesearchText.sendKeys (searchKey);System.out.println ("Witamy ->" + autor + "Twój klucz wyszukiwania to ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("wartość");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Sprawdź, czy wartość w polu wyszukiwania Google jest poprawnaAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** @return Object [] [], gdzie pierwsza kolumna zawiera słowo „autor”* a druga kolumna zawiera „searchKey”* /@DataProvider (name = "SearchProvider")public Object [] [] getDataFromDataprovider () {zwróć nowy obiekt [] []{{"Guru99", "Indie"},{"Krishna", "UK"},{„Bhupesh”, „USA”}};}}
Wywołaj dostawcę danych 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 uczynić metodę dostawcy danych statyczną, aw metodzie testowej musimy dodać atrybut dataProviderClass w adnotacji @Test .
Przykład kodu
TestClass ParameterDataproviderWithClassLevel.java
parametry pakietu;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 {Sterownik WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTestpublic void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = nowy FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get („https://google.com”);}@Test (dataProvider = "SearchProvider", dataProviderClass = DataproviderClass.class)public void testMethod (autor String, String searchKey) rzuca InterruptedException {WebElement searchText = driver.findElement (By.name ("q"));// Wyszukaj tekst w polu tekstowym GooglesearchText.sendKeys (searchKey);System.out.println ("Witamy ->" + autor + "Twój klucz wyszukiwania to ->" + searchKey);Thread.sleep (3000);// pobierz tekst z pola wyszukiwaniaString testValue = searchText.getAttribute ("wartość");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// sprawdź, czy pole wyszukiwania ma poprawną wartośćAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}
DataproviderClass.java
parametry pakietu;import org.testng.annotations.DataProvider;public class DataproviderClass {@DataProvider (name = "SearchProvider")public static Object [] [] getDataFromDataprovider () {zwraca nowy obiekt [] [] {{"Guru99", "Indie"},{"Krishna", "UK"},{„Bhupesh”, „USA”}};}}
Typy parametrów w dostawcy danych
Istnieją dwa typy parametrów obsługiwanych przez metodę DataProvider.
Metoda - jeśli SAME DataProvider powinien zachowywać się inaczej z inną metodą testową, 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
parametry pakietu;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 {Sterownik WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTestpublic void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = nowy FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get („https://google.com”);}@Test (dataProvider = "SearchProvider")public void testMethodA (autor ciągu znaków, ciąg searchKey) rzuca InterruptedException {WebElement searchText = driver.findElement (By.name ("q"));// Wyszukaj tekst w polu wyszukiwaniasearchText.sendKeys (searchKey);// Wydrukuj autora i ciąg wyszukiwaniaSystem.out.println ("Witamy ->" + autor + "Twój klucz wyszukiwania to ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("wartość");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Sprawdź, czy pole tekstowe Google pokazuje prawidłową wartośćAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}@Test (dataProvider = "SearchProvider")public void testMethodB (String searchKey) rzuca InterruptedException {{WebElement searchText = driver.findElement (By.name ("q"));// Wyszukaj tekst w polu wyszukiwaniasearchText.sendKeys (searchKey);// Drukuj tylko szukany ciągSystem.out.println ("Witamy -> Nieznany użytkownik Twój klucz wyszukiwania to ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("wartość");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Sprawdź, czy pole tekstowe Google pokazuje prawidłową wartośćAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** Tutaj DataProvider zwraca wartość na podstawie nazwy metody testowej* @param m* @powrót** /@DataProvider (name = "SearchProvider")public Object [] [] getDataFromDataprovider (metoda m) {if (m.getName (). equalsIgnoreCase ("testMethodA")) {zwraca nowy obiekt [] [] {{"Guru99", "Indie"},{"Krishna", "UK"},{„Bhupesh”, „USA”}};}jeszcze{zwraca nowy obiekt [] [] {{"Kanada"},{ "Rosja" },{ "Japonia" }};}}}
Oto wynik
ITestContext - może służyć do tworzenia różnych parametrów dla przypadków testowych w oparciu o grupy.
W rzeczywistości możesz użyć ITestContext do zmiany wartości parametrów w oparciu o metody testowania, hosty, konfiguracje testu.
W poniższym przykładzie kodu
- Mamy 2 grupy A i B.
- Każda metoda testowa 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
parametry pakietu;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 {Sterownik WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTest (groups = {"A", "B"})public void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = nowy FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get („https://google.com”);}@Test (dataProvider = "SearchProvider", groups = "A")public void testMethodA (autor ciągu znaków, ciąg searchKey) rzuca InterruptedException {{// przeszukaj pole tekstowe GoogleWebElement searchText = driver.findElement (By.name ("q"));// wyszukaj na nim wartośćsearchText.sendKeys (searchKey);System.out.println ("Witamy ->" + autor + "Twój klucz wyszukiwania to ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("wartość");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// sprawdź poprawną wartość w polu wyszukiwaniaAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}@Test (dataProvider = "SearchProvider", groups = "B")public void testMethodB (String searchKey) rzuca InterruptedException {{// znajdź pole wyszukiwania GoogleWebElement searchText = driver.findElement (By.name ("q"));// wyszukaj na nim wartośćsearchText.sendKeys (searchKey);System.out.println ("Witamy -> Nieznany użytkownik Twój klucz wyszukiwania to ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("wartość");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// sprawdź poprawną wartość w polu wyszukiwaniaAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** Tutaj DAtaProvider dostarczy tablicę Object na podstawie ITestContext* @param c* @powrót* /@DataProvider (name = "SearchProvider")public Object [] [] getDataFromDataprovider (ITestContext c) {Object [] [] groupArray = null;for (grupa ciągów: c.getIncludedGroups ()) {if (group.equalsIgnoreCase ("A")) {groupArray = nowy obiekt [] [] {{"Guru99", "Indie"},{"Krishna", "UK"},{„Bhupesh”, „USA”}};przerwa;}else if (group.equalsIgnoreCase ("B")){groupArray = nowy obiekt [] [] {{"Kanada"},{ "Rosja" },{ "Japonia" }};}przerwa;}return groupArray;}}
Uwaga: jeśli bezpośrednio uruchomisz klasę testng, najpierw wywoła ona dostawcę danych, który nie może uzyskać informacji o grupach, ponieważ grupy są niedostępne. Ale zamiast tego, jeśli wywołasz tę klasę za pośrednictwem testng.xml, informacje o grupach będą dostępne za pomocą ITestContext. Użyj następującego kodu XML, aby wywołać test
Podsumowanie :
- Do tworzenia testów opartych na danych wymagana jest parametryzacja .
- TestNG obsługuje dwa rodzaje parametryzacji, używając @ Parameter + TestNG.xml i używając @DataProvider
- W @ Parameter + TestNG.xml parametry można umieścić na poziomie pakietu i na poziomie testu. Gdyby
Ta sama nazwa parametru jest zadeklarowana w obu miejscach; parametr poziomu testu będzie miał pierwszeństwo przed parametrem poziomu kombinezonu.
- używając @ Parameter + TestNG.xml można ustawić tylko jedną wartość naraz, ale @DataProvider zwraca dwuwymiarową tablicę Object .
- Jeśli Dostawca danych jest obecny w różnych klas to grupa w której znajduje się metody badań Dostawca danych powinien sposób statyczny .
- Istnieją dwa parametry obsługiwane przez DataProvider to Method i ITestContext.