Veri Sağlayıcı & TestNG XML: Selenyumda Parametrelendirme (Örnek)

İçindekiler:

Anonim

Yazılım oluştururken, her zaman farklı bir veri kümesiyle farklı şekilde çalışmasını isteriz. Aynı yazılım parçasını test etmek söz konusu olduğunda, onu tek bir veri kümesiyle test etmek haksızlık olamaz. Burada yine, sistemimizin desteklemesi beklenen tüm kombinasyonları aldığını doğrulamamız gerekiyor. Bunun için test skiplerimizi parametreleştirmemiz gerekiyor. İşte resimde Parametrelendirme geliyor.

Selenyumda parametrelendirme

Selenium'da parametrelendirme, çalışma zamanında uygulamaya birden çok veri iletmek için test komut dosyalarını parametrelendirme işlemidir. Farklı değerler kullanarak test senaryolarını birden çok kez otomatik olarak çalıştıran bir yürütme stratejisidir. Test komut dosyalarının parametrelendirilmesiyle elde edilen kavrama Veriye Dayalı Test adı verilir .

Bu eğitimde öğreneceksiniz-

  • TestNG'de Parametrelendirme Türü-
  • Testng.xml ile parametreler ek açıklaması
  • Sorun giderme
  • Dataprovider kullanan parametreler
  • DataProvider'ı farklı bir sınıftan çağırın
  • Dataprovider'daki Parametre Türleri

TestNG'de Parametrelendirme Türü-

Parametreleştirmeyi daha net hale getirmek için, Selenium Webdriver - TestNG için en popüler çerçevede parametrelendirme seçeneklerini gözden geçireceğiz .

TestNG'de parametreleştirmeyi başarmanın iki yolu vardır

  1. Parametreler ek açıklaması ve TestNG XML dosyası yardımıyla .

  2. DataProvider ek açıklaması yardımıyla .

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

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

Onları ayrıntılı olarak inceleyelim -

TestNG'de Parametre Açıklama

TestNG'de Parametreler Ek Açıklama, .xml dosyasını kullanarak değerleri test yöntemlerine bağımsız değişken olarak geçirmek için kullanılan bir yöntemdir. Kullanıcıların çalışma süresi boyunca değerleri test yöntemlerine geçirmeleri gerekebilir. @Parameters açıklama yöntemi, @Test, @Before, @After veya @Factory ek açıklamasına sahip herhangi bir yöntemde kullanılabilir.

Testng.xml ile parametreler ek açıklaması

Karmaşıklık ve girdi kombinasyonlarının sayısı daha az olduğunda, ek açıklamaları kullanarak parametreleştirmeyi 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 verilerimiz tarafından sağlanan değerle aynı olduğunu doğrulayın

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

Test Yazarı Arama Anahtarı
Guru99 Hindistan
Krishna Amerika Birleşik Devletleri
Bhupesh Çin

İşte parametreler OLMADAN nasıl yapılacağına dair bir örnek

paket parametreleri;import org.testng.annotations.Test;org.testng.AssertJUnit'i içe aktar;içe aktar 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 sürücüsü;@Ölçekpublic void testNoParameter () InterruptedException {atarDize yazarı = "guru99";String searchKey = "india";System.setProperty ("webdriver.gecko.driver", driverPath);sürücü = yeni FirefoxDriver ();driver.manage (). timeout (). örtük olarak Bekleme (10, TimeUnit.SECONDS);driver.get ("https://google.com");WebElement searchText = driver.findElement (By.name ("q"));// Google metin kutusunda metin aramasearchText.sendKeys (searchKey);System.out.println ("Hoş Geldiniz ->" + yazar + "Arama anahtarınız ->" + searchKey);System.out.println ("İş parçacığı şimdi uyuyacak");Thread.sleep (3000);System.out.println ("Google Arama Kutusundaki Değer =" + searchText.getAttribute ("değer") + "::: input =" + searchKey tarafından verilen değer);// google arama kutusundaki değeri doğrulamakAssertJUnit.assertTrue (searchText.getAttribute ("değer"). 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 bir düşünün.

Şimdi bunu TestNG kullanarak parametreleştirelim

Bunu yapmak için yapmanız gerekecek

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

İşte tam kod

Test Seviyesi TestNG.xml




ParameterWithTestNGXML.java Dosyası

paket parametreleri;org.testng.AssertJUnit'i içe aktar;içe aktar 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 sürücüsü;@Ölçek@Parameters ({"yazar", "aramaKey"})public void testParameterWithXML (@Optional ("Abc") Dize yazarı, String searchKey) InterruptedException {System.setProperty ("webdriver.gecko.driver", driverPath);sürücü = yeni FirefoxDriver ();driver.manage (). timeout (). örtük olarak Bekleme (10, TimeUnit.SECONDS);driver.get ("https://google.com");WebElement searchText = driver.findElement (By.name ("q"));// Google metin kutusunda metin aramasearchText.sendKeys (searchKey);System.out.println ("Hoş Geldiniz ->" + yazar + "Arama anahtarınız ->" + searchKey);System.out.println ("İş parçacığı şimdi uyuyacak");Thread.sleep (3000);System.out.println ("Google Arama Kutusundaki Değer =" + searchText.getAttribute ("değer") + "::: input =" + searchKey tarafından verilen değer);// google arama kutusundaki değeri doğrulamakAssertJUnit.assertTrue (searchText.getAttribute ("değer"). EqualsIgnoreCase (searchKey));}}

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

.Xml dosyasına sağ tıklayın -> Farklı Çalıştır -> Testng Suite (Not: Suite)

Artık parametreler 2 seviyede tanımlanabilir

  1. Paket seviyesi - TestNG XML dosyasının etiketinin içindeki parametreler, paket seviyesinde bir parametre olacaktır.
  2. Test Düzeyi - Test XML dosyasının etiketinin içindeki parametreler bir Test düzeyi parametresi olacaktır.

İşte paket seviyesi parametreleriyle aynı test

NOT: Parametre adı, süit seviyesinde ve test seviyesinde aynı ise, o zaman test seviyesi parametresi, süit seviyesine göre tercih edilir. Dolayısıyla, bu durumda, bu test seviyesindeki tüm sınıflar geçersiz kılınan parametreyi paylaşacak ve test seviyesinin dışındaki diğer sınıflar süit seviyesi parametresini paylaşacaktır.

Sorun giderme

Sorun # 1 Testng.xml'deki parametre değeri, ilgili test yönteminin parametresine yazılamaz, bu bir hata verecektir.

Aşağıdaki örneği düşünün

Burada, 'yazar' özniteliği bir dize olan 'Guru99'a eşittir ve buna karşılık gelen test yönteminde bir tamsayı değeri beklediği için burada bir istisna elde edeceğiz.

Sorun 2 @ Parametrelerinizin test.xml dosyasında karşılık gelen bir değeri yok.

Bu durumu , test yönteminde karşılık gelen parametreye @ isteğe bağlı açıklama ekleyerek çözebilirsiniz .

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

Basit cevap, bu yapılamaz! Birden çok farklı parametreniz olabilir, ancak her parametrenin yalnızca tek bir değeri olabilir. Bu, değerlerin komut dosyasına kodlanmasını önlemeye yardımcı olur. Bu, kodu yeniden kullanılabilir hale getirir. Bunu komut dosyanız için yapılandırma dosyaları olarak düşünün. Bir parametre için birden çok değer kullanmak istiyorsanız DataProviders kullanın

TestNG'de Veri Sağlayıcı

TestNG'deki Veri Sağlayıcı, bir kullanıcının karmaşık parametreleri iletmesi gerektiğinde kullanılan bir yöntemdir. Karmaşık parametrelerin Java'dan oluşturulması gerekir, örneğin karmaşık nesneler, özellik dosyalarındaki nesneler veya bir veritabanından veri sağlayıcı yöntemi ile aktarılabilir. Yöntem, @DataProvider tarafından açıklanır ve bir nesne dizisi döndürür.

Dataprovider kullanan parametreler

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

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

Bu veri odaklı konsept, TestNG'de @DataProvider ek açıklamasıyla elde edilir .

Yalnızca bir "ad" niteliği vardır . Name özniteliğini belirtmezseniz, DataProvider'ın adı, karşılık gelen yöntem adıyla aynı olacaktır.

Veri sağlayıcı , test yöntemine iki boyutlu bir JAVA nesnesi döndürür ve test yöntemi, M * N türü nesne dizisinde M kez çağırır. Örneğin, DataProvider 2 * 3 nesneden oluşan bir dizi döndürürse, karşılık gelen test olayı, her seferinde 3 parametre ile 2 kez çağrılır.

Tam Örnek

paket parametreleri;içe aktar 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 sürücüsü;String driverPath = "C: \\ geckodriver.exe";@Evleneceksengenel void kurulumu () {// firefox sürücü nesnesi oluşturSystem.setProperty ("webdriver.gecko.driver", driverPath);sürücü = yeni FirefoxDriver ();driver.manage (). timeout (). örtük olarak Bekleme (10, TimeUnit.SECONDS);driver.get ("https://google.com");}/ ** Google arama kutusunu doğrulamak için test durumu* @param yazarı* @param searchKey* @throws InterruptedException* /@Test (dataProvider = "SearchProvider")public void testMethod (String yazarı, String searchKey) InterruptedException {{WebElement searchText = driver.findElement (By.name ("q"));// google arama kutusunda arama değerisearchText.sendKeys (searchKey);System.out.println ("Hoş Geldiniz ->" + yazar + "Arama anahtarınız ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("değer");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// google arama kutusundaki değerin doğru olup olmadığını kontrol edinAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** @return Nesnesi [] [] burada ilk sütun 'yazar'ı içerir* ve ikinci sütun "searchKey" içerir* /@DataProvider (name = "SearchProvider")public Object [] [] getDataFromDataprovider () {yeni Nesne döndür [] []{{"Guru99", "Hindistan"},{"Krishna", "UK"},{"Bhupesh", "ABD"}};}}

DataProvider'ı farklı bir sınıftan çağırın

Varsayılan olarak, DataProvider, test yönteminin veya temel sınıfının olduğu aynı sınıfta bulunur. Biz statik olarak ve biz bir nitelik eklemeniz gerekir deney yönteminde veri sağlayıcı yöntemi yapmak gerekir diğer bazı sınıfta söylemek gerekirse dataProviderClass içinde @Test açıklama.

Kod Örneği

TestClass ParameterDataproviderWithClassLevel.java

paket parametreleri;içe aktar 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 sürücüsü;String driverPath = "C: \\ geckodriver.exe";@Evleneceksengenel void kurulumu () {System.setProperty ("webdriver.gecko.driver", driverPath);sürücü = yeni FirefoxDriver ();driver.manage (). timeout (). örtük olarak Bekleme (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider", dataProviderClass = DataproviderClass.class)public void testMethod (String yazarı, String searchKey) InterruptedException {WebElement searchText = driver.findElement (By.name ("q"));// Google metin kutusunda metin arasearchText.sendKeys (searchKey);System.out.println ("Hoş Geldiniz ->" + yazar + "Arama anahtarınız ->" + searchKey);Thread.sleep (3000);// arama kutusundan metin alString testValue = searchText.getAttribute ("değer");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// arama kutusunun doğru değere sahip olup olmadığını kontrol edinAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}

DataproviderClass.java

paket parametreleri;import org.testng.annotations.DataProvider;public class DataproviderClass {@DataProvider (name = "SearchProvider")public static Object [] [] getDataFromDataprovider () {yeni Nesne döndür [] [] {{"Guru99", "Hindistan"},{"Krishna", "UK"},{"Bhupesh", "ABD"}};}}

Dataprovider'daki Parametre Türleri

DataProvider yöntemi tarafından desteklenen iki tür parametre vardır.

Yöntem - SAME DataProvider'ın farklı test yöntemiyle farklı davranması gerekiyorsa, Yöntem 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
  • Aksi takdirde başka bir değer kümesi döndür
paket parametreleri;import java.lang.reflect.Method;içe aktar 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 sürücüsü;String driverPath = "C: \\ geckodriver.exe";@Evleneceksengenel void kurulumu () {System.setProperty ("webdriver.gecko.driver", driverPath);sürücü = yeni FirefoxDriver ();driver.manage (). timeout (). örtük olarak Bekleme (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider")public void testMethodA (Dize yazarı, String searchKey) InterruptedException {WebElement searchText = driver.findElement (By.name ("q"));// Arama kutusunda metin arasearchText.sendKeys (searchKey);// Yazarı ve arama dizesini yazdırSystem.out.println ("Hoş Geldiniz ->" + yazar + "Arama anahtarınız ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("değer");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Google metin kutusunun doğru değeri gösterip göstermediğini kontrol edinAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}@Test (dataProvider = "SearchProvider")public void testMethodB (String searchKey) InterruptedException {{WebElement searchText = driver.findElement (By.name ("q"));// Arama kutusunda metin arasearchText.sendKeys (searchKey);// Yalnızca arama dizesini yazdırSystem.out.println ("Hoş Geldiniz -> Bilinmeyen kullanıcı Arama anahtarınız ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("değer");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Google metin kutusunun doğru değeri gösterip göstermediğini kontrol edinAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** Burada DataProvider test yöntemi adına göre değer döndürüyor* @param m* @dönüş** /@DataProvider (name = "SearchProvider")public Object [] [] getDataFromDataprovider (Yöntem m) {eğer (m.getName (). equalsIgnoreCase ("testMethodA")) {yeni Nesne döndür [] [] {{"Guru99", "Hindistan"},{"Krishna", "UK"},{"Bhupesh", "ABD"}};}Başka{yeni Nesne döndür [] [] {{"Kanada"},{"Rusya"},{"Japonya"}};}}}

İşte çıktı

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

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

Aşağıdaki kod örneğinde

  • 2 grubumuz var A & B
  • Her test yöntemi bir gruba atanır
  • Grubun değeri A ise, belirli bir veri kümesi döndürülür
  • Grubun değeri B ise, başka bir veri seti döndürülür
paket parametreleri;içe aktar 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;org.testng.ITestContext'i içe aktar;import org.testng.annotations.BeforeTest;import org.testng.annotations.DataProvider;import org.testng.annotations.Test;public class ParameterByITestContextInDataprovider {WebDriver sürücüsü;String driverPath = "C: \\ geckodriver.exe";@BeforeTest (gruplar = {"A", "B"})genel void kurulumu () {System.setProperty ("webdriver.gecko.driver", driverPath);sürücü = yeni FirefoxDriver ();driver.manage (). timeout (). örtük olarak Bekleme (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider", gruplar = "A")public void testMethodA (Dize yazarı, String searchKey) InterruptedException {{// google metin kutusunda araWebElement searchText = driver.findElement (By.name ("q"));// üzerinde bir değer arayınsearchText.sendKeys (searchKey);System.out.println ("Hoş Geldiniz ->" + yazar + "Arama anahtarınız ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("değer");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// arama kutusunda doğru değeri doğrulayınAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}@Test (dataProvider = "SearchProvider", gruplar = "B")public void testMethodB (String searchKey) InterruptedException {{// google arama kutusunu bulWebElement searchText = driver.findElement (By.name ("q"));// üzerinde bir değer arayınsearchText.sendKeys (searchKey);System.out.println ("Hoş Geldiniz -> Bilinmeyen kullanıcı Arama anahtarınız ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("değer");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// arama kutusunda doğru değeri doğrulayınAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** Burada DAtaProvider, ITestContext'e dayalı olarak Object dizisi sağlayacaktır.* @param c* @dönüş* /@DataProvider (name = "SearchProvider")public Object [] [] getDataFromDataprovider (ITestContext c) {Nesne [] [] groupArray = boş;for (Dize grubu: c.getIncludedGroups ()) {eğer (group.equalsIgnoreCase ("A")) {groupArray = yeni Nesne [] [] {{"Guru99", "Hindistan"},{"Krishna", "UK"},{"Bhupesh", "ABD"}};kırmak;}else if (group.equalsIgnoreCase ("B")){groupArray = yeni Nesne [] [] {{"Kanada"},{"Rusya"},{"Japonya"}};}kırmak;}return groupArray;}}

Not: Doğrudan test sınıfınızı çalıştırırsanız, önce veri sağlayıcısını çağırır, bu da gruplar kullanılamadığından grup bilgilerini alamaz. Ancak bunun yerine, bu sınıfı testng.xml aracılığıyla çağırırsanız, ITestContext ile kullanılabilen grup bilgilerine sahip olacaktır. Testi çağırmak için aşağıdaki XML'i kullanın

Özet :

  • Veriye Dayalı Test oluşturmak için parametrelendirme gereklidir .
  • TestNG destek parametre, iki çeşit kullanılarak parametre + TestNG.xml @ kullanılarak @DataProvider
  • In Parametre + TestNG.xml @ parametreleri paketi düzeyinde ve test seviyesinde yerleştirilebilir. Eğer

    Aynı parametre adı her iki yerde de bildirilir; test seviyesi parametresi, uygun seviye parametresine göre tercih edilir.

  • @ Parametre + TestNG.xml kullanarak bir seferde yalnızca bir değer ayarlanabilir, ancak @DataProvider bir 2d Object dizisi döndürür .
  • DataProvider farklı sınıfta mevcutsa, test yönteminin bulunduğu sınıf, DataProvider statik yöntem olmalıdır .
  • DataProvider tarafından desteklenen iki parametre vardır: Method ve ITestContext.