Penyedia data & TestNG XML: Parameterisasi dalam Selenium(Contoh)

Saat kami membuat perangkat lunak, kami selalu berharap perangkat lunak tersebut bekerja secara berbeda dengan kumpulan data yang berbeda. Ketika tiba saatnya pengujian perangkat lunak yang sama, kami tidak dapat bertindak tidak adil jika mengujinya hanya dengan satu set data. Di sini sekali lagi, kami perlu memverifikasi bahwa sistem kami mengambil semua kombinasi yang diharapkan mendukung. Untuk itu, kita perlu membuat parameter pada skrip pengujian kita. Inilah Parameterisasi pada gambar.

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

  1. Dengan bantuan dari Parameters anotasi dan TestNG XML file.

    Jenis Parameterisasi Dalam TestNG

  2. Dengan bantuan dari Penyedia data anotasi.

    Jenis Parameterisasi Dalam TestNG

Jenis Parameterisasi Dalam TestNG

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

Anotasi Parameter Dengan Testng.Xml

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

Anotasi Parameter Dengan Testng.Xml

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)

ParameterDenganTestNGFile XML.java

Sekarang, parameter dapat ditentukan pada 2 level

  1. Tingkat suite – Parameter di dalam tag dari TestNG File XML akan menjadi parameter tingkat suite.
  2. Level Tes — Parameter di dalam tag file XML pengujian akan menjadi parameter level Pengujian.

Berikut adalah pengujian yang sama dengan parameter level suite

ParameterDenganTestNGFile XML.java

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.

ParameterDenganTestNGFile XML.java

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

Penyelesaian masalah

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.

Penyelesaian masalah

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.

Parameter Menggunakan Penyedia Data

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.

Parameter Menggunakan Penyedia Data

Contoh Lengkap

Parameter Menggunakan Penyedia Data

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.

Panggil Penyedia Data Dari Kelas Berbeda

Contoh Kode

Panggil Penyedia Data Dari Kelas Berbeda

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.

Jenis Parameter Di Penyedia Data

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

Jenis Parameter Di Penyedia Data

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.

Jenis Parameter Di Penyedia Data

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.