Andmepakkuja & TestNG XML: parameetrite määramine sisse Selenium(Näide)

Tarkvara loomisel soovime alati, et see töötaks erineva andmekogumiga erinevalt. Kui tegemist on Testimine sama tarkvara, ei saa me olla ülekohtune, kui testime seda ainult ühe andmekogumiga. Siin peame jällegi kontrollima, kas meie süsteem kasutab kõiki eeldatavasti toetavaid kombinatsioone. Selleks peame oma testskriptid parameetriseerima. Siin on pildil parameetrite määramine.

Parameetristamine sisse Selenium

Parameetristamine sisse Selenium on testskriptide parameetrite muutmise protsess, et edastada rakendusele käitusajal mitut teavet. See on täitmisstrateegia, mis käivitab testjuhtumeid automaatselt mitu korda, kasutades erinevaid väärtusi. Testskriptide parameetritega saavutatud kontseptsiooni nimetatakse Andmepõhine testimine.

Parameetri tüüp sisse TestNG-

Parameetrite selgemaks muutmiseks vaatame läbi parameetrite määramise valikud ühes kõige populaarsemas raamistikus Selenium Veebidraiver – TestNG.

Seal on kahel viisil mille abil saame saavutada parameetrite muutmise TestNG

  1. Abil parameetrid märkus ja TestNG XML faili.

    Parameetri tüüp sisse TestNG

  2. Abil DataProvider märkus.

    Parameetri tüüp sisse TestNG

Parameetri tüüp sisse TestNG

Testng.xml parameetrid võivad olla komplekti- või testitasemel

DataProvideri parameeter võib võtta parameetrina Method ja ITestContext.

Uurime neid üksikasjalikult -

Parameetrid Annotatsioon sisse TestNG

Parameetrid Annotatsioon sisse TestNG on meetod, mida kasutatakse väärtuste edastamiseks testmeetoditele argumentidena, kasutades .xml-faili. Kasutajatelt võidakse nõuda väärtuste edastamist katsemeetoditele käitamise ajal. Annotatsioonimeetodit @Parameters saab kasutada mis tahes meetodi puhul, millel on @Test, @Enne, @Pärast või @Tehasannotatsioon.

Parameetrite annotatsioon rakendusega Testng.xml

Valige parameetrid annotatsioonide abil, kui soovite tegeleda keerukusega ja sisendkombinatsioonide arv on väiksem.

Vaatame, kuidas see toimib

Testi stsenaarium

1. samm) Käivitage brauser ja minge saidile Google.com

2. samm) Sisestage otsingu märksõna

Parameetrite annotatsioon koos Testng.Xml-ga

3. samm) Veenduge, et sisestatud väärtus on sama, mis meie testiandmetes

Samm 4) Korrake punkte 2 ja 3, kuni kõik väärtused on sisestatud

Testi autor Otsinguklahv
Guru99 India
Krishna USA
Bhupesh Hiina

Siin on näide, kuidas seda teha ILMA parameetriteta

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));
}
}

Uuring, ülaltoodud näide. Kujutage vaid ette, kui keeruliseks muutub kood, kui teeme seda kolme sisendikombinatsiooni jaoks

Nüüd parameetriseerime seda kasutades TestNG

Selleks peate seda tegema

  • Looge XML-fail, mis salvestab parameetrid
  • Testis lisage annotatsioon @Parameters

Parameetrite annotatsioon koos Testng.Xml-ga

Siin on täielik kood

Testi tase 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>

Parameeter KoosTestNGXML.java fail

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));

}
}

Juhised skripti käitamiseks, valige XML-fail ja Run as Test NG Suite

Paremklõpsake .xml-failil -> Run as -> Testng Sviit (Märkus: Sviit)

Parameeter KoosTestNGXML.java fail

Nüüd saab parameetreid määratleda kahel tasemel

  1. Komplekti tase – parameetrid sees silt TestNG XML-fail on komplektitaseme parameeter.
  2. Test Level – parameetrid sees testitava XML-faili silt on testitaseme parameeter.

Siin on sama test komplektitaseme parameetritega

Parameeter KoosTestNGXML.java fail

MÄRKUS: Kui parameetri nimi on komplektitasemel ja testitasemel sama, eelistatakse testtaseme parameeter komplekti tasemel. Sel juhul jagavad kõik sellel testitasemel olevad klassid tühistatud parameetrit ja teised klassid, mis on väljaspool testitaset, jagavad komplekti taseme parameetrit.

Parameeter KoosTestNGXML.java fail

Probleemid

Väljaanne # 1 Parameetri väärtust failis testng.xml ei saa sisestada vastava testmeetodi parameetrile, see annab vea.

Mõelge järgmisele näitele

Tõrkeotsing

Siin on atribuut 'autor' võrdne 'Guru99'ga, mis on string ja vastavas testimismeetodis eeldab ta täisarvu, seega saame siin erandi.

Väljaanne # 2 Teie @Parameters pole failis testing.xml vastavat väärtust.

Saate selle olukorra lahendada lisades @valikuline märkus katsemeetodi vastavas parameetris.

Tõrkeotsing

3. probleem: Soovite testida sama parameetri mitut väärtust rakendusega Testng.xml

Lihtne vastus on see, et seda ei saa teha! Teil võib olla mitu erinevat parameetrit, kuid igal parameetril võib olla ainult üks väärtus. See aitab vältida väärtuste kõvakodeerimist skripti. See muudab koodi korduvkasutatavaks. Mõelge sellele kui oma skripti konfiguratsioonifailidele. Kui soovite parameetri jaoks kasutada mitut väärtust, kasutage DataProviderit

Andmepakkuja sisse TestNG

Andmepakkuja sisse TestNG on meetod, mida kasutatakse siis, kui kasutajal on vaja edastada keerulisi parameetreid. Keerulised parameetrid tuleb luua Java Näiteks keerukaid objekte, atribuudifailidest või andmebaasist pärit objekte saab edastada andmepakkuja meetodil. Meetodit märgib @DataProvider ja see tagastab objektide massiivi.

Parameetrid Dataprovideri abil

@Parameters annotatsioon on lihtne, kuid mitme andmekomplektiga testimiseks peame kasutama Data Providerit.

Tuhandete veebivormide täitmiseks meie testimisraamistiku abil vajame teistsugust metoodikat, mis võib anda meile ühe täitmisvooga väga suure andmestiku.

See andmepõhine kontseptsioon saavutatakse @DataProvider annotatsioon sisse TestNG.

Andmepakkujat kasutavad parameetrid

Sellel on ainult üks atribuut 'nimi'. Kui te nimeatribuuti ei määra, on DataProvideri nimi sama, mis vastava meetodi nimi.

Andmepakkuja tagastab kahemõõtmeline JAVA objekt testimismeetodi ja katsemeetodi vahel, kutsub M korda M*N tüüpi objektimassiivis. Näiteks kui DataProvider tagastab 2*3 objektide massiivi, kutsutakse vastav testjuhtum 2 korda 3 parameetriga iga kord.

Andmepakkujat kasutavad parameetrid

Täielik näide

Andmepakkujat kasutavad parameetrid

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" }
        };

    }

}

Kutsuge DataProvider erinevast klassist

Vaikimisi asub DataProvider samas klassis, kus on testimismeetod või selle põhiklass. Selle paigutamiseks mõnda teise klassi peame muutma andmepakkuja meetodi staatiliseks ja testmeetodis peame lisama atribuudi dataProviderClass in @Test märkus.

Kutsuge DataProvider erinevast klassist

Koodinäide

Kutsuge DataProvider erinevast klassist

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.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" }
            };  
}}

Andmepakkuja parameetrite tüübid

DataProvideri meetod toetab kahte tüüpi parameetreid.

Meetod- Kui SAMA DataProvider peaks erinevate katsemeetoditega käituma erinevalt, kasutage parameetrit Method.

Andmepakkuja parameetrite tüübid

Järgmises näites

  • Kontrollime, kas meetodi nimi on testMethodA.
  • Kui jah, tagastage üks väärtuse komplekt
  • Vastasel juhul tagastab teise väärtuse komplekti
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" }
            };}       
    }
}

Siin on väljund

Andmepakkuja parameetrite tüübid

ITestContext- Seda saab kasutada erinevate parameetrite loomiseks testjuhtumite jaoks rühmade põhjal.

Reaalses elus saate kasutada ITestContexti parameetrite väärtuste muutmiseks vastavalt testimismeetoditele, hostidele ja testi konfiguratsioonidele.

Andmepakkuja parameetrite tüübid

Järgmises koodinäites

  • Meil on 2 rühma A ja B
  • Iga katsemeetod määratakse rühmale
  • Kui rühma väärtus on A, tagastatakse konkreetne andmekogum
  • Kui rühma väärtus on B, tagastatakse teine ​​andmekogum
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;		
	}
}

Märkus. Kui käivitate testimisklassi otse, helistab see esmalt andmepakkujale, kes ei saa rühmade teavet hankida, kuna rühmad pole saadaval. Kui aga helistate sellele klassile testng.xml kaudu, on sellel ITestContextiga saadaval rühmade teave. Kasutage testi kutsumiseks järgmist XML-i

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

kokkuvõte

  • Parameetristamine on vaja luua Andmepõhine testimine.
  • TestNG toetab kahte tüüpi parameetrite määramist, kasutades @Parameeter+TestNG. Xml ja kasutades@DataProvider
  • In @Parameeter+TestNG. Xml parameetreid saab paigutada komplekti tasemele ja testi tasemele. Kui

    Mõlemas kohas on deklareeritud sama parameetri nimi; testitaseme parameeter eelistab ülikonnataseme parameetrit.

  • kasutades @Parameter+TestNG.xml saab korraga määrata ainult ühe väärtuse, kuid @DataProvider tagastab 2d objekti massiiv.
  • Kui DataProvider on teises klassis, siis klass, kus testmeetod asub,DataProvider peaks olema staatiline meetod.
  • Toetatud on kaks parameetrit DataProvider See on Meetod ja ITestContext.