Провайдер даних & TestNG XML: Параметризація в селені (приклад)

Зміст:

Anonim

Створюючи програмне забезпечення, ми завжди хочемо, щоб воно працювало інакше з різним набором даних. Що стосується тестування одного і того ж програмного забезпечення, ми не можемо бути несправедливими, перевіряючи його лише за допомогою одного набору даних. Тут нам знову потрібно перевірити, чи наша система приймає всі набори комбінацій, які, як очікується, підтримують. Для цього нам потрібно параметризувати наші тестові наукові роботи. Ось параметризація на малюнку.

Параметризація в селені

Параметризація в Selenium - це процес параметризації тестових сценаріїв для передачі кількох даних додатку під час виконання. Це стратегія виконання, яка автоматично запускає тестові кейси кілька разів, використовуючи різні значення. Концепція, досягнута параметризацією тестових сценаріїв, називається Data Driven Testing .

У цьому підручнику ви дізнаєтесь-

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

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

Щоб зробити параметризацію більш зрозумілою, ми розглянемо параметри параметризації в одному з найпопулярніших фреймворків для Selenium Webdriver - TestNG .

Існує два способи досягнення параметризації в TestNG

  1. За допомогою анотації параметрів та 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
Гуру99 Індія
Крішна США
Бупеш Китай

Ось приклад того, як це робити БЕЗ параметрів

параметри пакета;імпорт org.testng.annotations.Test;імпорт org.testng.AssertJUnit;імпортувати java.util.concurrent.TimeUnit;імпорт org.openqa.selenium.By;імпорт org.openqa.selenium.WebDriver;імпорт org.openqa.selenium.WebElement;імпорт org.openqa.selenium.firefox.FirefoxDriver;відкритий клас NoParameterWithTestNGXML {Рядок driverPath = "C: \\ geckodriver.exe";Драйвер WebDriver;@ Тестpublic void testNoParameter () викидає InterruptedException {Автор рядка = "guru99";Рядок searchKey = "india";System.setProperty ("webdriver.gecko.driver", driverPath);драйвер = новий FirefoxDriver ();driver.manage (). timeouts (). неявноWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");WebElement searchText = driver.findElement (By.name ("q"));// Пошук тексту в текстовому полі GooglesearchText.sendKeys (searchKey);System.out.println ("Ласкаво просимо ->" + автор + "Ваша клавіша пошуку ->" + ключ пошуку);System.out.println ("Нитка зараз буде спати");Нитка.спання (3000);System.out.println ("Значення у вікні пошуку Google =" + searchText.getAttribute ("значення") + "::: Значення, вказане input =" + searchKey);// перевірка значення у вікні пошуку GoogleAssertJUnit.assertTrue (searchText.getAttribute ("значення"). EqualsIgnoreCase (searchKey));}}

Дослідження, наведений вище приклад. Тільки уявіть, наскільки складним стане код, коли ми зробимо це для 3 комбінацій введення

Тепер давайте параметризуємо це за допомогою TestNG

Для цього вам потрібно буде

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

Ось повний код

Тестовий рівень TestNG.xml

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

Файл ParameterWithTestNGXML.java

параметри пакета;імпорт org.testng.AssertJUnit;імпортувати java.util.concurrent.TimeUnit;імпорт org.openqa.selenium.By;імпорт org.openqa.selenium.WebDriver;імпорт org.openqa.selenium.WebElement;імпорт org.openqa.selenium.firefox.FirefoxDriver;імпорт орг.тест.нотації.Необов’язково;імпорт org.testng.annotations.Parameters;імпорт org.testng.annotations.Test;відкритий клас ParameterWithTestNGXML {Рядок driverPath = "C: \\ geckodriver.exe";Драйвер WebDriver;@ Тест@Parameters ({"автор", "searchKey"})public void testParameterWithXML (@Optional ("Abc") Автор рядка, рядок searchKey) викидає InterruptedException {System.setProperty ("webdriver.gecko.driver", driverPath);драйвер = новий FirefoxDriver ();driver.manage (). timeouts (). неявноWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");WebElement searchText = driver.findElement (By.name ("q"));// Пошук тексту в текстовому полі GooglesearchText.sendKeys (searchKey);System.out.println ("Ласкаво просимо ->" + автор + "Ваша клавіша пошуку ->" + ключ пошуку);System.out.println ("Нитка зараз буде спати");Нитка.спання (3000);System.out.println ("Значення у вікні пошуку Google =" + searchText.getAttribute ("значення") + "::: Значення, вказане input =" + searchKey);// перевірка значення у вікні пошуку GoogleAssertJUnit.assertTrue (searchText.getAttribute ("значення"). EqualsIgnoreCase (searchKey));}}

Інструкції щодо запуску сценарію, виберіть файл XML і запустіть як Test NG Suite

Клацніть правою кнопкою миші файл .xml -> Запустити як -> Testng Suite (Примітка: Suite)

Тепер параметри можна визначити на 2 рівнях

  1. Рівень набору - Параметри всередині тегу файлу TestNG XML будуть параметрами рівня набору.
  2. Тестовий рівень - Параметри всередині тегу тестуючого XML-файлу будуть параметром Тестового рівня.

Ось той самий тест з параметрами рівня набору

ПРИМІТКА. У випадку, якщо назва параметра однакова на рівні набору та рівні тесту, тоді параметр рівня тесту отримає перевагу над рівнем набору. Отже, у цьому випадку всі класи всередині цього тестового рівня матимуть спільний перевизначений параметр, а інші класи, які перебувають поза тестовим рівнем, мають спільний параметр рівня набору.

Вирішення проблем

Проблема №1 Значення параметра в testng.xml неможливо ввести до типу відповідного параметра методу тестування, це призведе до помилки.

Розглянемо наступний приклад

Тут атрибут 'author' дорівнює 'Guru99', який є рядком, і у відповідному методі тестування він очікує цілочисельного значення, тому ми отримаємо тут виняток.

Випуск №2 Ваші @Parameters не мають відповідного значення в testing.xml.

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

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

Проста відповідь: цього робити не можна! Ви можете мати кілька різних параметрів, але кожен параметр може мати лише одне значення. Це допомагає запобігти жорсткому кодуванню значень у сценарії. Це робить код багаторазовим. Подумайте про це як про конфігураційні файли для вашого сценарію. Якщо ви хочете використовувати кілька параметрів для параметра, використовуйте DataProviders

Постачальник даних у TestNG

Постачальник даних у TestNG - це метод, який використовується, коли користувачеві потрібно передавати складні параметри. Складні параметри потрібно створювати з Java, такі як складні об'єкти, об'єкти з файлів властивостей або з бази даних, які можна передавати методом постачальника даних. Метод коментується @DataProvider, і він повертає масив об'єктів.

Параметри за допомогою Dataprovider

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

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

Ця концепція, керована даними, досягається за допомогою анотації @DataProvider у TestNG.

Він має лише один атрибут 'name' . Якщо ви не вказали атрибут name, ім'я DataProvider буде таким самим, як ім'я відповідного методу.

Постачальник даних повертає двовимірний об'єкт JAVA до методу тестування, і метод тесту викличе M раз у масиві об'єктів типу M * N. Наприклад, якщо DataProvider повертає масив із 2 * 3 об'єктів, відповідний тестовий файл буде викликаний 2 рази з 3 параметрами кожного разу.

Повний приклад

параметри пакета;імпортувати java.util.concurrent.TimeUnit;імпорт org.openqa.selenium.By;імпорт org.openqa.selenium.WebDriver;імпорт org.openqa.selenium.WebElement;імпорт org.openqa.selenium.firefox.FirefoxDriver;імпорт org.testng.Assert;імпорт org.testng.annotations.BeforeTest;імпорт org.testng.annotations.DataProvider;імпорт org.testng.annotations.Test;відкритий клас ParameterByDataprovider {Драйвер WebDriver;Рядок driverPath = "C: \\ geckodriver.exe";@BeforeTestpublic void setup () {// Створення об'єкта драйвера firefoxSystem.setProperty ("webdriver.gecko.driver", driverPath);драйвер = новий FirefoxDriver ();driver.manage (). timeouts (). неявноWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}/ ** Тестовий приклад для перевірки вікна пошуку Google* @param автор* @param searchKey* @throws InterruptedException* /@Test (dataProvider = "SearchProvider")public void testMethod (Автор рядка, String searchKey) викидає InterruptedException {{WebElement searchText = driver.findElement (By.name ("q"));// значення пошуку у вікні пошуку GooglesearchText.sendKeys (searchKey);System.out.println ("Ласкаво просимо ->" + автор + "Ваша клавіша пошуку ->" + ключ пошуку);Нитка.спання (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

параметри пакета;імпортувати java.util.concurrent.TimeUnit;імпорт org.openqa.selenium.By;імпорт org.openqa.selenium.WebDriver;імпорт org.openqa.selenium.WebElement;імпорт org.openqa.selenium.firefox.FirefoxDriver;імпорт org.testng.Assert;імпорт org.testng.annotations.BeforeTest;імпорт org.testng.annotations.Test;відкритий клас ParameterDataproviderWithClassLevel {Драйвер WebDriver;Рядок driverPath = "C: \\ geckodriver.exe";@BeforeTestpublic void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);драйвер = новий FirefoxDriver ();driver.manage (). timeouts (). неявноWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider", dataProviderClass = DataproviderClass.class)public void testMethod (Автор рядка, String searchKey) викидає InterruptedException {WebElement searchText = driver.findElement (By.name ("q"));// Шукати текст у текстовому полі GooglesearchText.sendKeys (searchKey);System.out.println ("Ласкаво просимо ->" + автор + "Ваша клавіша пошуку ->" + ключ пошуку);Нитка.спання (3000);// отримати текст із вікна пошукуРядок testValue = searchText.getAttribute ("значення");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// перевіряємо, чи вікно пошуку має правильне значенняAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}

DataproviderClass.java

параметри пакета;імпорт org.testng.annotations.DataProvider;відкритий клас DataproviderClass {@DataProvider (name = "SearchProvider")відкритий статичний об’єкт [] [] getDataFromDataprovider () {повернути новий об'єкт [] [] {{"Guru99", "Індія"},{"Крішна", "Великобританія"},{"Бупеш", "США"}};}}

Типи параметрів у Dataprovider

Існує два типи параметрів, що підтримуються методом DataProvider.

Метод - Якщо трактор SAME DataProvider повинен вести себе по- різному з різними методу тестування, використовуйте параметр методу.

У наступному прикладі

  • Ми перевіряємо, чи ім'я методу - testMethodA.
  • Якщо так, поверніть один набір значень
  • В іншому випадку повертають інший набір значень
параметри пакета;імпортувати java.lang.reflect.Method;імпортувати java.util.concurrent.TimeUnit;імпорт org.openqa.selenium.By;імпорт org.openqa.selenium.WebDriver;імпорт org.openqa.selenium.WebElement;імпорт org.openqa.selenium.firefox.FirefoxDriver;імпорт org.testng.Assert;імпорт org.testng.annotations.BeforeTest;імпорт org.testng.annotations.DataProvider;імпорт org.testng.annotations.Test;відкритий клас ParameterByMethodInDataprovider {Драйвер WebDriver;Рядок driverPath = "C: \\ geckodriver.exe";@BeforeTestpublic void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);драйвер = новий FirefoxDriver ();driver.manage (). timeouts (). неявноWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider")public void testMethodA (автор рядка, рядок searchKey) викидає InterruptedException {WebElement searchText = driver.findElement (By.name ("q"));// Пошук тексту у вікні пошукуsearchText.sendKeys (searchKey);// Роздрукувати автора та рядок пошукуSystem.out.println ("Ласкаво просимо ->" + автор + "Ваша клавіша пошуку ->" + ключ пошуку);Нитка.спання (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 ("Ласкаво просимо -> Невідомий користувач Ваш ключ пошуку ->" + ключ пошуку);Нитка.спання (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")) {повернути новий об'єкт [] [] {{"Guru99", "Індія"},{"Крішна", "Великобританія"},{"Бупеш", "США"}};}ще {повернути новий об'єкт [] [] {{"Канада"},{"Росія"},{"Японія"}};}}}

Ось результат

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

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

У наступному прикладі коду

  • У нас є 2 групи A & B
  • Кожен метод тестування присвоюється групі
  • Якщо значенням групи є A, повертається певний набір даних
  • Якщо значення групи B, повертається інший набір даних
параметри пакета;імпортувати java.util.concurrent.TimeUnit;імпорт org.openqa.selenium.By;імпорт org.openqa.selenium.WebDriver;імпорт org.openqa.selenium.WebElement;імпорт org.openqa.selenium.firefox.FirefoxDriver;імпорт org.testng.Assert;імпорт org.testng.ITestContext;імпорт org.testng.annotations.BeforeTest;імпорт org.testng.annotations.DataProvider;імпорт org.testng.annotations.Test;відкритий клас ParameterByITestContextInDataprovider {Драйвер WebDriver;Рядок driverPath = "C: \\ geckodriver.exe";@BeforeTest (групи = {"A", "B"})public void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);драйвер = новий FirefoxDriver ();driver.manage (). timeouts (). неявноWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider", groups = "A")public void testMethodA (автор рядка, рядок searchKey) викидає InterruptedException {{// пошук в текстовому полі GoogleWebElement searchText = driver.findElement (By.name ("q"));// пошук значення за нимsearchText.sendKeys (searchKey);System.out.println ("Ласкаво просимо ->" + автор + "Ваша клавіша пошуку ->" + ключ пошуку);Нитка.спання (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 ("Ласкаво просимо -> Невідомий користувач Ваш ключ пошуку ->" + ключ пошуку);Нитка.спання (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;для (Група рядків: c.getIncludedGroups ()) {if (group.equalsIgnoreCase ("A")) {groupArray = новий об'єкт [] [] {{"Guru99", "Індія"},{"Крішна", "Великобританія"},{"Бупеш", "США"}};перерва;}інакше якщо (group.equalsIgnoreCase ("B")){groupArray = новий об'єкт [] [] {{"Канада"},{"Росія"},{"Японія"}};}перерва;}повернути groupArray;}}

Примітка. Якщо ви безпосередньо запустили клас testng, він спочатку викличе постачальника даних, який не може отримати інформацію про групи, оскільки групи недоступні. Але замість цього, якщо ви викликаєте цей клас за допомогою testng.xml, він буде мати інформацію про групи, доступну за допомогою ITestContext. Використовуйте наступний XML для виклику тесту

<групи><класи><класname = "parameters.ParameterByITestContextInDataprovider" /><групи><класи><класname = "parameters.ParameterByITestContextInDataprovider" />

Короткий зміст :

  • Параметризація потрібна для створення Тестування на основі даних .
  • TestNG підтримує два типи параметризації, використовуючи @ Parameter + TestNG.xml і використовуючи @DataProvider
  • У @ Parameter + TestNG.xml параметри можуть бути розміщені на рівні набору та рівні тесту. Якщо

    В обох місцях оголошено одне і те ж ім'я параметра; параметр рівня тесту отримає перевагу над параметром рівня костюма.

  • за допомогою @ Parameter + TestNG.xml одночасно можна встановити лише одне значення, але @DataProvider повертає 2d-масив Object .
  • Якщо DataProvider присутній в іншому класі, то клас, в якому знаходиться метод тестування, DataProvider повинен бути статичним методом .
  • Існує два параметри, що підтримуються DataProvider - це метод і ITestContext.