Veri sağlayıcı & TestNG XML: Parametreleştirme Selenium(Misal)
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
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
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
İş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)
Artık parametreler 2 seviyede tanımlanabilir
- Paket düzeyi – Paketin içindeki parametreler etiketi TestNG XML dosyası paket düzeyinde bir parametre olacaktır.
- Test Seviyesi — İçindeki parametreler XML dosyasını test etmenin etiketi bir Test düzeyi parametresi olacaktır.
İşte paket düzeyindeki parametrelerle aynı test
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.
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
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 #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.
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.
Tam Örnek
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.
Kod Örneği
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.
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ı
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.
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.