Veri sağlayıcı & TestNG XML: Parametreleştirme Selenium(Misal)

Bir yazılım yaratırken her zaman onun farklı bir veri seti ile farklı çalışmasını isteriz. O gelince Test yapmak Aynı yazılım parçasını tek bir veri seti ile test etmek haksızlık yapamayız. Burada yine sistemimizin desteklemesi beklenen tüm kombinasyon setlerini aldığını doğrulamamız gerekiyor. Bunun için test kodlarımızı parametreleştirmemiz gerekiyor. İşte resimde Parametreleştirme geliyor.

Parametreleştirme Selenium

Parametreleştirme Selenium Çalışma zamanında uygulamaya birden fazla veri aktarmak için test komut dosyalarını parametreleştirmeye yönelik bir işlemdir. Farklı değerleri kullanarak test senaryolarını otomatik olarak birden çok kez çalıştıran bir yürütme stratejisidir. Test komut dosyalarının parametrelendirilmesiyle elde edilen konsepte denir. Veriye Dayalı Test.

Parametreleştirme Türü TestNG-

Parametreleştirmeyi daha net hale getirmek için, en popüler çerçevelerden birinde parametreleştirme seçeneklerini inceleyeceğiz. Selenium Web sürücüsü – TestNG.

Var iki yol bununla parametreleştirmeyi başarabiliriz TestNG

  1. Yardımıyla parametreler not ve TestNG XML dosyası.

    Parametreleştirme Türü TestNG

  2. Yardımıyla Veri Sağlayıcı Ek açıklama.

    Parametreleştirme Türü TestNG

Parametreleştirme Türü TestNG

Testng.xml'deki parametreler paket veya test düzeyinde olabilir

DataProvider'dan gelen parametre, parametre olarak Method ve ITestContext'i alabilir.

Bunları ayrıntılı olarak inceleyelim –

Parametre Açıklamaları TestNG

Parametre Açıklamaları TestNG .xml dosyasını kullanarak değerleri argüman olarak test yöntemlerine aktarmak için kullanılan bir yöntemdir. Kullanıcıların çalışma süresi boyunca değerleri test yöntemlerine aktarmaları gerekebilir. @Parameters açıklama yöntemi, @Test, @Before, @After veya @Factory açıklamasına sahip herhangi bir yöntemde kullanılabilir.

Testng.xml ile parametre açıklaması

Karmaşıklıkla uğraşmak istediğinizde ve giriş kombinasyonlarının sayısı az olduğunda, açıklamaları kullanarak parametrelendirmeyi seçin.

Bunun nasıl çalıştığını görelim

Test Senaryosu

Adım 1) Tarayıcıyı başlatın ve Google.com'a gidin

Adım 2) Bir arama anahtar kelimesi girin

Testng.Xml ile Parametre Açıklaması

Adım 3) Girilen değerin test verilerimizin sağladığı değerle aynı olduğunu doğrulayın

Adım 4) Tüm değerler girilene kadar 2 ve 3'ü tekrarlayın

Test Yazarı AramaAnahtarı
Guru99 Hindistan
Krishna ABD
Bhupesh Çin

Parametreler OLMADAN bunun nasıl yapılacağına dair bir örnek

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

Bir Çalışma, yukarıdaki örnek. Bunu 3 giriş kombinasyonu için yaptığımızda kodun ne kadar karmaşık hale geleceğini hayal edin.

Şimdi bunu kullanarak parametreleştirelim. TestNG

Bunu yapmak için yapmanız gerekenler

  • Parametreleri saklayacak bir XML dosyası oluşturun
  • Testte @Parameters ek açıklamasını ekleyin

Testng.Xml ile Parametre Açıklaması

İşte kodun tamamı

Test Seviyesi 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>

Parametre İleTestNGXML.java Dosyası

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

}
}

Komut dosyasını çalıştırma, XML dosyasını seçme ve Test NG Suite olarak çalıştırma talimatları

.xml dosyasına sağ tıklayın -> Farklı çalıştır -> Test Süit (Not : Süit)

Parametre İleTestNGXML.java Dosyası

Artık parametreler 2 seviyede tanımlanabilir

  1. Paket düzeyi – Paketin içindeki parametreler etiketi TestNG XML dosyası paket düzeyinde bir parametre olacaktır.
  2. Test Seviyesi — İçindeki parametreler XML dosyasını test etmenin etiketi bir Test düzeyi parametresi olacaktır.

İşte paket düzeyindeki parametrelerle aynı test

Parametre İleTestNGXML.java Dosyası

NOT: Parametre adının paket düzeyinde ve test düzeyinde aynı olması durumunda test düzeyi parametresi, paket düzeyine göre tercih edilecektir. Dolayısıyla bu durumda, o test seviyesinin içindeki tüm sınıflar geçersiz kılınan parametreyi paylaşacak ve test seviyesinin dışındaki diğer sınıflar paket seviyesi parametresini paylaşacaktır.

Parametre İleTestNGXML.java Dosyası

Sorun giderme

Sayı # 1 Testng.xml dosyasındaki parametre değeri, karşılık gelen test yönteminin parametresine aktarılamaz, bu durumda bir hata oluşur.

Aşağıdaki örneği ele alalım

Sorun giderme

Burada 'author' özelliği bir string olan 'Guru99'a eşittir ve karşılık gelen test yönteminde bir tamsayı değeri bekleniyor, dolayısıyla burada bir istisna elde edeceğiz.

Sayı # 2 @Parameters'ınızın test.xml'de karşılık gelen bir değeri yok.

Bu durumu ekleyerek çözebilirsiniz. @isteğe bağlı not test yöntemindeki ilgili parametrede.

Sorun giderme

Sorun #3: Testng.xml kullanarak aynı parametrenin birden fazla değerini test etmek istiyorsunuz

Basit cevap şu ki bu yapılamaz! Birden fazla farklı parametreniz olabilir ancak her parametrenin yalnızca tek bir değeri olabilir. Bu, değerlerin komut dosyasına sabit olarak kodlanmasını önlemeye yardımcı olur. Bu, kodun yeniden kullanılabilir olmasını sağlar. Bunu betiğinizin yapılandırma dosyaları olarak düşünün. Bir parametre için birden fazla değer kullanmak istiyorsanız DataProviders'ı kullanın.

Veri Sağlayıcı TestNG

Veri Sağlayıcı TestNG bir kullanıcının karmaşık parametreler geçirmesi gerektiğinde kullanılan bir yöntemdir. Karmaşık Parametrelerin oluşturulması gerekir Java karmaşık nesneler, özellik dosyalarından veya bir veritabanından nesneler gibi nesneler veri sağlayıcı yöntemi tarafından geçirilebilir. Yöntem @DataProvider tarafından açıklanır ve bir nesne dizisi döndürür.

Dataprovider'ı kullanan parametreler

@Parameters açıklaması kolaydır ancak birden fazla veri kümesiyle test yapmak için Veri Sağlayıcıyı kullanmamız gerekir.

Test çerçevemizi kullanarak binlerce web formunu doldurmak için, bize tek bir yürütme akışında çok büyük bir veri kümesi sağlayabilecek farklı bir metodolojiye ihtiyacımız var.

Bu veriye dayalı konsept şu şekilde elde edilir: @DataProvider ek açıklama TestNG.

Dataprovider'ı Kullanan Parametreler

Sadece bir tane var 'isim' özelliği. name niteliğini belirtmezseniz DataProvider'ın adı karşılık gelen yöntem adıyla aynı olacaktır.

Veri sağlayıcı geri dönüyor iki boyutlu bir JAVA nesnesi test yöntemine ve test yöntemine, M*N tipi bir nesne dizisinde M kez çağrılacaktır. Örneğin, DataProvider 2*3 nesneden oluşan bir dizi döndürürse, ilgili test durumu her seferinde 2 parametreyle 3 kez çağrılacaktır.

Dataprovider'ı Kullanan Parametreler

Tam Örnek

Dataprovider'ı Kullanan Parametreler

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

    }

}

Farklı sınıftan DataProvider'ı çağırın

Varsayılan olarak DataProvider, test yönteminin veya temel sınıfının bulunduğu sınıfta bulunur. Bunu başka bir sınıfa koymak için veri sağlayıcı yöntemini statik yapmamız gerekir ve test yönteminde bir nitelik eklememiz gerekir. dataProviderClass in @Ölçek Ek açıklama.

DataProvider'ı Farklı Sınıftan Çağır

Kod Örneği

DataProvider'ı Farklı Sınıftan Çağır

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

Dataprovider'daki Parametre Türleri

DataProvider yönteminin desteklediği iki tür parametre vardır.

Yöntem- Eğer AYNI DataProvider farklı test yöntemleriyle farklı davranmalıdır; Method parametresini kullanın.

Dataprovider'daki Parametre Türleri

Aşağıdaki örnekte,

  • Yöntem adının testMethodA olup olmadığını kontrol ediyoruz.
  • Evetse, bir değer kümesi döndürün
  • Aksi takdirde başka bir değer kümesi döndürün
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" }
            };}       
    }
}

İşte çıktı

Dataprovider'daki Parametre Türleri

ITestContext– Gruplara göre test senaryoları için farklı parametreler oluşturmak için kullanılabilir.

Gerçek hayatta, testin Test Yöntemlerine, ana bilgisayarlarına ve yapılandırmalarına göre parametre değerlerini değiştirmek için ITestContext'i kullanabilirsiniz.

Dataprovider'daki Parametre Türleri

Aşağıdaki kod örneğinde

  • A ve B olmak üzere 2 grubumuz var
  • Her test yöntemi bir gruba atanır
  • Grubun değeri A ise belirli bir veri seti döndürülür
  • Grubun değeri B ise başka bir veri seti döndürülür
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;		
	}
}

Not: Eğer testng sınıfınızı doğrudan çalıştırırsanız, önce dataprovider'ı çağırır, bu da gruplar mevcut olmadığı için grup bilgilerini alamaz. Fakat bunun yerine bu sınıfı testng.xml üzerinden çağırırsanız, ITestContext ile grup bilgileri mevcut olur. Test'i çağırmak için aşağıdaki XML'i kullanın

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

ÖZET

  • Parametrelendirme oluşturmayı gerektirir Veriye Dayalı Test.
  • TestNG kullanarak iki tür parametreleştirmeyi destekleyin @Parametre+TestNG. Xml ve kullanmak@DataProvider
  • In @Parametre+TestNG. Xml parametreler paket seviyesine ve test seviyesine yerleştirilebilir. Eğer

    Her iki yerde de aynı parametre adı bildirilir; test seviyesi parametresi, elbise seviyesi parametresine göre tercih edilecektir.

  • @Parameter+ kullanarakTestNG.xml aynı anda yalnızca bir değer ayarlanabilir, ancak @DataProvider geri döner 2 boyutlu bir Nesne dizisi.
  • DataProvider farklı sınıfta mevcutsa test yönteminin bulunduğu sınıf,Veri Sağlayıcı olmalı statik yöntem.
  • tarafından desteklenen iki parametre vardır. Veri Sağlayıcı vardır Yöntem ve ITestContext.