Penyedia data & TestNG XML: Parameterisasi dalam Selenium(Contoh)
Parameterisasi di Selenium
Parameterisasi di Selenium adalah proses untuk membuat parameter skrip pengujian untuk meneruskan banyak data ke aplikasi saat runtime. Ini adalah strategi eksekusi yang secara otomatis menjalankan kasus uji beberapa kali menggunakan nilai berbeda. Konsep yang dicapai dengan membuat parameter skrip pengujian disebut Pengujian Berdasarkan Data.
Jenis Parameterisasi di TestNG-
Untuk memperjelas parameterisasi, kita akan membahas opsi parameterisasi dalam salah satu kerangka kerja paling populer Selenium pengemudi web – TestNG.
Ada dua cara yang dengannya kita dapat mencapai parameterisasi TestNG
- Dengan bantuan dari Parameters anotasi dan TestNG XML file.
- Dengan bantuan dari Penyedia data anotasi.
Parameter dari Testng.xml dapat berupa suite atau level pengujian
Parameter dari DataProvider dapat menggunakan Metode dan ITestContext sebagai parameternya.
Mari kita pelajari secara detail –
Parameter Anotasi di TestNG
Parameter Anotasi di TestNG adalah metode yang digunakan untuk meneruskan nilai ke metode pengujian sebagai argumen menggunakan file .xml. Pengguna mungkin diminta untuk meneruskan nilai ke metode pengujian selama run time. Metode anotasi @Parameters dapat digunakan dalam metode apa pun yang memiliki anotasi @Test, @Before, @After, atau @Factory.
Anotasi parameter dengan Testng.xml
Pilih parameterisasi menggunakan anotasi ketika Anda ingin menangani kompleksitas & jumlah kombinasi input lebih sedikit.
Mari kita lihat cara kerjanya
Skenario Uji
Langkah 1) Luncurkan browser & buka Google.com
Langkah 2) Masukkan kata kunci pencarian
Langkah 3) Verifikasikan nilai yang dimasukkan sama dengan yang diberikan oleh data pengujian kami
Langkah 4) Ulangi 2 & 3 hingga semua nilai dimasukkan
Penulis Tes | Kunci Pencarian |
---|---|
Guru99 | India |
Krishna | Amerika Serikat |
Bhupesh | Tiongkok |
Berikut adalah contoh cara melakukannya TANPA parameter
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)); } }
Sebuah Studi, contoh di atas. Bayangkan betapa rumitnya kode tersebut jika kita melakukan ini untuk 3 kombinasi input
Sekarang, mari kita membuat parameter menggunakan ini TestNG
Untuk melakukannya, Anda perlu melakukannya
- Buat file XML yang akan menyimpan parameter
-
Dalam pengujian, tambahkan anotasi @Parameters
Berikut kode lengkapnya
Tingkat Tes 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>
ParameterDenganTestNGFile XML.java
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)); } }
Petunjuk untuk menjalankan skrip, pilih file XML dan Jalankan sebagai Test NG Suite
Klik kanan pada file .xml -> Jalankan sebagai -> Pengujian Suite (Catatan : Suite)
Sekarang, parameter dapat ditentukan pada 2 level
- Tingkat suite – Parameter di dalam tag dari TestNG File XML akan menjadi parameter tingkat suite.
- Level Tes — Parameter di dalam tag file XML pengujian akan menjadi parameter level Pengujian.
Berikut adalah pengujian yang sama dengan parameter level suite
CATATAN: Jika nama parameter sama pada level suite dan level pengujian, maka parameter level pengujian akan lebih diutamakan daripada level suite. Jadi, dalam hal ini, semua kelas di dalam level pengujian tersebut akan berbagi parameter yang diganti, dan kelas lain yang berada di luar level pengujian akan berbagi parameter level suite.
Penyelesaian masalah
Edisi #1 Nilai parameter di testng.xml tidak dapat diketik ke parameter metode pengujian yang sesuai sehingga akan menimbulkan kesalahan.
Perhatikan contoh berikut ini
Di sini, atribut 'penulis' sama dengan 'Guru99' yang merupakan string dan dalam metode pengujian yang sesuai mengharapkan nilai integer, jadi kita akan mendapatkan pengecualian di sini.
Edisi #2 @Parameters Anda tidak memiliki nilai yang sesuai di pengujian.xml.
Anda dapat mengatasi situasi ini dengan menambahkan @opsional anotasi dalam parameter yang sesuai dalam metode pengujian.
Masalah #3: Anda ingin menguji beberapa nilai dari parameter yang sama menggunakan Testng.xml
Jawaban sederhananya adalah ini tidak bisa dilakukan! Anda dapat memiliki beberapa parameter berbeda, namun setiap parameter hanya dapat memiliki satu nilai. Ini membantu mencegah nilai hardcoding ke dalam skrip. Hal ini membuat kode dapat digunakan kembali. Anggap saja sebagai file konfigurasi untuk skrip Anda. Jika Anda ingin menggunakan beberapa nilai untuk suatu parameter, gunakan DataProviders
Penyedia Data di TestNG
Penyedia Data di TestNG adalah metode yang digunakan ketika pengguna perlu melewati parameter yang kompleks. Parameter Kompleks perlu dibuat dari Java seperti objek kompleks, objek dari berkas properti atau dari basis data dapat diteruskan oleh metode penyedia data. Metode ini diberi anotasi oleh @DataProvider dan mengembalikan array objek.
Parameter menggunakan Penyedia Data
Anotasi @Parameters mudah tetapi untuk menguji dengan beberapa kumpulan data kita perlu menggunakan Penyedia Data.
Untuk mengisi ribuan formulir web menggunakan kerangka pengujian kami, kami memerlukan metodologi berbeda yang dapat memberi kami kumpulan data yang sangat besar dalam satu alur eksekusi.
Konsep berbasis data ini dicapai dengan @Penyedia data anotasi di TestNG.
Ia hanya memiliki satu atribut 'nama'. Jika Anda tidak menentukan atribut name maka nama DataProvider akan sama dengan nama metode terkait.
Penyedia data kembali objek JAVA dua dimensi ke metode pengujian dan metode pengujian, akan memanggil M kali dalam array objek tipe M*N. Misalnya, jika DataProvider mengembalikan array 2*3 objek, testcase terkait akan dipanggil 2 kali dengan 3 parameter setiap kali.
Contoh Lengkap
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" } }; } }
Panggil DataProvider dari kelas yang berbeda
Secara default, DataProvider berada di kelas yang sama dengan metode pengujian atau kelas dasarnya. Untuk meletakkannya di kelas lain kita perlu menjadikan metode penyedia data sebagai statis dan dalam metode pengujian kita perlu menambahkan atribut kelas Penyedia data in @Uji anotasi.
Contoh Kode
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)); } }
Kelas Penyedia Data.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" } }; }}
Jenis Parameter di Penyedia Data
Ada dua jenis parameter yang didukung oleh metode DataProvider.
metode- Jika SAMA DataProvider harus berperilaku berbeda dengan metode pengujian yang berbeda, gunakan parameter Metode.
Dalam contoh berikut,
- Kami memeriksa apakah nama metodenya adalah testMethodA.
- Jika ya, kembalikan satu set nilai
- Jika tidak, kembalikan kumpulan nilai lainnya
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" } };} } }
Inilah hasilnya
Konteks Teruji– Dapat digunakan untuk membuat parameter berbeda untuk kasus uji berdasarkan grup.
Dalam kehidupan nyata, Anda dapat menggunakan ITestContext untuk memvariasikan nilai parameter berdasarkan Metode Pengujian, host, konfigurasi pengujian.
Dalam contoh kode berikut
- Kami memiliki 2 grup A & B
- Setiap metode pengujian ditugaskan ke grup
- Jika nilai grup adalah A, kumpulan data tertentu dikembalikan
- Jika nilai grup adalah B, kumpulan data lain dikembalikan
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; } }
Catatan: Jika Anda langsung menjalankan kelas testng, kelas tersebut akan memanggil dataprovider terlebih dahulu yang tidak dapat memperoleh informasi grup karena grup tidak tersedia. Namun, jika Anda memanggil kelas ini melalui testng.xml, kelas tersebut akan memiliki info grup yang tersedia dengan ITestContext. Gunakan XML berikut untuk memanggil pengujian
<!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>
Kesimpulan
- Parameterisasi diperlukan untuk dibuat Pengujian Berdasarkan Data.
- TestNG mendukung dua jenis parameterisasi, menggunakan @Parameter+TestNG. Xml dan menggunakan@Penyedia data
-
In @Parameter+TestNG. Xml parameter dapat ditempatkan di level suite dan level pengujian. Jika
Nama parameter yang sama dideklarasikan di kedua tempat; parameter level pengujian akan mendapatkan preferensi daripada parameter level setelan.
- menggunakan @Parameter+TestNG.xml hanya satu nilai yang dapat disetel dalam satu waktu, tetapi @DataProvider kembali array Objek 2d.
- Jika DataProvider ada di kelas yang berbeda maka kelas tempat metode pengujian berada,Penyedia data seharusnya metode statis.
- Ada dua parameter yang didukung oleh Penyedia data adalah metode dan Konteks Teruji.