Dataprovider & TestNG XML: параметризация в Selenium (пример)

Содержание:

Anonim

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

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

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

В этом руководстве вы узнаете:

  • Тип параметризации в TestNG-
  • Аннотация параметров с помощью Testng.xml
  • Исправление проблем
  • Параметры с использованием Dataprovider
  • Вызов DataProvider из другого класса
  • Типы параметров в Dataprovider

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

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

Есть два способа добиться параметризации в TestNG.

  1. С помощью аннотации Parameters и XML- файла TestNG .

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

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

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

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

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

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

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

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

Посмотрим, как это работает

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

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

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

Шаг 3) Убедитесь, что введенное значение такое же, как и в наших тестовых данных.

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

Автор теста SearchKey
Guru99 Индия
Кришна Соединенные Штаты Америки
Бхупеш Китай

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

параметры пакета;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;открытый класс NoParameterWithTestNGXML {String driverPath = "C: \\ geckodriver.exe";Драйвер WebDriver;@Тестpublic void testNoParameter () выбрасывает InterruptedException {Строка author = "guru99";Строка searchKey = "Индия";System.setProperty ("webdriver.gecko.driver", driverPath);драйвер = новый FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");WebElement searchText = driver.findElement (By.name ("q"));// Поиск текста в текстовом поле GooglesearchText.sendKeys (searchKey);System.out.println ("Добро пожаловать ->" + автор + "Ваш ключ поиска ->" + searchKey);System.out.println («Теперь поток будет спать»);Thread.sleep (3000);System.out.println ("Значение в окне поиска Google =" + searchText.getAttribute ("value") + "::: Значение, заданное input =" + searchKey);// проверка значения в окне поиска GoogleAssertJUnit.assertTrue (searchText.getAttribute ("значение"). EqualsIgnoreCase (searchKey));}}

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

Теперь давайте параметризуем это с помощью TestNG

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

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

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

Уровень тестирования TestNG.xml

<имя параметра = "author" value = "Guru99" />
<имя параметра = "searchKey" value = "UK" /><классы>

Файл ParameterWithTestNGXML.java

параметры пакета;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;открытый класс ParameterWithTestNGXML {String driverPath = "C: \\ geckodriver.exe";Драйвер WebDriver;@Тест@Parameters ({"автор", "searchKey"})public void testParameterWithXML (@Optional ("Abc") String author, String searchKey) выдает InterruptedException {System.setProperty ("webdriver.gecko.driver", driverPath);драйвер = новый FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");WebElement searchText = driver.findElement (By.name ("q"));// Поиск текста в текстовом поле GooglesearchText.sendKeys (searchKey);System.out.println ("Добро пожаловать ->" + автор + "Ваш ключ поиска ->" + searchKey);System.out.println («Теперь поток будет спать»);Thread.sleep (3000);System.out.println ("Значение в окне поиска Google =" + searchText.getAttribute ("value") + "::: Значение, заданное input =" + searchKey);// проверка значения в окне поиска GoogleAssertJUnit.assertTrue (searchText.getAttribute ("значение"). EqualsIgnoreCase (searchKey));}}

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

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

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

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

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

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

Исправление проблем

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

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

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

Проблема № 2 Для ваших @Parameters нет соответствующего значения в файле testing.xml.

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

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

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

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

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

Параметры с использованием Dataprovider

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

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

Эта управляемая данными концепция достигается с помощью аннотации @DataProvider в TestNG.

У него есть только один атрибут «имя» . Если вы не укажете атрибут name, тогда имя DataProvider будет таким же, как имя соответствующего метода.

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

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

параметры пакета;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;открытый класс ParameterByDataprovider {Драйвер WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTestpublic void setup () {// Создаем объект драйвера firefoxSystem.setProperty ("webdriver.gecko.driver", driverPath);драйвер = новый FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}/ ** Тестовый пример для проверки окна поиска Google* @param автор* @param searchKey* @throws InterruptedException* /@Test (dataProvider = "SearchProvider")public void testMethod (String author, String searchKey) выдает InterruptedException {{WebElement searchText = driver.findElement (By.name ("q"));// значение поиска в окне поиска GooglesearchText.sendKeys (searchKey);System.out.println ("Добро пожаловать ->" + автор + "Ваш ключ поиска ->" + searchKey);Thread.sleep (3000);Строка testValue = searchText.getAttribute («значение»);System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Проверяем правильность значения в окне поиска GoogleAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** @return Object [] [], где первый столбец содержит "автор"* и второй столбец содержит searchKey* /@DataProvider (name = "SearchProvider")public Object [] [] getDataFromDataprovider () {вернуть новый объект [] []{{"Guru99", "Индия"},{"Кришна", "Великобритания"},{"Бхупеш", "США"}};}}

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

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

Пример кода

TestClass ParameterDataproviderWithClassLevel.java

параметры пакета;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;открытый класс ParameterDataproviderWithClassLevel {Драйвер WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTestpublic void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);драйвер = новый 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) выдает InterruptedException {WebElement searchText = driver.findElement (By.name ("q"));// Поиск текста в текстовом поле GooglesearchText.sendKeys (searchKey);System.out.println ("Добро пожаловать ->" + автор + "Ваш ключ поиска ->" + searchKey);Thread.sleep (3000);// получаем текст из поля поискаСтрока testValue = searchText.getAttribute («значение»);System.out.println (testValue + ":::: + searchKey);searchText.clear ();// проверяем правильность значения в поле поискаAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}

DataproviderClass.java

параметры пакета;import org.testng.annotations.DataProvider;public class DataproviderClass {@DataProvider (name = "SearchProvider")public static Object [] [] getDataFromDataprovider () {return new Object [] [] {{"Guru99", "Индия"},{"Кришна", "Великобритания"},{"Бхупеш", "США"}};}}

Типы параметров в Dataprovider

Метод DataProvider поддерживает два типа параметров.

Метод - если ЖЕ DataProvider должен вести себя по-разному с другим методом тестирования, используйте параметр Method.

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

  • Мы проверяем, является ли имя метода testMethodA.
  • Если да, верните один набор значений
  • Иначе вернуть другой набор значений
параметры пакета;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;открытый класс ParameterByMethodInDataprovider {Драйвер WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTestpublic void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);драйвер = новый FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider")public void testMethodA (автор строки, String searchKey) выбрасывает InterruptedException {WebElement searchText = driver.findElement (By.name ("q"));// Поиск текста в поле поискаsearchText.sendKeys (searchKey);// Вывести автора и строку поискаSystem.out.println ("Добро пожаловать ->" + автор + "Ваш ключ поиска ->" + searchKey);Thread.sleep (3000);Строка testValue = searchText.getAttribute («значение»);System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Проверяем, правильно ли отображается текстовое поле GoogleAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}@Test (dataProvider = "SearchProvider")public void testMethodB (String searchKey) выбрасывает InterruptedException {{WebElement searchText = driver.findElement (By.name ("q"));// Поиск текста в поле поискаsearchText.sendKeys (searchKey);// Вывести только строку поискаSystem.out.println ("Добро пожаловать -> Неизвестный пользователь Ваш ключ поиска ->" + searchKey);Thread.sleep (3000);Строка testValue = searchText.getAttribute («значение»);System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Проверяем, правильно ли отображается текстовое поле GoogleAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** Здесь DataProvider возвращает значение на основе имени тестового метода* @param m* @возвращаться** /@DataProvider (name = "SearchProvider")public Object [] [] getDataFromDataprovider (Метод m) {if (m.getName (). equalsIgnoreCase ("testMethodA")) {return new Object [] [] {{"Guru99", "Индия"},{"Кришна", "Великобритания"},{"Бхупеш", "США"}};}еще{return new Object [] [] {{"Канада"},{ "Россия" },{"Япония"}};}}}

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

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

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

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

  • У нас есть 2 группы A и B
  • Каждый метод тестирования закреплен за группой.
  • Если значение группы равно A, возвращается конкретный набор данных.
  • Если значение группы B, возвращается другой набор данных.
параметры пакета;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;открытый класс ParameterByITestContextInDataprovider {Драйвер WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTest (groups = {"A", "B"})public void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);драйвер = новый FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider", groups = "A")public void testMethodA (автор строки, String searchKey) выбрасывает InterruptedException {{// поиск в текстовом поле GoogleWebElement searchText = driver.findElement (By.name ("q"));// ищем на нем значениеsearchText.sendKeys (searchKey);System.out.println ("Добро пожаловать ->" + автор + "Ваш ключ поиска ->" + searchKey);Thread.sleep (3000);Строка testValue = searchText.getAttribute («значение»);System.out.println (testValue + ":::: + searchKey);searchText.clear ();// проверяем правильность значения в поисковой строкеAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}@Test (dataProvider = "SearchProvider", groups = "B")public void testMethodB (String searchKey) выбрасывает InterruptedException {{// найти окно поиска googleWebElement searchText = driver.findElement (By.name ("q"));// ищем на нем значениеsearchText.sendKeys (searchKey);System.out.println ("Добро пожаловать -> Неизвестный пользователь Ваш ключ поиска ->" + searchKey);Thread.sleep (3000);Строка testValue = searchText.getAttribute («значение»);System.out.println (testValue + ":::: + searchKey);searchText.clear ();// проверяем правильность значения в поисковой строкеAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** Здесь DAtaProvider предоставит массив объектов на основе ITestContext* @param c* @возвращаться* /@DataProvider (name = "SearchProvider")public Object [] [] getDataFromDataprovider (ITestContext c) {Объект [] [] groupArray = null;for (Группа строк: c.getIncludedGroups ()) {if (group.equalsIgnoreCase ("A")) {groupArray = новый объект [] [] {{"Guru99", "Индия"},{"Кришна", "Великобритания"},{"Бхупеш", "США"}};перемена;}иначе, если (group.equalsIgnoreCase ("B")){groupArray = новый объект [] [] {{"Канада"},{ "Россия" },{"Япония"}};}перемена;}return groupArray;}}

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

<группы><бегать><классы><классname = "parameters.ParameterByITestContextInDataprovider" /><группы><бегать><классы><классname = "parameters.ParameterByITestContextInDataprovider" />

Резюме :

  • Для создания тестирования, управляемого данными, требуется параметризация .
  • TestNG поддерживает два вида параметризации, используя @ Parameter + TestNG.xml и используя @DataProvider.
  • В @ Parameter + TestNG.xml параметры могут быть размещены на уровне набора и уровне тестирования. Если

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

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