Terwijl we software maken, zouden we altijd willen dat het anders zou werken met een andere set gegevens. Als het gaat om het testen van hetzelfde stuk software, kunnen we niet oneerlijk zijn om het te testen met slechts één set gegevens. Ook hier moeten we verifiëren dat ons systeem alle combinaties accepteert die naar verwachting zullen worden ondersteund. Daarvoor moeten we onze testscipts parametriseren. Hier komt parametrisering in beeld.
Parametrering in Selenium
Parametrering in Selenium is een proces om de testscripts te parametreren om tijdens runtime meerdere gegevens door te geven aan de applicatie. Het is een uitvoeringsstrategie die automatisch testcases meerdere keren uitvoert met verschillende waarden. Het concept dat wordt bereikt door het parametriseren van de testscripts, wordt Data Driven Testing genoemd .
In deze tutorial leer je-
- Type parametrering in TestNG-
- Parameters annotatie met Testng.xml
- Probleemoplossen
- Parameters die Dataprovider gebruiken
- Roep DataProvider aan vanuit een andere klasse
- Typen parameters in Dataprovider
Type parametrering in TestNG-
Om de parametrering duidelijker te maken, zullen we de parameterisatie-opties doorlopen in een van de meest populaire frameworks voor Selenium Webdriver - TestNG .
Er zijn twee manieren waarop we parametrisering in TestNG kunnen bereiken
- Met behulp van Parameters annotatie en TestNG XML- bestand.
- Met behulp van DataProvider- annotatie.
Parameters van Testng.xml kunnen suite- of testniveau zijn
De parameter van DataProvider kan Method en ITestContext als parameter hebben.
Laten we ze in detail bestuderen -
Parameters Annotatie in TestNG
Parameters Annotatie in TestNG is een methode die wordt gebruikt om waarden door te geven aan de testmethoden als argumenten met behulp van een .xml-bestand. Het kan zijn dat gebruikers de waarden tijdens runtime aan de testmethoden moeten doorgeven. De annotatiemethode @Parameters kan worden gebruikt in elke methode met de annotatie @Test, @Before, @After of @Factory.
Parameters annotatie met Testng.xml
Selecteer parametrering met behulp van annotaties als u de complexiteit wilt aanpakken en het aantal invoercombinaties minder is.
Laten we eens kijken hoe dit werkt
Testscenario
Stap 1) Start de browser en ga naar Google.com
Stap 2) Voer een zoekwoord in
Stap 3) Controleer of de ingevoerde waarde dezelfde is als die van onze testgegevens
Stap 4) Herhaal 2 en 3 totdat alle waarden zijn ingevoerd
Test Auteur | SearchKey |
Guru99 | India |
Krishna | VS |
Bhupesh | China |
Hier is een voorbeeld van hoe u dit ZONDER parameters kunt doen
pakketparameters;importeer org.testng.annotations.Test;importeer org.testng.AssertJUnit;importeer java.util.concurrent.TimeUnit;import org.openqa.selenium.By;importeer org.openqa.selenium.WebDriver;importeer org.openqa.selenium.WebElement;importeer org.openqa.selenium.firefox.FirefoxDriver;openbare klasse NoParameterWithTestNGXML {String driverPath = "C: \\ geckodriver.exe";WebDriver-stuurprogramma;@Testpublic void testNoParameter () gooit InterruptedException {String author = "guru99";String searchKey = "india";System.setProperty ("webdriver.gecko.driver", driverPath);driver = nieuwe FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");WebElement searchText = driver.findElement (By.name ("q"));// Tekst zoeken in Google-tekstvaksearchText.sendKeys (searchKey);System.out.println ("Welkom ->" + auteur + "Uw zoeksleutel is ->" + zoeksleutel);System.out.println ("Thread zal nu slapen");Thread.sleep (3000);System.out.println ("Waarde in Google-zoekvak =" + searchText.getAttribute ("waarde") + "::: Waarde gegeven door input =" + searchKey);// verificatie van de waarde in het zoekvak van GoogleAssertJUnit.assertTrue (searchText.getAttribute ("waarde"). EqualsIgnoreCase (searchKey));
A Study, het bovenstaande voorbeeld. Stel je voor hoe complex de code wordt als we dit doen voor 3 invoercombinaties
Laten we dit nu parametriseren met TestNG
Om dit te doen, moet u
- Maak een XML-bestand waarin de parameters worden opgeslagen
- Voeg in de test annotatie @Parameters toe
Hier is de volledige code
Testniveau TestNG.xml
xml version = "1.0" encoding = "UTF-8"?>
ParameterWithTestNGXML.java-bestand
pakketparameters;importeer org.testng.AssertJUnit;importeer java.util.concurrent.TimeUnit;import org.openqa.selenium.By;importeer org.openqa.selenium.WebDriver;importeer org.openqa.selenium.WebElement;importeer org.openqa.selenium.firefox.FirefoxDriver;importeer org.testng.annotations.Optional;importeer org.testng.annotations.Parameters;importeer org.testng.annotations.Test;openbare klasse ParameterWithTestNGXML {String driverPath = "C: \\ geckodriver.exe";WebDriver-stuurprogramma;@Test@Parameters ({"author", "searchKey"})public void testParameterWithXML (@Optional ("Abc") String auteur, String searchKey) gooit InterruptedException {System.setProperty ("webdriver.gecko.driver", driverPath);driver = nieuwe FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");WebElement searchText = driver.findElement (By.name ("q"));// Tekst zoeken in Google-tekstvaksearchText.sendKeys (searchKey);System.out.println ("Welkom ->" + auteur + "Uw zoeksleutel is ->" + zoeksleutel);System.out.println ("Thread zal nu slapen");Thread.sleep (3000);System.out.println ("Waarde in Google-zoekvak =" + searchText.getAttribute ("waarde") + "::: Waarde gegeven door input =" + searchKey);// verificatie van de waarde in het zoekvak van GoogleAssertJUnit.assertTrue (searchText.getAttribute ("waarde"). EqualsIgnoreCase (searchKey));
Instructies om het script uit te voeren, selecteer het XML-bestand en Run as Test NG Suite
Klik met de rechtermuisknop op .xml-bestand -> Uitvoeren als -> Testng Suite (Opmerking: Suite)
Nu kunnen parameters op 2 niveaus worden gedefinieerd
- Suite-niveau - De parameters in de tag
van het TestNG XML-bestand zullen een parameter op suite-niveau zijn. - Testniveau - De parameters in de tag
van het XML-testbestand zijn een parameter op het testniveau.
Hier is dezelfde test met parameters op suite-niveau
OPMERKING: In het geval dat de parameternaam hetzelfde is in suite- en testniveau, krijgt de parameter op het testniveau de voorkeur boven het suite-niveau. Dus in dat geval zullen alle klassen binnen dat testniveau de overschreven parameter delen, en andere klassen die buiten het testniveau vallen, zullen de suite-niveau parameter delen.
Probleemoplossen
Probleem # 1 Parameterwaarde in testng.xml kan niet worden getypt naar de corresponderende parameter van de testmethode, het genereert een fout.
Beschouw het volgende voorbeeld eens
Hier is het 'author'-attribuut gelijk aan' Guru99 ', wat een string is en in de corresponderende testmethode verwacht het een integerwaarde, dus we krijgen hier een uitzondering.
Probleem # 2 Uw @Parameters hebben geen overeenkomstige waarde in testing.xml.
U kunt deze situatie oplossen door @optional annotatie toe te voegen aan de corresponderende parameter in de testmethode.
Probleem 3: u wilt meerdere waarden van dezelfde parameter testen met Testng.xml
Het simpele antwoord is dat dit niet mogelijk is! U kunt meerdere verschillende parameters hebben, maar elke parameter kan maar één waarde hebben. Dit helpt voorkomen dat waarden in het script worden gecodeerd. Dit maakt code herbruikbaar. Beschouw het als configuratiebestanden voor uw script. Als u meerdere waarden voor een parameter wilt gebruiken, gebruik dan DataProviders
Gegevensprovider in TestNG
Gegevensprovider in TestNG is een methode die wordt gebruikt wanneer een gebruiker complexe parameters moet doorgeven. Complexe parameters moeten vanuit Java worden gemaakt, zoals complexe objecten, objecten uit eigenschappenbestanden of uit een database kunnen worden doorgegeven via de gegevensprovider-methode. De methode is geannoteerd door @DataProvider en retourneert een reeks objecten.
Parameters die Dataprovider gebruiken
Annotatie van @Parameters is eenvoudig, maar om met meerdere sets gegevens te testen, hebben we Data Provider nodig.
Om duizenden webformulieren in te vullen met behulp van ons testraamwerk, hebben we een andere methodologie nodig die ons een zeer grote dataset in een enkele uitvoeringsstroom kan opleveren.
Dit gegevensgestuurde concept wordt bereikt door @DataProvider- annotatie in TestNG.
Het heeft slechts één kenmerk 'naam' . Als u het name-attribuut niet specificeert, zal de naam van de DataProvider hetzelfde zijn als de corresponderende methode-naam.
Gegevensprovider retourneert een tweedimensionaal JAVA-object naar de testmethode en de testmethode roept M keer op in een M * N-type objectmatrix. Als de DataProvider bijvoorbeeld een array van 2 * 3 objecten retourneert, wordt de bijbehorende testcase 2 keer aangeroepen met telkens 3 parameters.
Compleet voorbeeld
pakketparameters;importeer java.util.concurrent.TimeUnit;import org.openqa.selenium.By;importeer org.openqa.selenium.WebDriver;importeer org.openqa.selenium.WebElement;importeer org.openqa.selenium.firefox.FirefoxDriver;importeer org.testng.Assert;importeer org.testng.annotations.BeforeTest;importeer org.testng.annotations.DataProvider;importeer org.testng.annotations.Test;openbare klasse ParameterByDataprovider {WebDriver-stuurprogramma;String driverPath = "C: \\ geckodriver.exe";@BeforeTestopenbare ongeldige instelling () {// Maak een firefox-stuurprogramma-objectSystem.setProperty ("webdriver.gecko.driver", driverPath);driver = nieuwe FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");/ ** Testcase om het zoekvak van Google te verifiëren* @param auteur* @param searchKey* @throws InterruptedException@Test (dataProvider = "SearchProvider")public void testMethod (String author, String searchKey) gooit InterruptedException {WebElement searchText = driver.findElement (By.name ("q"));// zoekwaarde in google zoekvaksearchText.sendKeys (searchKey);System.out.println ("Welkom ->" + auteur + "Uw zoeksleutel is ->" + zoeksleutel);Thread.sleep (3000);String testValue = searchText.getAttribute ("waarde");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Controleer of de waarde in het zoekvak van Google correct isAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));* @return Object [] [] waarbij de eerste kolom 'auteur' bevat* en tweede kolom bevat 'searchKey'@DataProvider (name = "SearchProvider")openbaar object [] [] getDataFromDataprovider () {retourneer nieuw object [] []{"Guru99", "India"},{"Krishna", "UK"},{"Bhupesh", "VS"}
Roep DataProvider aan vanuit een andere klasse
DataProvider bevindt zich standaard in dezelfde klasse als de testmethode of in de basisklasse. Om het in een andere klasse te plaatsen, moeten we de gegevensprovider-methode als statisch maken en in de testmethode moeten we een attribuut dataProviderClass toevoegen in @Test- annotatie.
Code Voorbeeld
TestClass ParameterDataproviderWithClassLevel.java
pakketparameters;importeer java.util.concurrent.TimeUnit;import org.openqa.selenium.By;importeer org.openqa.selenium.WebDriver;importeer org.openqa.selenium.WebElement;importeer org.openqa.selenium.firefox.FirefoxDriver;importeer org.testng.Assert;importeer org.testng.annotations.BeforeTest;importeer org.testng.annotations.Test;openbare klasse ParameterDataproviderWithClassLevel {WebDriver-stuurprogramma;String driverPath = "C: \\ geckodriver.exe";@BeforeTestopenbare ongeldige instelling () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = nieuwe 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) gooit InterruptedException {WebElement searchText = driver.findElement (By.name ("q"));// Zoek tekst in het tekstvak van GooglesearchText.sendKeys (searchKey);System.out.println ("Welkom ->" + auteur + "Uw zoeksleutel is ->" + zoeksleutel);Thread.sleep (3000);// haal tekst uit het zoekvakString testValue = searchText.getAttribute ("waarde");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// controleer of het zoekvak de juiste waarde heeftAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));
DataproviderClass.java
pakketparameters;importeer org.testng.annotations.DataProvider;openbare klasse DataproviderClass {@DataProvider (name = "SearchProvider")openbaar statisch object [] [] getDataFromDataprovider () {retourneer nieuw object [] [] {{"Guru99", "India"},{"Krishna", "UK"},{"Bhupesh", "VS"}
Typen parameters in Dataprovider
Er zijn twee soorten parameters die worden ondersteund door de DataProvider-methode.
Methode - Als DEZELFDE DataProvider zich anders zou moeten gedragen met een andere testmethode, gebruik dan de Method parameter.
In het volgende voorbeeld
- We controleren of de naam van de methode testMethodA is.
- Zo ja, retourneer één set waarden
- Anders retourneert u een andere set waarden
pakketparameters;importeer java.lang.reflect.Method;importeer java.util.concurrent.TimeUnit;import org.openqa.selenium.By;importeer org.openqa.selenium.WebDriver;importeer org.openqa.selenium.WebElement;importeer org.openqa.selenium.firefox.FirefoxDriver;importeer org.testng.Assert;importeer org.testng.annotations.BeforeTest;importeer org.testng.annotations.DataProvider;importeer org.testng.annotations.Test;openbare klasse ParameterByMethodInDataprovider {WebDriver-stuurprogramma;String driverPath = "C: \\ geckodriver.exe";@BeforeTestopenbare ongeldige instelling () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = nieuwe FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");@Test (dataProvider = "SearchProvider")public void testMethodA (String author, String searchKey) gooit InterruptedException {WebElement searchText = driver.findElement (By.name ("q"));// Zoek tekst in zoekvaksearchText.sendKeys (searchKey);// Auteur en zoekreeks afdrukkenSystem.out.println ("Welkom ->" + auteur + "Uw zoeksleutel is ->" + zoeksleutel);Thread.sleep (3000);String testValue = searchText.getAttribute ("waarde");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Controleer of het Google-tekstvak de juiste waarde toontAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));@Test (dataProvider = "SearchProvider")public void testMethodB (String searchKey) gooit InterruptedException {WebElement searchText = driver.findElement (By.name ("q"));// Zoek tekst in zoekvaksearchText.sendKeys (searchKey);// Alleen zoekreeks afdrukkenSystem.out.println ("Welkom -> Onbekende gebruiker Uw zoeksleutel is ->" + zoeksleutel);Thread.sleep (3000);String testValue = searchText.getAttribute ("waarde");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Controleer of het Google-tekstvak de juiste waarde toontAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));* Hier retourneert DataProvider waarde op basis van de naam van de testmethode* @param m* @return@DataProvider (name = "SearchProvider")openbaar object [] [] getDataFromDataprovider (methode m) {if (m.getName (). equalsIgnoreCase ("testMethodA")) {retourneer nieuw object [] [] {{"Guru99", "India"},{"Krishna", "UK"},{"Bhupesh", "VS"}anders{retourneer nieuw object [] [] {{"Canada"},{"Rusland"},{"Japan"}
Hier is de output
ITestContext - Het kan worden gebruikt om verschillende parameters voor testgevallen te maken op basis van groepen.
In het echte leven kunt u ITestContext gebruiken om parameterwaarden te variëren op basis van testmethoden, hosts, configuraties van de test.
In het volgende codevoorbeeld
- We hebben 2 groepen A & B
- Elke testmethode wordt aan een groep toegewezen
- Als de waarde van de groep A is, wordt een bepaalde gegevensset geretourneerd
- Als de waarde van de groep B is, wordt een andere gegevensset geretourneerd
pakketparameters;importeer java.util.concurrent.TimeUnit;import org.openqa.selenium.By;importeer org.openqa.selenium.WebDriver;importeer org.openqa.selenium.WebElement;importeer org.openqa.selenium.firefox.FirefoxDriver;importeer org.testng.Assert;importeer org.testng.ITestContext;importeer org.testng.annotations.BeforeTest;importeer org.testng.annotations.DataProvider;importeer org.testng.annotations.Test;openbare klasse ParameterByITestContextInDataprovider {WebDriver-stuurprogramma;String driverPath = "C: \\ geckodriver.exe";@BeforeTest (groups = {"A", "B"})openbare ongeldige instelling () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = nieuwe 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) gooit InterruptedException {// zoek google textboxWebElement searchText = driver.findElement (By.name ("q"));// zoek er een waarde opsearchText.sendKeys (searchKey);System.out.println ("Welkom ->" + auteur + "Uw zoeksleutel is ->" + zoeksleutel);Thread.sleep (3000);String testValue = searchText.getAttribute ("waarde");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// verifieer de juiste waarde in het zoekvakAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));@Test (dataProvider = "SearchProvider", groups = "B")public void testMethodB (String searchKey) gooit InterruptedException {// vind het zoekvak van GoogleWebElement searchText = driver.findElement (By.name ("q"));// zoek er een waarde opsearchText.sendKeys (searchKey);System.out.println ("Welkom -> Onbekende gebruiker Uw zoeksleutel is ->" + zoeksleutel);Thread.sleep (3000);String testValue = searchText.getAttribute ("waarde");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// verifieer de juiste waarde in het zoekvakAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));* Hier zal de DAtaProvider Object-array leveren op basis van ITestContext* @param c* @return@DataProvider (name = "SearchProvider")openbaar object [] [] getDataFromDataprovider (ITestContext c) {Object [] [] groupArray = null;for (String group: c.getIncludedGroups ()) {if (group.equalsIgnoreCase ("A")) {groupArray = nieuw object [] [] {{"Guru99", "India"},{"Krishna", "UK"},{"Bhupesh", "VS"}breken;anders if (group.equalsIgnoreCase ("B"))groupArray = nieuw object [] [] {{"Canada"},{"Rusland"},{"Japan"}breken;return groupArray;
Opmerking: als u uw testng-klasse rechtstreeks uitvoert, zal deze eerst de dataprovider aanroepen die geen groepsinformatie kan ophalen omdat groepen niet beschikbaar zijn. Maar als je deze klasse aanroept via testng.xml, zal er groepsinformatie beschikbaar zijn met ITestContext. Gebruik de volgende XML om de test aan te roepen
Samenvatting :
- Parametrering is vereist om gegevensgestuurd testen te maken .
- TestNG ondersteunt twee soorten parametrisering, met behulp van @ Parameter + TestNG.xml en met behulp van @DataProvider
- In @ Parameter + TestNG.xml kunnen parameters op suite- en testniveau worden geplaatst. Als
Dezelfde parameternaam wordt op beide plaatsen gedeclareerd; de parameter testniveau krijgt de voorkeur boven de parameter op het niveau van het pak.
- met @ Parameter + TestNG.xml kan slechts één waarde tegelijk worden ingesteld, maar @DataProvider retourneert een 2D-array van Object .
- Als DataProvider aanwezig is in de andere klasse dan de klasse waarin de testmethode zich bevindt, moet DataProvider een statische methode zijn .
- Er worden twee parameters ondersteund door DataProvider zijn Method en ITestContext.