Поставщик данных и TestNG XML: параметризация в Selenium(Пример)

Создавая программное обеспечение, мы всегда хотим, чтобы оно работало по-другому с другим набором данных. Когда дело доходит до Тестирование одно и то же программное обеспечение, мы не можем быть несправедливыми, тестируя его только на одном наборе данных. Здесь нам снова необходимо убедиться, что наша система принимает весь набор комбинаций, которые, как ожидается, будут поддерживать. Для этого нам нужно параметризовать наши тестовые сценарии. А вот и параметризация на картинке.

Параметризация в Selenium

Параметризация в Selenium — это процесс параметризации тестовых сценариев для передачи нескольких данных приложению во время выполнения. Это стратегия выполнения, которая автоматически запускает тестовые случаи несколько раз с использованием разных значений. Концепция, достигаемая путем параметризации тестовых сценариев, называется Тестирование на основе данных.

Тип параметризации в TestNG-

Чтобы сделать параметризацию более понятной, мы рассмотрим варианты параметризации в одной из самых популярных платформ для Selenium Вебдрайвер – TestNG.

Существуют два пути с помощью которого мы можем добиться параметризации в TestNG

  1. С помощью параметры аннотирование и TestNG XML .

    Тип параметризации TestNG

  2. С помощью DataProvider аннотаций.

    Тип параметризации TestNG

Тип параметризации TestNG

Параметры из Testng.xml могут относиться к уровню набора или теста.

Параметр из DataProvider может принимать в качестве параметра Method и ITestContext.

Давайте изучим их подробно –

Параметры Аннотация в TestNG

Параметры Аннотация в TestNG — это метод, используемый для передачи значений методам тестирования в качестве аргументов с использованием файла .xml. Пользователям может потребоваться передать значения методам тестирования во время выполнения. Метод аннотации @Parameters можно использовать в любом методе, имеющем аннотацию @Test, @Before, @After или @Factory.

Аннотация параметров с помощью Testng.xml

Выбирайте параметризацию с использованием аннотаций, когда вы хотите иметь дело со сложностью и количество входных комбинаций меньше.

Давайте посмотрим, как это работает

Сценарий тестирования

Шаг 1) Запустите браузер и перейдите на Google.com.

Шаг 2) Введите ключевое слово для поиска

Аннотация параметров с помощью Testng.Xml

Шаг 3) Убедитесь, что введенное значение совпадает с полученным в наших тестовых данных.

Шаг 4) Повторяйте 2 и 3, пока не будут введены все значения.

Автор теста ПоискКлюч
Guru99 Индия
Krishna США
Бхупеш Китай

Вот пример того, как это сделать БЕЗ параметров.

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));
}
}

Исследование, пример выше. Представьте, насколько сложным станет код, когда мы сделаем это для 3 комбинаций входных данных

Теперь давайте параметризуем это, используя TestNG

Для этого вам нужно будет

  • Создайте XML-файл, в котором будут храниться параметры.
  • В тесте добавьте аннотацию @Parameters

Аннотация параметров с помощью Testng.Xml

Вот полный код

Уровень теста 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>

ПараметрСTestNGФайл 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));

}
}

Инструкции по запуску сценария: выберите XML-файл и запустите его как Test NG Suite.

Щелкните правой кнопкой мыши файл .xml -> Запустить от имени ->. TestNG Люкс (Примечание: Люкс)

ПараметрСTestNGФайл XML.java

Теперь параметры можно определять на двух уровнях.

  1. Уровень пакета – параметры внутри тег TestNG XML-файл будет параметром уровня пакета.
  2. Уровень тестирования — параметры внутри Тег тестового XML-файла будет параметром уровня тестирования.

Вот тот же тест с параметрами уровня пакета

ПараметрСTestNGФайл XML.java

ПРИМЕЧАНИЕ: В случае, если имя параметра одинаковое на уровне пакета и уровне теста, параметр уровня теста будет иметь преимущество над уровнем пакета. Таким образом, в этом случае все классы внутри этого тестового уровня будут совместно использовать переопределенный параметр, а другие классы, находящиеся за пределами тестового уровня, будут использовать общий параметр уровня набора.

ПараметрСTestNGФайл XML.java

УСТРАНЕНИЕ НЕПОЛАДОК

Выпуск № 1 Значение параметра в testng.xml не может быть приведено к соответствующему параметру метода тестирования, это приведет к ошибке.

Рассмотрим следующий пример

Поиск проблемы

Здесь атрибут «автор» равен «Guru99», который является строкой, и в соответствующем методе тестирования он ожидает целочисленное значение, поэтому здесь мы получим исключение.

Выпуск № 2 Ваши @Parameters не имеют соответствующего значения в файлеtest.xml.

Вы можете решить эту ситуацию, добавив @по желанию аннотирование в соответствующем параметре метода тестирования.

Поиск проблемы

Выпуск № 3: Вы хотите проверить несколько значений одного и того же параметра с помощью Testng.xml.

Простой ответ: этого сделать невозможно! У вас может быть несколько разных параметров, но каждый параметр может иметь только одно значение. Это помогает предотвратить жесткое кодирование значений в скрипте. Это делает код многоразовым. Думайте об этом как о файлах конфигурации для вашего скрипта. Если вы хотите использовать несколько значений для параметра, используйте DataProviders.

Поставщик данных в TestNG

Поставщик данных в TestNG это метод, используемый, когда пользователю необходимо передать сложные параметры. Сложные параметры должны быть созданы из Java такие как сложные объекты, объекты из файлов свойств или из базы данных могут быть переданы методом поставщика данных. Метод аннотирован @DataProvider и возвращает массив объектов.

Параметры с использованием поставщика данных

Аннотация @Parameters проста, но для тестирования с несколькими наборами данных нам нужно использовать поставщика данных.

Чтобы заполнить тысячи веб-форм с помощью нашей среды тестирования, нам нужна другая методология, которая может дать нам очень большой набор данных в одном потоке выполнения.

Эта концепция, основанная на данных, достигается за счет @DataProvider аннотация в TestNG.

Параметры с использованием поставщика данных

Он имеет только один имя атрибута'. Если вы не укажете атрибут name, имя поставщика данных будет таким же, как имя соответствующего метода.

Возврат поставщика данных двумерный объект JAVA к методу тестирования и методу тестирования, будет вызывать M раз в массиве объектов типа M*N. Например, если DataProvider возвращает массив из 2*3 объектов, соответствующий тестовый пример будет вызываться 2 раза с 3 параметрами каждый раз.

Параметры с использованием поставщика данных

Полный пример

Параметры с использованием поставщика данных

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" }
        };

    }

}

Вызов DataProvider из другого класса

По умолчанию DataProvider находится в том же классе, что и тестовый метод, или в его базовом классе. Чтобы поместить его в какой-то другой класс, нам нужно сделать метод поставщика данных статическим, а в тестовом методе нам нужно добавить атрибут. класс dataProviderClass in @Контрольная работа аннотаций.

Вызов поставщика данных из другого класса

Пример кода

Вызов поставщика данных из другого класса

Параметр TestClassDataproviderWithClassLevel.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 поддерживает два типа параметров.

Способ доставки- Если SAME DataProvider должен вести себя по-разному с разными методами тестирования, используйте параметр Method.

Типы параметров в поставщике данных

В следующем примере:

  • Мы проверяем, является ли имя метода testMethodA.
  • Если да, верните один набор значений
  • В противном случае верните другой набор значений.
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" }
            };}       
    }
}

Вот результат

Типы параметров в поставщике данных

ITestContext– Его можно использовать для создания различных параметров для тестовых случаев на основе групп.

В реальной жизни вы можете использовать ITestContext для изменения значений параметров в зависимости от методов тестирования, хостов и конфигураций теста.

Типы параметров в поставщике данных

В следующем примере кода

  • У нас есть 2 группы A и B.
  • Каждый метод испытаний отнесен к группе
  • Если значение группы равно A, возвращается определенный набор данных.
  • Если значение группы равно B, возвращается другой набор данных.
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;		
	}
}

Примечание. Если вы запускаете класс testng напрямую, он сначала вызывает поставщика данных, который не может получить информацию о группах, поскольку группы недоступны. Но вместо этого, если вы вызовете этот класс через testng.xml, информация о группах будет доступна через ITestContext. Используйте следующий XML для вызова теста

<!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>

Резюме

  • Параметризация требуется для создания Тестирование на основе данных.
  • TestNG поддерживать два вида параметризации, используя @Параметр+TestNG. Xml и использование@DataProvider
  • In @Параметр+TestNG. Xml параметры могут быть размещены на уровне пакета и уровне тестирования. Если

    В обоих местах объявлено одно и то же имя параметра; Параметр уровня тестирования будет иметь преимущество перед параметром уровня костюма.

  • используя @Parameter+TestNG.xml можно установить только одно значение одновременно, но @DataProvider возвращает 2d массив объектов.
  • Если DataProvider присутствует в другом классе, то это класс, в котором находится тестовый метод,DataProvider должно быть статический метод.
  • Есть два параметра, поддерживаемые DataProvider Способ доставки и ITestContext.

Ежедневная рассылка Guru99

Начните свой день с последних и самых важных новостей об искусственном интеллекте, которые мы представляем вам прямо сейчас.