Докато създаваме софтуер, ние винаги искаме той да работи по различен начин с различен набор от данни. Когато става въпрос за тестване на същия софтуер, не можем да бъдем несправедливи да го тестваме само с един набор от данни. Тук отново трябва да проверим дали нашата система приема целия набор от комбинации, които се очаква да поддържа. За това трябва да параметризираме нашите тестови научни изследвания. Тук идва Параметризиране на снимката.
Параметризиране в селен
Параметризацията в Selenium е процес за параметризиране на тестовите скриптове с цел предаване на множество данни на приложението по време на изпълнение. Това е стратегия на изпълнение, която автоматично изпълнява тестови случаи няколко пъти, използвайки различни стойности. Концепцията, постигната чрез параметризиране на тестовите скриптове, се нарича Data Driven Testing .
В този урок ще научите -
- Тип параметризация в TestNG-
- Анотация на параметри с Testng.xml
- Отстраняване на неизправности
- Параметри, използващи Dataprovider
- Извикайте DataProvider от различен клас
- Видове параметри в Dataprovider
Тип параметризация в TestNG-
За да направим параметризацията по-ясна, ще преминем през опциите за параметризация в една от най-популярните рамки за Selenium Webdriver - TestNG .
Има два начина, по които можем да постигнем параметризиране в TestNG
- С помощта на Параметри анотация и TestNG XML файл.
- С помощта на анотация на 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;import 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 {String driverPath = "C: \\ geckodriver.exe";Драйвер за WebDriver;@Тестpublic void testNoParameter () хвърля InterruptedException {Автор на низа = "guru99";String searchKey = "india";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 ("Добре дошли ->" + автор + "Вашият ключ за търсене е ->" + ключ за търсене);System.out.println („Нишката ще заспи сега“);Thread.sleep (3000);System.out.println ("Стойност в полето за търсене на Google =" + searchText.getAttribute ("стойност") + "::: Стойност, дадена от input =" + searchKey);// проверка на стойността в полето за търсене в googleAssertJUnit.assertTrue (searchText.getAttribute ("стойност"). EqualsIgnoreCase (searchKey));}}
Проучване, горният пример. Само си представете колко сложен ще стане кодът, когато направим това за 3 входни комбинации
Сега, нека параметризираме това с помощта на TestNG
За да направите това, ще трябва
- Създайте XML файл, който ще съхранява параметрите
- В теста добавете анотация @Parameters
Ето пълния код
Тестово ниво TestNG.xml
xml version = "1.0" encoding = "UTF-8"?><параметър име = "автор" стойност = "Guru99" /><параметър име = "searchKey" стойност = "Индия" /> <име на параметър = "searchKey" value = "UK" /><класове>
Файл ParameterWithTestNGXML.java
параметри на пакета;import 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. Незадължително;внос org.testng.annotations.Parameters;внос org.testng.annotations.Test;публичен клас ParameterWithTestNGXML {String driverPath = "C: \\ geckodriver.exe";Драйвер за WebDriver;@Тест@Parameters ({"author", "searchKey"})public void testParameterWithXML (@Optional ("Abc") Автор на низа, 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 ("Добре дошли ->" + автор + "Вашият ключ за търсене е ->" + ключ за търсене);System.out.println („Нишката ще заспи сега“);Thread.sleep (3000);System.out.println ("Стойност в полето за търсене на Google =" + searchText.getAttribute ("стойност") + "::: Стойност, дадена от input =" + searchKey);// проверка на стойността в полето за търсене в googleAssertJUnit.assertTrue (searchText.getAttribute ("стойност"). EqualsIgnoreCase (searchKey));}}
Инструкции за стартиране на скрипта, изберете XML файла и стартирайте като Test NG Suite
Щракнете с десния бутон върху .xml файл -> Изпълни като -> Testng Suite (Забележка: Suite)
Сега параметрите могат да бъдат дефинирани на 2 нива
- Ниво на пакета - Параметрите в етикета
на XML файла TestNG ще бъдат параметър на ниво пакет. - Тестово ниво - параметрите в тега
на тестващия XML файл ще бъдат параметър на тестово ниво.
Ето същия тест с параметри на ниво пакет
ЗАБЕЛЕЖКА: В случай, че ако името на параметъра е едно и също на ниво пакет и ниво на изпитване, тогава параметърът на ниво тест ще получи предпочитание пред нивото на пакета. Така че, в този случай всички класове вътре в това ниво на теста ще споделят заменения параметър, а други класове, които са извън тестовото ниво, ще споделят параметъра на ниво пакет.
Отстраняване на неизправности
Проблем №1 Стойността на параметъра в testng.xml не може да бъде преобразувана в съответния параметър на съответния метод на тестване, това ще доведе до грешка.
Помислете за следния пример
Тук атрибутът 'author' е равен на 'Guru99', който е низ и в съответния тестов метод очаква цяло число, така че тук ще получим изключение.
Проблем # 2 Вашите @Parameters нямат съответната стойност в testing.xml.
Можете да разрешите тази ситуация, като добавите @optional анотация в съответния параметър в тестовия метод.
Проблем # 3: Искате да тествате множество стойности на един и същ параметър с помощта на Testng.xml
Простият отговор е, че това не може да се направи! Можете да имате множество различни параметри, но всеки параметър може да има само една стойност. Това помага за предотвратяване на стойности на твърдо кодиране в скрипта. Това прави кода за многократна употреба. Помислете за това като конфигурационни файлове за вашия скрипт. Ако искате да използвате множество стойности за параметър, използвайте DataProviders
Доставчик на данни в TestNG
Доставчикът на данни в TestNG е метод, използван, когато потребителят трябва да предаде сложни параметри. Комплексните параметри трябва да бъдат създадени от Java, като например сложни обекти, обекти от файлове със свойства или от база данни могат да се предават по метода на доставчика на данни. Методът се коментира от @DataProvider и връща масив от обекти.
Параметри, използващи Dataprovider
Анотирането на @Parameters е лесно, но за да тестваме с множество набори от данни трябва да използваме доставчика на данни.
За да попълним хиляди уеб формуляри, използвайки нашата тестова рамка, се нуждаем от различна методология, която може да ни даде много голям набор от данни в един поток на изпълнение.
Тази концепция, управлявана от данни, се постига чрез анотирането @DataProvider в TestNG.
Той има само един атрибут „име“ . Ако не посочите атрибута 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;import org.testng.Assert;внос org.testng.annotations.BeforeTest;импортиране на org.testng.annotations.DataProvider;внос org.testng.annotations.Test;публичен клас ParameterByDataprovider {Драйвер за WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTestпублична настройка за невалидни () {// Създаване на обект на драйвер на firefoxSystem.setProperty ("webdriver.gecko.driver", driverPath);драйвер = нов FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}/ ** Тест за проверка на полето за търсене в Google* @param автор* @param searchKey* @throws InterruptException* /@Test (dataProvider = "SearchProvider")public void testMethod (Автор на низа, String searchKey) хвърля InterruptedException {{WebElement searchText = driver.findElement (By.name ("q"));// стойност за търсене в полето за търсене на googlesearchText.sendKeys (searchKey);System.out.println ("Добре дошли ->" + автор + "Вашият ключ за търсене е ->" + ключ за търсене);Thread.sleep (3000);Низ testValue = searchText.getAttribute ("стойност");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Проверете дали стойността в полето за търсене на Google е правилнаAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** @return Object [] [], където първата колона съдържа „автор“* и втората колона съдържа 'searchKey'* /@DataProvider (name = "SearchProvider")публичен обект [] [] 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;import org.testng.Assert;внос org.testng.annotations.BeforeTest;внос org.testng.annotations.Test;публичен клас ParameterDataproviderWithClassLevel {Драйвер за WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTestпублична настройка за невалидни () {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 searchKey) хвърля InterruptedException {WebElement searchText = driver.findElement (By.name ("q"));// Търсене на текст в текстовото поле на GooglesearchText.sendKeys (searchKey);System.out.println ("Добре дошли ->" + автор + "Вашият ключ за търсене е ->" + ключ за търсене);Thread.sleep (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 трябва да се държи по различен начин с различен метод за тестване, използвайте параметъра Method.
В следващия пример,
- Проверяваме дали името на метода е 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;import org.testng.Assert;внос org.testng.annotations.BeforeTest;импортиране на org.testng.annotations.DataProvider;внос org.testng.annotations.Test;публичен клас ParameterByMethodInDataprovider {Драйвер за WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTestпублична настройка за невалидни () {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 ("Добре дошли ->" + автор + "Вашият ключ за търсене е ->" + ключ за търсене);Thread.sleep (3000);Низ testValue = searchText.getAttribute ("стойност");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Проверяваме дали текстовото поле на Google показва правилна стойностAssert.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 ();// Проверяваме дали текстовото поле на Google показва правилна стойностAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** Тук DataProvider връща стойност въз основа на името на метода на теста* @param m* @ завръщане** /@DataProvider (name = "SearchProvider")публичен обект [] [] 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;import org.testng.Assert;внос org.testng.ITestContext;внос org.testng.annotations.BeforeTest;импортиране на org.testng.annotations.DataProvider;внос org.testng.annotations.Test;публичен клас ParameterByITestContextInDataprovider {Драйвер за WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTest (групи = {"A", "B"})публична настройка за невалидни () {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 ("Добре дошли ->" + автор + "Вашият ключ за търсене е ->" + ключ за търсене);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 {{// намиране на Google поле за търсене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 ();// проверяваме правилната стойност в полето за търсенеAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** Тук DAtaProvider ще предостави обект масив на базата на ITestContext* @param c* @ завръщане* /@DataProvider (name = "SearchProvider")публичен обект [] [] 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" /><групи> <включва име = "B" /> <класове><класname = "parameters.ParameterByITestContextInDataprovider" />
Резюме :
- Необходима е параметризация, за да се създаде тестване на данни .
- TestNG поддържа два вида параметризация, като използва @ Parameter + TestNG.xml и използва @DataProvider
- В @ Parameter + TestNG.xml параметрите могат да бъдат поставени на ниво пакет и ниво на тест. Ако
И на едно и също място е декларирано едно и също име на параметър; параметърът за ниво на теста ще получи предпочитание пред параметъра за ниво на костюма.
- с помощта на @ Parameter + TestNG.xml може да се зададе само една стойност наведнъж, но @DataProvider връща 2d масив на Object .
- Ако DataProvider присъства в различния клас, тогава класът, в който се намира тестовият метод, DataProvider трябва да бъде статичен метод .
- Има два параметъра, поддържани от DataProvider са Method и ITestContext.