Автоматизация тестирования, или автоматизированное тестирование, как его называют в народе, не так проста, как кажется. Необходимо учитывать все перестановки и комбинации всех возможных взаимодействий с пользователем, и на основе этого вам придется создать тестовый скрипт для проверки вашего веб-приложения в различных браузерах + комбинации ОС. Именно здесь параметризация играет ключевую роль в тестировании Selenium automation. В этом руководстве по тестированию я покажу вам, как выполнить параметризацию при тестировании для Selenium automation testing.
Почему Мы Параметризуем?
В реальном мире при тестировании веб-интерфейса мы ожидаем, что наш веб-сайт или веб-приложение будут корректно работать с различными входными данными, и практически невозможно проверить наши сценарии с помощью всего лишь одного набора данных. Таким образом, мы гарантируем, что наше приложение функционирует должным образом, когда оно подвергается воздействию различных наборов данных или различных комбинаций для браузеров и ОС. Несколько комбинаций тестов означают несколько входных значений.
Теперь вы не можете каждый раз жестко кодировать тестовые значения в своих сценариях автоматизации тестирования, в противном случае для внесения одного изменения потребуется отредактировать множество сценариев автоматизации тестирования. Вот где на первый план выходит параметризация при тестировании или любом другом, и причина, по которой мы параметризуем наши сценарии тестирования Selenium automation, заключается в предоставлении различных наборов данных нашему веб-приложению во время выполнения.
Как Мы Выполняем Параметризацию? И Зачем Использовать Тестирование?
Если ваше приложение предполагает ввод различных типов пользовательских взаимодействий, то лучше всего использовать параметризацию. Мы можем параметризовать наши сценарии автоматизации в соответствии с используемой платформой, например, Параметризация в Testing framework для тестирования Selenium automation. Мы можем рассмотреть возможность использования файлов excel для выборки наборов данных и последующего использования их в наших сценариях автоматизации, но по мере совершенствования нашего пакета автоматизации возникает необходимость в использовании более надежных платформ автоматизации тестирования, таких как TestNG, для более эффективного охвата широкой категории тестов. В этом посте мы сосредоточимся главным образом на параметризации при тестировании, на том, какими способами это может быть достигнуто при тестировании и как мы записываем эти параметры в наши сценарии тестирования Selenium automation. Давайте сначала начнем с понимания различных типов параметризации в тестировании и того, как мы можем добиться того же самого.
Типы параметризации при тестировании
Таким образом, в первую очередь мы можем добиться параметризации при тестировании двумя способами.
- Используя “Аннотацию параметров” и XML-файл TestNG.
- Используя “аннотацию dataProvider”.
Параметризация При тестировании С использованием аннотации @Parameters и XML-файла
Давайте сначала посмотрим на простой синтаксис написания аннотации параметра в нашем классе: @Parameter({"имя параметра"})
Обратите внимание, что мы также можем использовать более одного параметра в нашей аннотации, которая может быть записана следующим образом: @Parameters({"param1","param2","param3"})
На данный момент область действия параметров ограничена только тегом Suite или Test в testng.xml файл. Если одно и то же значение параметра передается как в наборе, так и в тесте, приоритет отдается значению параметра, переданному в теге Test.
Прежде чем мы перейдем к примерам параметризации, нам нужно понять, какую пользу принесет использование параметризации в TestNG для наших действий по тестированию Selenium automation. Рассмотрим сценарий поиска определенных ключевых слов в такой поисковой системе, как Google. Нам пришлось бы писать одни и те же строки кода для каждого ключевого слова, чтобы получить разные результаты, а это неосуществимый подход. Именно здесь на первый план выходит параметризация в тестировании или любой другой среде автоматизации тестирования для Selenium. Используя параметризацию в тестировании, вы можете передать эти ключевые слова в качестве различных параметров в testng.xml и добавить @parameters аннотация в пакете тестирования Selenium automation. Давайте посмотрим на это на примере.
Сценарий: Открыть google.com в вашем браузере и выполните поиск по 3 ключевым словам отдельно
Чтобы завершить этот сценарий, вот подробные шаги, которые должен выполнить наш сценарий:
- Запустите браузер и откройте www.google.com
- Добавьте первое ключевое слово в качестве ввода в поле поиска и нажмите поиск.
- Убедитесь, что входное значение в пользовательском интерфейсе совпадает с данными теста.
- Повторите описанные выше два шага для других 2 ключевых слов.
Приведенный ниже код показывает, как мы можем сделать это без параметризации при тестировании.
package parameterization;
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.Test;
public class WithoutParameter {
WebDriver driver;
@Test
public void noParam(){
//Declaring our first keyword
String keyWord="Selenium";
//Initializing Driver
System.setProperty("webdriver.gecko.driver", "C:\\geckodriver.exe");
driver = new FirefoxDriver();
driver.manage().timeouts().pageLoadTimeout(20, TimeUnit.SECONDS);
//Opening search engine
driver.get("https://google.com");
//Finding search text box
WebElement searchBox = driver.findElement(By.name("q"));
//Sending keyword value
searchBox.sendKeys(keyWord);
System.out.println("The search keyword entered is : " +keyWord);
//Verifying the keyword on UI
Assert.assertTrue(searchBox.getAttribute("value").equalsIgnoreCase(keyWord));
driver.quit();
}
}
Чтобы передать остальные 2 ключевых слова, нам придется снова написать тот же фрагмент кода с разными значениями ключевых слов для строки ‘ keyWord ‘, что привело бы к длинному и повторяющемуся коду. И в будущем, если вам придется тестировать больше значений ключевых слов, вам придется писать больше тестов.
Давайте теперь упростим нашу проблему, обойдя эти ключевые слова в качестве параметров в вашем testng.xml и добавление аннотации @parameters в наш тест.
Java-код:
package parameterization;
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.Parameters;
import org.testng.annotations.Test;
public class ParameterizedClass {
WebDriver driver;
@Parameters("keyWord")
@Test
public void Parameterpassing(String keyWord){
//Initializing Driver
//Mention the path to your local webdriver
System.setProperty("webdriver.chrome.driver", "D:\\LocalDriver\\chromedriver.exe");
driver = new ChromeDriver();
driver.manage().timeouts().pageLoadTimeout(20, TimeUnit.SECONDS);
//Opening search engine
driver.get("https://google.com");
//Finding search text box
WebElement searchBox = driver.findElement(By.name("q"));
//Sending keyword value
searchBox.sendKeys(keyWord);
System.out.println("The search keyword entered is : " +keyWord);
//Verifying the keyword on UI
Assert.assertTrue(searchBox.getAttribute("value").equalsIgnoreCase(keyWord));
driver.quit();
}
}
Здесь находится TestNG.xml это будет использоваться для выполнения параметризации при тестировании для тестирования Selenium automation.
Теперь вы можете запустить этот тест, чтобы проверить, передается ли значение нашего параметра нашему методу тестирования и, следовательно, получены желаемые результаты. Вы можете запустить это, выполнив следующие действия:
Шаг 1: Щелкните правой кнопкой мыши на testng.xml файл в проводнике проекта и нажмите кнопку Выполнить как:
Шаг 2: Выберите Запуск от имени TestNG Suite, и вы сможете просмотреть доступный по электронной почте отчет или сводку для просмотра результатов.
Поэтому в следующий раз, когда нам придется запускать один и тот же тест для другого значения теста, вместо того, чтобы копировать и вставлять один и тот же фрагмент кода в несколько файлов, нам просто нужно отредактировать xml-файл, включить дополнительные значения и запустить пакет. Это оно. Вот насколько эффективным и экономящим время может стать ваше тестирование Selenium automation за счет использования параметризации в TestNG.
Была бы Параметризация В Тестировании Помогите Нам С Автоматическим Тестированием Браузера?
К настоящему времени в этом руководстве по тестированию параметризации вы, возможно, осознали важность параметров на примере, описанном в предыдущем разделе. Теперь вы, возможно, уже думаете о том, как включить параметризацию в сценарии тестирования для автоматического тестирования браузера. Позвольте мне помочь вам начать с очень распространенного сценария, когда нам нужно выполнить наши тесты в нескольких браузерах, давайте посмотрим, как мы можем использовать параметры для выполнения автоматического тестирования браузера.
Сценарий: Печать определенного значения браузера путем передачи имени браузера в качестве параметра.
Java-код:
package parameterization;
import org.testng.annotations.Test;
import org.testng.annotations.Parameters;
public class ParameterPass {
@Parameters("browser")
@Test
public void test1(String browser) {
if(browser.equalsIgnoreCase("FF"))
{
System.out.println("The browser value is : " +browser);
}else if(browser.equalsIgnoreCase("Chrome"))
{
System.out.println("The browser value is : " +browser);
}else if(browser.equalsIgnoreCase("IE"))
{
System.out.println("The browser value is : " +browser);
}
else
{
System.out.println("Incorrect browser value passed.");
}
}
}
Testng.xml:
При запуске вышеупомянутого testng xml вы увидите приведенный ниже вывод в консоли:
Если вы перейдете к подробным результатам, вы увидите, что значения параметров, переданные в XML, также печатаются в сводке результатов тестирования:
Отчет, доступный по электронной почте, показывает различные параметры, переданные различным тестам, что облегчает консолидацию результатов:
Давайте теперь попробуем передать 2 параметра в наш тест, чтобы понять, как мы можем использовать комбинации параметров для тестирования Selenium automation. Обратите внимание, что независимо от количества параметров, которые вы передаете в свой тест, вам необходимо принять такое же количество параметров в вашем методе тестирования, что и в правильной последовательности.
Обратите внимание, что независимо от количества параметров, которые вы передаете в свой тест, вам необходимо принять такое же количество параметров в вашем методе тестирования, что и в правильной последовательности. Сценарий: Печать определенного значения браузера и URL-адреса в обход имени браузера, а также URL-адреса в качестве параметра.
параметризация пакета; импорт org.testng.annotations. Параметры; импорт org.testng.аннотации. Тест; параметр общедоступного класса pass_multiple {
@Parameters({"url","browser"})
@Test
public void test1(String url,String browser)
{
if(browser.equalsIgnoreCase("FF"))
{
System.out.println("The browser value is : " +browser);
}
else if(browser.equalsIgnoreCase("Chrome"))
{
System.out.println("The browser value is : " +browser);
}
else if(browser.equalsIgnoreCase("IE"))
{
System.out.println("The browser value is : " +browser);
}
else
{
System.out.println("Incorrect browser value passed.");
}
} }
Теперь при запуске приведенного выше XML ниже генерируется вывод, который печатает оба переданных параметра:
Отчет по электронной почте:
Параметризация При Тестировании Для Онлайн-Сетки Selenium
Параметризация – это аккуратный способ самостоятельно создать аккуратную платформу тестирования, управляемую тестированием, с помощью TestNG. Вам решать, как вы хотите использовать различные типы параметризации при тестировании или даже оба одновременно, если этого требует вариант использования.
Следующий вопрос, на который нужно ответить, будет заключаться в том, работает ли параметризация при тестировании с онлайн-сеткой Selenium из более чем 2000 реальных браузеров, предлагаемых LambdaTest?
Да, это так! Фактически, параметризация в тестировании или любой другой среде рассматривается как один из лучших способов параллельного выполнения тестов в нескольких разных тестовых средах, особенно если вам приходится регулярно менять тестовые среды для тестирования.
Например, давайте рассмотрим сценарий, в котором у вас есть тест, который вы хотите запустить в нескольких тестовых средах, чтобы убедиться, что веб-страница совместима с несколькими браузерами. Это типичный пример автоматического кроссбраузерного тестирования, которое в настоящее время является основным требованием практически для каждой организации, создающей какой-либо бизнес через Интернет.
Чтобы запустить тест в Lambda Test Selenium Grid, вам необходимо определить желаемый объект возможностей, который сообщает нашей онлайн-сетке Selenium о том, в каких средах вам нужно запустить свой тест. Чтобы достичь этого, вы можете параметризовать значения для желаемого объекта возможностей. Например, рассмотрим следующий код. Это простой скрипт, который открывает список задач и выполняет некоторые действия. Этот же сценарий выполняется в нескольких средах путем параметризации значений среды желаемых возможностей в XML-файле.
package com.lambdatest;
import java.net.MalformedURLException;
import java.net.URL;
import org.openqa.selenium.By;
//import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.Assert;
//import org.testng.annotations.AfterSuite;
import org.testng.annotations.Parameters;
import org.testng.annotations.AfterTest;
//import org.testng.annotations.BeforeSuite;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
public class TestNGTodo4 {
private RemoteWebDriver driver;
private String Status="failed";
@BeforeTest
@Parameters({ "os", "browser", "version", "build" })
public void setup( String os, String browser, String version, String build) throws MalformedURLException {
String username = "mudits";
String authkey = "kIVQzcwYkSMgZFWoSMxQjcR3ASJo2BIOUQ97GmTwdnPEOFEO2b";
String hub = "@hub.lambdatest.com/wd/hub";
DesiredCapabilities caps = new DesiredCapabilities();
caps.setCapability("platform", os);
caps.setCapability("browserName", browser);
caps.setCapability("version", version);
caps.setCapability("build", build);
caps.setCapability("name", "TestNG-Todo-Script-4");
caps.setCapability("network", true);
caps.setCapability("visual", true);
caps.setCapability("video", true);
caps.setCapability("console", true);
driver = new RemoteWebDriver(new URL("https://" + username + ":" + authkey + hub), caps);
}
@Test
public void basicTest() throws InterruptedException {
String spanText;
System.out.println("Loading Url");
driver.get("https://4dvanceboy.github.io/lambdatest/todo.html");
System.out.println("Checking Box");
driver.findElement(By.name("todo-1")).click();
System.out.println("Checking Another Box");
driver.findElement(By.name("todo-2")).click();
System.out.println("Checking Box");
driver.findElement(By.name("todo-3")).click();
System.out.println("Checking Another Box");
driver.findElement(By.name("todo-4")).click();
driver.findElement(By.id("todotext")).sendKeys(" List Item 6");
driver.findElement(By.id("addbutton")).click();
driver.findElement(By.id("todotext")).sendKeys(" List Item 7");
driver.findElement(By.id("addbutton")).click();
driver.findElement(By.id("todotext")).sendKeys(" List Item 8");
driver.findElement(By.id("addbutton")).click();
System.out.println("Entering Text");
driver.findElement(By.id("todotext")).sendKeys("Get Taste of Lambda and Stick to It");
driver.findElement(By.id("addbutton")).click();
System.out.println("Checking Another Box");
driver.findElement(By.name("todo-9")).click();
// Let's also assert that the todo we added is present in the list.
spanText = driver.findElementByXPath("/html/body/div/div/div/ul/li[9]/span").getText();
Assert.assertEquals("Get Taste of Lambda and Stick to It", spanText);
Status="passed";
//Thread.sleep(150);
System.out.println("TestFinished");
}
@AfterTest
public void tearDown() {
driver.executeScript("lambda-status=" + Status);
System.out.println(this.getClass().getName());
driver.quit();
}
}
Here's the Corresponding XML file
Вы заметили, как я использовал количество потоков и параллельное значение в теге Suite для тестирования Selenium automation?
Этот приведенный выше сценарий будет запускать один и тот же тестовый класс в 3 разных средах, и самое приятное, что они будут выполняться параллельно. Это означает, что все три теста будут выполняться одновременно, что сократит время выполнения вашего теста в несколько раз. Спасибо Selenium Grid за то, что он позволил нам использовать параллельное тестирование с Selenium .
Вещи, которые следует учитывать
После посещения этого руководства по тестированию вы, должно быть, чувствуете себя уверенно и, возможно, немного взволнованы использованием параметров в вашем следующем проекте для тестирования Selenium automation, но придержите коней на некоторое время. Есть несколько моментов, о которых необходимо позаботиться при использовании аннотации @Parameters.
⟶ Если вы попытаетесь ввести значение параметра в testng.xml для соответствующего параметра метода тестирования будет выдана ошибка. Например, если вы задали параметр метода как целое число , но передаете значение String в TestNG.xml , вы получите исключение, как показано ниже:
Testng.xml:
⟶ Использование @Необязательной аннотации
Если параметр, который мы определили в нашем методе, отсутствует в testng.xml затем возникнет исключение testNGexception, и наш тест будет пропущен. Чтобы преодолеть эту ситуацию, мы можем использовать аннотацию @Optional. Давайте сначала взглянем на синтаксис для этого:
@Parameter("browser")
@Test
public void paramCheck(@Optional("OptionalParameter") String val) { …. }
Давайте разберемся в этом подробнее на примере этого руководства по тестированию.
Java-код:
package parameterization;
import org.testng.annotations.Optional;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
public class optionalParameter {
@Parameters("Param One")
@Test
public void testOptionOne(String firstParam){
System.out.println("The first parameter is : " +firstParam);
}
@Parameters("Param Two")
@Test
public void testOptionTwo(@Optional("OptionalParameter")String secondParam){
System.out.println("The second parameter is : " +secondParam);
}
}
Testng.xml:
При выполнении вышеуказанного testng.xml , мы получим простые результаты, в которых будут отображаться первый и второй параметр, поскольку оба они были явно объявлены в XML. То же самое показано на приведенных ниже выходных изображениях.
Давайте теперь прокомментируем второй параметр из xml и посмотрим, как работает аннотация @Optional:
Новый testng.xml:
При запуске этого нового XML-файла мы видим, что Необязательный параметр в тестировании был объявлен в тестовом методе, который сейчас печатается, и нигде не генерируется исключение:
⟶ Могут быть сценарии , в которых вам необходимо протестировать несколько значений параметра с помощью testng.xml . Аннотация @Parameters не служит этой цели. У нас может быть несколько параметров, но каждый из них может иметь одно значение, что делает наш код многоразовым. Он больше похож на конфигурационный файл для нашего проекта. Для вас, чтобы использовать несколько значений для параметра, поставщики данных приходят на помощь.
В следующем разделе этого руководства по тестированию будет больше рассказано о поставщиках данных и их использовании в тестировании Selenium automation.
Параметризация При Тестировании С Использованием Поставщиков Данных
В приведенном выше разделе мы рассмотрели, как мы можем использовать аннотацию @Parameters в нашем фреймворке для получения различных результатов. Теперь, по мере продвижения, мы столкнемся со случаями, когда нам придется использовать тестовые сценарии для нескольких наборов данных. Нам могут потребоваться огромные наборы данных для использования в одном выполнении. Этот тип тестирования также называется тестированием на основе данных, которое может быть удобно выполнено с помощью аннотации @dataProvider в нашей платформе TestNG.
Давайте теперь сначала рассмотрим синтаксис аннотации @dataProvider.
@DataProvider(name="testData")
Вам нужно отметить два момента, прежде чем мы начнем использовать его для параметризации в тестировании, во-первых, @dataProvider имеет только один атрибут, ‘ name ‘. Во-вторых, это необязательно, и если вы его не укажете, то имя будет таким же, как у соответствующего имени метода. Этот поставщик данных возвращает 2-мерный объект массива.
Давайте попробуем понять это на простом примере, где мы пытаемся передать название памятника и города с помощью поставщика данных. Вы также можете использовать этот пример в качестве основы для входа в Gmail или Facebook, используя другой идентификатор электронной почты и пароли.
Сценарий: Открыть google.com в вашем браузере и выполните поиск по 3 комбинациям ключевых слов отдельно.
Ниже будут приведены шаги для выполнения этого:
- Запустите браузер, чтобы открыть www.google.com
- Выполните поиск по первой комбинации ключевых слов.
- Получите заголовок страницы.
- Повторите описанные выше действия, т.е. 2 и 3 для других 2 ключевых слов.
Java-код:
package dataProvider;
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.DataProvider;
import org.testng.annotations.Test;
public class Data_Provider {
WebDriver driver;
@Test(dataProvider="searchText")
public void paramByDataProvider(String monument,String city) throws InterruptedException {
//Initializing Driver
System.setProperty("webdriver.gecko.driver", "C:\\geckodriver.exe");
driver = new FirefoxDriver();
//Opening search engine
driver.get("https://google.com");
WebElement searchBox=driver.findElement(By.name("q"));
searchBox.sendKeys(monument +" "+city);
System.out.println("You are trying to search " +monument+ " which is in " +city);
WebElement srchBtn = driver.findElement(By.name("btnK"));
srchBtn.submit();
Thread.sleep(3000);
System.out.println("The page title is: " +driver.getTitle());
driver.quit();
}
/*Data Provider which returns Object[][] wherein
* first column has 'monument' and the second one has 'city'
**/
@DataProvider(name="searchText")
public Object[][] getDataProviderData(){
Object[][] searchWords=new Object[3][2];
//Enter data into Object Array
searchWords[0][0]="India Gate";
searchWords[0][1]="Delhi";
searchWords[1][0]="Taj Mahal";
searchWords[1][1]="Agra";
searchWords[2][0]="Char Minar";
searchWords[2][1]="Hyderabad";
return searchWords;
}
}
Чтобы запустить приведенный выше код, мы используем приведенный ниже TestNG.xml и запустите наш тест так же, как мы делали в приведенных выше примерах:
Мы получили бы результат, подобный приведенному ниже, в котором суммируются переданные поставщиками данных и соответствующие результаты:
Отчет, доступный по электронной почте:
В приведенном выше примере мы попробовали использовать поставщиков данных, вызываемых из того же класса. Вы также можете вызвать поставщиков данных из другого класса, просто сделав метод поставщика данных статическим и указав класс поставщика данных в аннотации метода тестирования. Давайте рассмотрим тот же пример, создав другой класс для нашего поставщика данных.
Java-код для класса поставщика данных:
package dataProvider;
import org.testng.annotations.DataProvider;
public class DataProviderClass {
@DataProvider(name="searchText")
public static Object[][] getDataProviderData(){
Object[][] searchWords=new Object[3][2];
//Enter data into Object Array
searchWords[0][0]="India Gate";
searchWords[0][1]="Delhi";
searchWords[1][0]="Taj Mahal";
searchWords[1][1]="Agra";
searchWords[2][0]="Char Minar";
searchWords[2][1]="Hyderabad";
return searchWords;
}
}
Java-код для класса, из которого вызывается Поставщик данных:
package dataProvider;
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.Test;
public class ClassLevelDataProvider {
WebDriver driver;
@Test(dataProvider="searchText",dataProviderClass=DataProviderClass.class)
public void paramByDataProvider(String monument,String city) throws InterruptedException {
//Initializing Driver
System.setProperty("webdriver.gecko.driver", "C:\\geckodriver.exe");
driver = new FirefoxDriver();
//Opening search engine
driver.get("https://google.com");
WebElement searchBox=driver.findElement(By.name("q"));
searchBox.sendKeys(monument +" "+city);
System.out.println("You are trying to search " +monument+ " which is in " +city);
WebElement srchBtn = driver.findElement(By.name("btnK"));
srchBtn.submit();
Thread.sleep(3000);
System.out.println("The page title is: " +driver.getTitle());
driver.quit();
}
}
TestNG.xml чтобы запустить приведенный выше код:
Во время бега вы можете сами убедиться, что мы получаем те же результаты, что и раньше. Чтобы понять немного больше о различных условиях, с которыми мы можем столкнуться при нашей автоматизации, важно понять еще несколько примеров использования аннотации поставщика данных с параметрами, а именно Метод и ITestContext .
Пример 1 – Использование параметра метода при тестировании
Что делать, если мы хотим, чтобы один и тот же поставщик данных работал по-разному для разных методов, например, в случае, когда мы тестируем разные наборы данных для разных методов тестирования, мы будем использовать method parameters в TestNG. Давайте рассмотрим пример, который будет следовать приведенным ниже шагам:
- Проверьте, является ли имя метода внутренним.
- Если это так, то верните один набор значений
- Если нет, то другой набор значений
Java-код:
package dataProvider;
import java.lang.reflect.Method;
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.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class dataProviders {
WebDriver driver;
@BeforeMethod
public void setUp(){
//Initializing Driver
System.setProperty("webdriver.gecko.driver", "C:\\geckodriver.exe");
driver = new FirefoxDriver();
//Opening search engine
driver.get("https://google.com");
}
@AfterMethod
public void tearDown(){
driver.quit();
}
@Test(dataProvider="destinations")
public void domesticMonuments(String monument,String city) throws InterruptedException{
WebElement searchBox=driver.findElement(By.name("q"));
searchBox.sendKeys(monument +" "+city);
System.out.println("You are trying to search " +monument+ " which is in " +city);
WebElement srchBtn = driver.findElement(By.name("btnK"));
srchBtn.submit();
Thread.sleep(3000);
System.out.println("The page title is: " +driver.getTitle());
}
@Test(dataProvider="destinations")
public void intlDestinations(String location) throws InterruptedException{
WebElement searchBox=driver.findElement(By.name("q"));
searchBox.sendKeys(location);
System.out.println("You are trying to search : " +location);
WebElement srchBtn = driver.findElement(By.name("btnK"));
srchBtn.submit();
Thread.sleep(3000);
System.out.println("The page title is: " +driver.getTitle());
}
@DataProvider(name="destinations")
public Object[][] getDataProviderData(Method m){
if(m.getName().equalsIgnoreCase("domesticMonuments")){
return new Object[][]{
{ "India Gate", "Delhi" },
{ "Taj Mahal", "Agra" },
{ "Char Minar", "Hyderabad" }
};
}
else{
return new Object[][]{
{"Paris"},
{"Cairo"},
{"Washington"}
};
}
}
}
Тестирование. XML для выполнения приведенного выше кода:
> http://testng.org/testng-1.0.dtd “>
Результаты при запуске xml будут выглядеть следующим образом, в котором вы сможете увидеть подробную информацию об используемых поставщиках данных.
Пример 2 – Использование параметра ITestContext в TestNG
Предположим, мои методы тестирования назначены разным группам, и мне нужно использовать разные тестовые данные для разных групп. В таком сценарии мы можем использовать параметр ITestContext с аннотацией нашего поставщика данных. Давайте рассмотрим пример того же самого.
Java-код:
package dataProvider;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.ITestContext;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class ITestContext_DP {
WebDriver driver;
@BeforeMethod(groups={"One","Two"})
public void setUp(){
//Initializing Driver
System.setProperty("webdriver.gecko.driver", "C:\\geckodriver.exe");
driver = new FirefoxDriver();
//Opening search engine
driver.get("https://google.com");
}
@AfterMethod(groups={"One","Two"})
public void tearDown(){
driver.quit();
}
@Test(dataProvider="searchKey" , groups="One")
public void testMethodOne(String monument,String city) throws InterruptedException{
WebElement searchBox=driver.findElement(By.name("q"));
searchBox.sendKeys(monument +" "+city);
System.out.println("You are trying to search " +monument+ " which is in " +city);
WebElement srchBtn = driver.findElement(By.name("btnK"));
srchBtn.submit();
Thread.sleep(3000);
System.out.println("The page title is: " +driver.getTitle());
}
@Test(dataProvider="searchKey" , groups="Two")
public void testMethodTwo(String location) throws InterruptedException{
WebElement searchBox=driver.findElement(By.name("q"));
searchBox.sendKeys(location);
System.out.println("You are trying to search : " +location);
WebElement srchBtn = driver.findElement(By.name("btnK"));
srchBtn.submit();
Thread.sleep(3000);
System.out.println("The page title is: " +driver.getTitle());
}
@DataProvider(name="searchKey")
public Object[][] getDataProviderData(ITestContext c){
Object[][] grpArr = null;
for (String grp : c.getIncludedGroups()){
if(grp.equalsIgnoreCase("One")){
grpArr = new Object[][]{
{ "India Gate", "Delhi" },
{ "Taj Mahal", "Agra" },
{ "Char Minar", "Hyderabad" }
};
break;
}
else if(grp.equalsIgnoreCase("Two")){
grpArr = new Object[][]{
{"Paris"},
{"Cairo"},
{"Washington"}
};
}
}
return grpArr;
}
}
Чтобы вызвать этот класс тестирования, вы можете использовать приведенный ниже xml, который будет запускать два набора тестов на основе разных групп.
Testng.xml:
Выполнение приведенного выше xml-файла даст результаты, подобные приведенным ниже:
Вывод
Параметризация в тестировании позволяет выполнять тестирование на основе данных более эффективным способом. Объявляя параметры, вам не придется писать несколько сценариев автоматизации тестирования для разных тестовых входных данных одного набора тестов, что упрощает поддержку вашего кода автоматизации тестирования. Я надеюсь, что это руководство по тестированию помогло вам использовать ваши сценарии тестирования Selenium automation. Параметризацию при тестировании для ваших сценариев тестирования Selenium automation можно выполнить с помощью поставщика данных или аннотации параметра с помощью TestNG.xml . Мы говорили о параметризации обоими способами на примерах, очень подробно. Мы поняли, что dataProvider дополнительно предлагает 2 параметра т.е. Метод & ITestContext . Теперь вы можете запускать свои сценарии автоматизации тестирования, используя параметризацию при тестировании для вашего следующего проекта. Дайте мне знать ваши мысли об этом руководстве по тестированию в разделе комментариев ниже. В случае, если у вас есть какие-либо сомнения или вопросы, не стесняйтесь также публиковать их. Приветствия и счастливого тестирования!
Оригинал: “https://dev.to/himanshusheth004/parameterization-in-testng-dataprovider-and-testng-xml-with-examples-15pk”