Semasa kami membuat perisian, kami selalu berharap ia berfungsi dengan berbeza dengan kumpulan data yang berbeza. Ketika menguji perisian yang sama, kami tidak adil untuk mengujinya dengan hanya satu set data. Di sini sekali lagi, kita perlu mengesahkan bahawa sistem kita menggunakan semua kombinasi yang diharapkan dapat menyokong. Untuk itu, kita perlu membuat parameter prestasi. Di sinilah Parameterisasi dalam gambar.
Parameterisasi di Selenium
Parameterisasi dalam Selenium adalah suatu proses untuk memaramatisasi skrip pengujian untuk menyampaikan banyak data ke aplikasi pada waktu proses. Ini adalah strategi pelaksanaan yang secara automatik menjalankan kes ujian beberapa kali menggunakan nilai yang berbeza. Konsep yang dicapai dengan membuat parameter skrip ujian disebut Data Driven Testing .
Dalam tutorial ini, anda akan belajar-
- Jenis Parameterisasi dalam UjianNG-
- Anotasi parameter dengan Testng.xml
- Penyelesaian masalah
- Parameter menggunakan Dataprovider
- Memohon DataProvider dari kelas yang berbeza
- Jenis Parameter di Dataprovider
Jenis Parameterisasi dalam UjianNG-
Untuk menjadikan parameterisasi lebih jelas, kami akan melalui pilihan parameterisasi dalam satu rangka kerja paling popular untuk Selenium Webdriver - TestNG .
Terdapat dua cara untuk mencapai parameterisasi dalam TestNG
- Dengan bantuan anotasi Parameter dan fail TestNG XML .
- Dengan bantuan anotasi DataProvider .
Parameter dari Testng.xml boleh mengikut tahap atau tahap ujian
Parameter dari DataProvider boleh menggunakan Method dan ITestContext sebagai parameter.
Mari kaji secara terperinci -
Anotasi Parameter dalam TestNG
Anotasi Parameter dalam TestNG adalah kaedah yang digunakan untuk menyampaikan nilai ke kaedah ujian sebagai argumen menggunakan fail .xml. Pengguna mungkin diminta untuk menyampaikan nilai ke kaedah ujian selama masa berjalan. Kaedah anotasi @Parameter boleh digunakan dalam kaedah apa pun yang mempunyai anotasi @Test, @Sebelum, @Selepas atau @Factory.
Anotasi parameter dengan Testng.xml
Pilih parameterisasi menggunakan anotasi apabila anda ingin menangani kerumitan & jumlah kombinasi input kurang.
Mari lihat bagaimana ini berfungsi
Senario Ujian
Langkah 1) Lancarkan penyemak imbas & pergi ke Google.com
Langkah 2) Masukkan kata kunci carian
Langkah 3) Pastikan nilai yang dimasukkan sama seperti yang diberikan oleh data ujian kami
Langkah 4) Ulangi 2 & 3 sehingga semua nilai dimasukkan
Pengarang Ujian | CariKey |
Guru99 | India |
Krishna | USA |
Bhupesh | China |
Berikut adalah contoh cara melakukannya TANPA parameter
parameter pakej;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;kelas awam NoParameterWithTestNGXML {String driverPath = "C: \\ geckodriver.exe";Pemacu WebDriver;@ Ujianujian kekosongan awamNoParameter () melemparkan InterruptException {Pengarang rentetan = "guru99";String searchKey = "india";System.setProperty ("webdriver.gecko.driver", driverPath);driver = FirefoxDriver baru ();driver.manage (). timeout (). secara implisitWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");WebElement searchText = driver.findElement (By.name ("q"));// Mencari teks di kotak teks googlesearchText.sendKeys (searchKey);System.out.println ("Welcome ->" + author + "Kunci carian anda adalah ->" + searchKey);System.out.println ("Thread akan tidur sekarang");Thread.sleep (3000);System.out.println ("Nilai di Kotak Carian Google =" + searchText.getAttribute ("value") + "::: Nilai yang diberikan oleh input =" + searchKey);// mengesahkan nilai di kotak carian googleAssertJUnit.assertTrue (searchText.getAttribute ("value"). SamaIgnoreCase (searchKey));}}
Satu Kajian, contoh di atas. Bayangkan betapa rumitnya kod tersebut ketika kita melakukan ini untuk 3 kombinasi input
Sekarang, mari kita parameter ini menggunakan TestNG
Untuk melakukannya, anda perlu
- Buat fail XML yang akan menyimpan parameter
- Dalam ujian, tambahkan anotasi @Parameters
Inilah kod lengkapnya
Ujian Tahap UjianNG.xml
xml version = "1.0" encoding = "UTF-8"?>
Fail ParameterWithTestNGXML.java
parameter pakej;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.Pilihan;import org.testng.annotations.Parameter;import org.testng.annotations.Test;Parameter kelas awamWithTestNGXML {String driverPath = "C: \\ geckodriver.exe";Pemacu WebDriver;@ Ujian@Parameter ({"pengarang", "searchKey"})ujian kekosongan awamParameterWithXML (@Optional ("Abc") Pengarang rentetan, String searchKey) melemparkan InterruptException {System.setProperty ("webdriver.gecko.driver", driverPath);driver = FirefoxDriver baru ();driver.manage (). timeout (). secara implisitWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");WebElement searchText = driver.findElement (By.name ("q"));// Mencari teks di kotak teks googlesearchText.sendKeys (searchKey);System.out.println ("Welcome ->" + author + "Kunci carian anda adalah ->" + searchKey);System.out.println ("Thread akan tidur sekarang");Thread.sleep (3000);System.out.println ("Nilai di Kotak Carian Google =" + searchText.getAttribute ("value") + "::: Nilai yang diberikan oleh input =" + searchKey);// mengesahkan nilai di kotak carian googleAssertJUnit.assertTrue (searchText.getAttribute ("value"). SamaIgnoreCase (searchKey));}}
Arahan untuk menjalankan skrip, pilih fail XML dan Jalankan sebagai Test NG Suite
Klik kanan pada fail .xml -> Jalankan sebagai -> Testng Suite (Catatan: Suite)
Sekarang, parameter dapat ditentukan pada 2 tahap
- Tingkat suite - Parameter di dalam tag
dari fail TestNG XML akan menjadi parameter tingkat suite. - Tahap Uji - Parameter di dalam tag
pengujian fail XML akan menjadi parameter Tahap ujian.
Berikut adalah ujian yang sama dengan parameter tahap suite
CATATAN: Sekiranya nama parameter sama di tingkat suite dan tahap ujian maka parameter tahap ujian akan mendapat keutamaan daripada tingkat suite. Jadi, dalam kes itu, semua kelas di dalam tahap ujian itu akan berkongsi parameter yang diganti, dan kelas lain yang berada di luar tahap ujian akan berkongsi parameter tahap suite.
Penyelesaian masalah
Isu # 1 Nilai parameter dalam testng.xml tidak dapat ditaipkan ke parameter kaedah ujian yang sesuai, ia akan menimbulkan ralat.
Pertimbangkan contoh berikut
Di sini, atribut 'author' sama dengan 'Guru99' yang merupakan rentetan dan dalam kaedah ujian yang sesuai mengharapkan nilai integer, jadi kita akan mendapat pengecualian di sini.
Isu # 2 Parameter @ anda tidak mempunyai nilai yang sepadan dalam testing.xml.
Anda boleh menyelesaikan keadaan ini dengan menambahkan @ anotasi pilihan dalam parameter yang sesuai dalam kaedah ujian.
Isu # 3: Anda ingin menguji beberapa nilai parameter yang sama menggunakan Testng.xml
Jawapan yang mudah ialah ini tidak dapat dilakukan! Anda boleh mempunyai beberapa parameter yang berbeza, tetapi setiap parameter hanya dapat memiliki satu nilai. Ini membantu mengelakkan nilai hardcoding ke dalam skrip. Ini menjadikan kod boleh digunakan semula. Anggaplah ia sebagai fail konfigurasi untuk skrip anda. Sekiranya anda ingin menggunakan beberapa nilai untuk parameter gunakan DataProviders
Pembekal Data dalam TestNG
Penyedia Data dalam TestNG adalah kaedah yang digunakan ketika pengguna perlu melewati parameter kompleks. Parameter Kompleks perlu dibuat dari Java seperti objek kompleks, objek dari fail harta tanah atau dari pangkalan data dapat dilalui dengan kaedah penyedia data. Kaedah ini dijelaskan oleh @DataProvider dan ia mengembalikan pelbagai objek.
Parameter menggunakan Dataprovider
Anotasi @Parameter mudah tetapi untuk diuji dengan pelbagai set data, kita perlu menggunakan Penyedia Data.
Untuk mengisi beribu-ribu borang web menggunakan kerangka ujian kami, kami memerlukan metodologi yang berbeza yang dapat memberi kami kumpulan data yang sangat besar dalam satu aliran pelaksanaan.
Konsep data didorong dicapai dengan @DataProvider anotasi dalam TestNG.
Ia hanya mempunyai satu atribut 'name' . Sekiranya anda tidak menentukan atribut nama maka nama DataProvider akan sama dengan nama kaedah yang sesuai.
Penyedia data mengembalikan objek JAVA dua dimensi ke kaedah ujian dan kaedah ujian, akan memanggil M kali dalam jenis objek objek M * N. Sebagai contoh, jika DataProvider mengembalikan array 2 * 3 objek, ujian yang sesuai akan dipanggil 2 kali dengan 3 parameter setiap kali.
Contoh Lengkap
parameter pakej;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;Parameter kelas awamByDataprovider {Pemacu WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTestpersediaan kosong awam () {// Buat objek pemacu firefoxSystem.setProperty ("webdriver.gecko.driver", driverPath);driver = FirefoxDriver baru ();driver.manage (). timeout (). secara implisitWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}/ ** Uji kes untuk mengesahkan kotak carian google* @param pengarang* @param searchKey* @throws InterruptException* /@Test (dataProvider = "SearchProvider")public void testM Method (String author, String searchKey) membuang InterruptException {{WebElement searchText = driver.findElement (By.name ("q"));// nilai carian di kotak carian googlesearchText.sendKeys (searchKey);System.out.println ("Welcome ->" + author + "Kunci carian anda adalah ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("nilai");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Sahkan sama ada nilai di kotak carian google betulAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** @return Object [] [] di mana lajur pertama mengandungi 'pengarang'* dan lajur kedua mengandungi 'searchKey'* /@DataProvider (nama = "SearchProvider")objek awam [] [] getDataFromDataprovider () {mengembalikan Objek baru [] []{{"Guru99", "India"},{"Krishna", "UK"},{"Bhupesh", "USA"}};}}
Memohon DataProvider dari kelas yang berbeza
Secara lalai, DataProvider berada di kelas yang sama dengan kaedah ujian atau kelas asasnya. Untuk meletakkannya di beberapa kelas lain, kita perlu menjadikan kaedah penyedia data sebagai statik dan dalam kaedah ujian kita perlu menambahkan atribut dataProviderClass dalam @Test anotasi.
Contoh Kod
Parameter TestClassDataproviderWithClassLevel.java
parameter pakej;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;Parameter kelas awamDataproviderWithClassLevel {Pemacu WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTestpersediaan kosong awam () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = FirefoxDriver baru ();driver.manage (). timeout (). secara implisitWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider", dataProviderClass = DataproviderClass.class)public void testM Method (String author, String searchKey) membuang InterruptException {WebElement searchText = driver.findElement (By.name ("q"));// Cari teks di kotak teks googlesearchText.sendKeys (searchKey);System.out.println ("Welcome ->" + author + "Kunci carian anda adalah ->" + searchKey);Thread.sleep (3000);// dapatkan teks dari kotak carianString testValue = searchText.getAttribute ("nilai");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// sahkan sama ada kotak carian mempunyai nilai yang betulAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}
DataproviderClass.java
parameter pakej;import org.testng.annotations.DataProvider;DataproviderClass kelas awam {@DataProvider (nama = "SearchProvider")Objek statik awam [] [] getDataFromDataprovider () {kembalikan Objek baru [] [] {{"Guru99", "India"},{"Krishna", "UK"},{"Bhupesh", "USA"}};}}
Jenis Parameter di Dataprovider
Terdapat dua jenis parameter yang disokong oleh kaedah DataProvider.
Kaedah - Sekiranya Penyedia Data SAMA harus berkelakuan berbeza dengan kaedah ujian yang berbeza, gunakan parameter Kaedah.
Dalam contoh berikut,
- Kami memeriksa sama ada nama kaedah adalah testMethodA.
- Sekiranya ya, kembalikan satu set nilai
- Lain mengembalikan satu set nilai yang lain
parameter pakej;import java.lang.reflect.M 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;kelas awam ParameterByMethodInDataprovider {Pemacu WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTestpersediaan kosong awam () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = FirefoxDriver baru ();driver.manage (). timeout (). secara implisitWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider")public void testMethodA (String author, String searchKey) membuang InterruptException {WebElement searchText = driver.findElement (By.name ("q"));// Cari teks di kotak cariansearchText.sendKeys (searchKey);// Cetak pengarang dan rentetan carianSystem.out.println ("Welcome ->" + author + "Kunci carian anda adalah ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("nilai");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Sahkan sama ada kotak teks google menunjukkan nilai yang betulAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}@Test (dataProvider = "SearchProvider")public void testMethodB (String searchKey) membuang InterruptException {{WebElement searchText = driver.findElement (By.name ("q"));// Cari teks di kotak cariansearchText.sendKeys (searchKey);// Cetak rentetan carian sahajaSystem.out.println ("Selamat Datang -> Pengguna tidak dikenali Kunci carian anda adalah ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("nilai");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Sahkan sama ada kotak teks google menunjukkan nilai yang betulAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** Berikut nilai pengembalian DataProvider berdasarkan nama kaedah ujian* @param m* @kembali** /@DataProvider (nama = "SearchProvider")objek awam [] [] getDataFromDataprovider (Kaedah m) {jika (m.getName (). samaIgnoreCase ("testMethodA")) {kembalikan Objek baru [] [] {{"Guru99", "India"},{"Krishna", "UK"},{"Bhupesh", "USA"}};}lain {kembalikan Objek baru [] [] {{"Kanada"},{"Rusia"},{ "Jepun" }};}}}
Inilah keluarannya
ITestContext - Ia dapat digunakan untuk membuat parameter yang berbeza untuk kes ujian berdasarkan kumpulan.
Dalam kehidupan nyata, anda boleh menggunakan ITestContext untuk mengubah nilai parameter berdasarkan Kaedah Uji, hos, konfigurasi ujian.
Dalam contoh kod berikut
- Kami mempunyai 2 kumpulan A & B
- Setiap kaedah ujian diberikan kepada satu kumpulan
- Sekiranya nilai kumpulan adalah A, set data tertentu dikembalikan
- Sekiranya nilai kumpulan adalah B, set data lain dikembalikan
parameter pakej;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;Parameter kelas awamByITestContextInDataprovider {Pemacu WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTest (kumpulan = {"A", "B"})persediaan kosong awam () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = FirefoxDriver baru ();driver.manage (). timeout (). secara implisitWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider", kumpulan = "A")public void testMethodA (String author, String searchKey) membuang InterruptException {{// cari kotak teks googleWebElement searchText = driver.findElement (By.name ("q"));// cari nilai di atasnyasearchText.sendKeys (searchKey);System.out.println ("Welcome ->" + author + "Kunci carian anda adalah ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("nilai");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// sahkan nilai yang betul di kotak carianAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}@Test (dataProvider = "SearchProvider", kumpulan = "B")public void testMethodB (String searchKey) membuang InterruptException {{// cari kotak carian googleWebElement searchText = driver.findElement (By.name ("q"));// cari nilai di atasnyasearchText.sendKeys (searchKey);System.out.println ("Selamat Datang -> Pengguna tidak dikenali Kunci carian anda adalah ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("nilai");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// sahkan nilai yang betul di kotak carianAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** Di sini DAtaProvider akan menyediakan array Objek berdasarkan ITestContext* @param c* @kembali* /@DataProvider (nama = "SearchProvider")objek awam [] [] getDataFromDataprovider (ITestContext c) {Objek [] [] groupArray = null;untuk (kumpulan rentetan: c.getIncludedGroups ()) {jika (group.equalsIgnoreCase ("A")) {groupArray = Objek baru [] [] {{"Guru99", "India"},{"Krishna", "UK"},{"Bhupesh", "USA"}};rehat;}lain jika (group.equalsIgnoreCase ("B")){groupArray = Objek baru [] [] {{"Kanada"},{"Rusia"},{ "Jepun" }};}rehat;}kembali kumpulanArray;}}
Catatan: Sekiranya anda menjalankan kelas testng secara langsung, ia akan memanggil penyedia data yang tidak dapat mendapatkan maklumat kumpulan kerana kumpulan tidak tersedia. Tetapi sebaliknya jika anda memanggil kelas ini melalui testng.xml, ia akan mempunyai maklumat kumpulan yang tersedia dengan ITestContext. Gunakan XML berikut untuk memanggil ujian
Ringkasan :
- Parameterisasi diperlukan untuk membuat Ujian Berdasarkan Data .
- TestNG menyokong dua jenis parameterisasi, menggunakan @ Parameter + TestNG.xml dan menggunakan @DataProvider
- Dalam parameter @ Parameter + TestNG.xml boleh diletakkan di tahap suite dan tahap ujian. Sekiranya
Nama parameter yang sama dinyatakan di kedua tempat; parameter tahap ujian akan mendapat keutamaan daripada parameter tahap saman.
- menggunakan @ Parameter + TestNG.xml hanya satu nilai yang dapat ditetapkan pada satu masa, tetapi @DataProvider mengembalikan array Objek 2d .
- Sekiranya DataProvider hadir di kelas yang berbeza maka kelas tempat kaedah ujian berada, DataProvider haruslah kaedah statik .
- Terdapat dua parameter yang disokong oleh DataProvider adalah Method dan ITestContext.