Рубрики
Без рубрики

Параметризованный Тест JUnit Для Автоматизации Selenium С Примерами

Надоело писать одни и те же тестовые сценарии для разных входных значений. Сэкономьте время, научившись выполнять параметризованный тест в JUnit для извлечения данных из источника данных. С тегами selenium, java, junit, tutorial.

Как тестировщик автоматизации, вы часто можете сталкиваться со сценариями Selenium test automation , в которых вам нужно выполнять одни и те же тесты снова и снова, но с разными входными данными и средами, что делает задачу утомительной и избыточной.

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

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

Зачем Вам Нужны Параметризованные Тесты JUnit?

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

Прежде всего, для автоматизации тестирования Selenium вам потребуется несколько наборов данных для выполнения ваших тестов. Наряду с этим, кроссбраузерная матрица, позволяющая охватить большую и разнообразную клиентскую базу, с которой будет работать ваше приложение. Во-вторых, вам нужно будет научиться писать методы тестирования для сбора данных из сохраненных вами наборов данных.

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

При использовании нескольких наборов данных в наших сценариях автоматизации тестирования Selenium первое, что приходит на ум, – это использовать лист Excel для извлечения этих данных. Однако в тех случаях, когда вы намереваетесь создать более конкретные сценарии автоматизации тестирования Selenium, возрастает необходимость использования универсальной платформы, такой как JUnit. JUnit позволяет нам писать тестовые примеры более надежным способом и предоставляет нам множество функций, одной из которых является параметризация.

Типы параметризации JUnit

В этом руководстве по Selenium JUnit я объясню два эффективных способа использования параметризованных тестов JUnit.

  • Параметризация с использованием аннотации @Parameters
  • Параметризация с помощью Excel

Во-первых, параметризация с использованием аннотации @Parameters, которая позволяет передавать тестовые данные в ваш сценарий Selenium в виде коллекции Java. При любом изменении данных все, что вам нужно сделать, это отредактировать коллекцию с нужными данными.

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

Вы также можете использовать зависимость JUnit params для параметризации наших тестов с помощью аннотаций @ParameterizedTest вместо аннотации @test . Вы можете передавать аргументы в параметризованные тесты JUnit, используя различные аннотации, перечисленные ниже:

  1. @ValueSource @ValueSource
  2. @EnumSource @EnumSource
  3. @CsvSource
  4. @CsvFileSource
  5. @MethodSource @Источник методов

Параметризация с использованием аннотации @Parameters

Рассмотрим пример поиска по некоторым ключевым словам (в нашем случае возьмем 4 ключевых слова) в Google. Теперь давайте посмотрим, как будет выглядеть наш код, если мы напишем необработанный код без концепций параметризации.

package normalRun;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
public class TestNormExec {     
    WebDriver driver;
    @Before
    public void startUp(){      
            System.out.println("----This is the beginning of our test----");
    System.setProperty("webdriver.chrome.driver","D:\\Softwares\\chromedriver_win32(1)\\chromedriver.exe");
            driver = new ChromeDriver();
    driver.get("https://www.google.com/");
            driver.manage().window().maximize();
    }

    @Test
    public void searchKeys(){
            String keyWrd = "Selenium";
            System.out.println("----Let us start searching the keywords----");
            //Entering keyword in search box and searching it
            WebElement srchBox = driver.findElement(By.name("q"));
            srchBox.sendKeys(keyWrd + "\n");
                    //Printing the title of the new page
            String title = driver.getTitle();
            System.out.println("The title is : " +title);
    }

    @After
    public void tearDown(){
            System.out.println("----We're now closing our test----");
            driver.quit();
    }
 }

Чтобы запустить вашу автоматизацию тестирования Selenium с различными наборами данных, нам пришлось бы вручную изменять значение строки 'keyWrd' каждый раз, когда мы запускаем наш тестовый пример. Чтобы упростить этот процесс изменения входных значений, мы можем параметризовать наши тестовые примеры с помощью параметризованных тестов JUnit. Это также помогло бы нам устранить избыточность в наших тестовых примерах Selenium.

Давайте теперь подробнее рассмотрим параметризацию тестов JUnit для автоматизации тестирования Selenium. Сначала я создам класс, содержащий метод test. Обратите внимание, что здесь я передаю ключевые слова в качестве параметров метода, в отличие от предыдущего подхода, в котором я сохранял ключевое слово поиска в переменной.

package parameterizedRun;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class SearchGoogle {

    WebDriver driver;   
    @Test
    public void searchKeys(String kyWrd, String kyWrd1){
            System.out.println("----This is the beginning of our test----");
    System.setProperty("webdriver.chrome.driver", "D:\\Softwares\\chromedriver_win32(1)\\chromedriver.exe");
            driver = new ChromeDriver();
    driver.get("https://www.google.com/");
            driver.manage().window().maximize();
            System.out.println("----Let us start searching the keywords----");
            //Entering keyword in search box and searching it
            WebElement srchBox = driver.findElement(By.name("q"));
            srchBox.sendKeys(kyWrd + " " + kyWrd1 + "\n");
            //Printing the title of the new page
            String title = driver.getTitle();
            System.out.println("The title is : " +title);
            driver.quit();
    }
  }

На следующем шаге я создам класс с аннотацией @RunWith . Этот класс будет запускать тесты на новом экземпляре. В дополнение к этому я создам конструктор для этого класса, который будет хранить данные для тестирования.

В этом примере в этот конструктор будут переданы две переменные. Далее, чтобы сгенерировать и вернуть тестовые данные, я создам статический метод с возвращаемым типом как Collection. Каждая запись этой коллекции будет содержать данные для одного запуска, например, {“Selenium”,”Delhi”} , будет данными для одного из выполнений.

Аннотация Parameters/| для этого метода предоставляет набор входных данных для запуска наших тестов. Вот окончательный код для этого класса.

package parameterizedRun;
import java.util.Arrays;
import java.util.Collection;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@RunWith(Parameterized.class)
public class SearchGoogleTest {
    private String kyWrd1;
    private String kyWrd2;
    private SearchGoogle searchGoogle;
    public SearchGoogleTest(String kyWrd1, String kyWrd2){
            super();
            this.kyWrd1 = kyWrd1;
            this.kyWrd2 = kyWrd2;
    }

    @Before
    public void init(){
            searchGoogle = new SearchGoogle();
            }
    @Parameterized.Parameters
    public static Collection data(){
            return Arrays.asList(new Object[][]{{"Selenium","Delhi"},{"QTP","Bangalore"},{"LoadRunner","Chennai"}});
    }   
    @Test
    public void testSearch(){
        searchGoogle.searchKeys(kyWrd1,kyWrd2);
    }

}

Последним шагом для создания параметризованного теста JUnit было бы создание класса testrunner, который будет управлять выполнением нашего теста. Этот класс будет запускать тест с помощью JUnitCore.runClasses , и наш тестовый класс будет передан ему в качестве параметра.

package parameterizedRun;
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class Runner {
    public static void main(String[] args){
            Result res = JUnitCore.runClasses(SearchGoogleTest.class);
            for(Failure fail:res.getFailures()){
                System.out.println(fail.toString());
            }
                System.out.println(res.wasSuccessful());
    }
}

Вы можете получить аналогичный результат при запуске класса Test Runner.

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

Параметризация с помощью Excel

Параметризация с использованием excel или Тестирование на основе данных, как его обычно называют, является эффективным способом обработки тестовых сценариев, которым требуются различные тестовые данные. Данные из внешних файлов считываются и загружаются в тестовый скрипт во время выполнения, а не жестко кодируются.

Некоторые общие сценарии для этого руководства по Selenium JUnit могут включать тестирование входа в приложение с несколькими пользователями или поиск по разным ключевым словам в Google. Основным преимуществом такого подхода является возможность повторного использования кода, при котором вам не нужно прикасаться к сценариям автоматизации тестирования Selenium и просто обновлять тестовые данные в нашем файле. Давайте посмотрим, как мы можем использовать фреймворк, основанный на данных, для параметризации наших тестовых примеров в JUnit.

Основным элементом, который нам понадобится для параметризации Excel в этом руководстве по Selenium JUnit, является лист excel. Я создал лист Excel, состоящий из ключевых слов для поиска, и разместил его в папке моего проекта в папке Данных.

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

Для выполнения вышеуказанных шагов в этом руководстве по Selenium JUnit я буду использовать встроенные пакеты Apache, чтобы упростить работу.

package excelParameterization;
import java.io.File;
import java.io.FileInputStream;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ReadExcel {
    XSSFWorkbook wb;
    //Creating a constructor of the same class that would load excel file using the File I/O stream
    public ReadExcel(){     
    File src = new File("./Data/TestData.xlsx");        //You need to specify the location where excel file is saved in your system.
    try {
            FileInputStream fis = new FileInputStream(src);
       wb = new XSSFWorkbook(fis);  //After creating an object of File Input Stream, this line of code          would load my file into the XSSFWorkbook
    }
    catch (Exception e) {
            System.out.println("The exception is: " +e.getMessage());
                        }   
    }
   //This method would fetch the data from the corresponding cell of the excel sheet and return as a String.
            public String getData(int sheetIndex, int row, int column){     
            String data = wb.getSheetAt(sheetIndex).getRow(row).getCell(column).getStringCellValue();
            return data;
    }
}

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

package excelParameterization;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
public class TestSearch {
WebDriver driver;
ReadExcel excel = new ReadExcel();      //Creating an object of the class that holds code to read data from excel.

    @Before
    public void startUp(){
                        System.out.println("----This is the beginning of our test----");
        System.setProperty("webdriver.chrome.driver", "D:\\Softwares\\chromedriver_win32(1)\\chromedriver.exe");
                driver = new ChromeDriver();
        driver.get("https://www.google.com/");
                driver.manage().window().maximize();
    }
    @Test
    public void searchKeys(){
            System.out.println("----Let us start searching the keywords----");
            //Entering keyword in search box and searching it
            WebElement srchBox = driver.findElement(By.name("q"));      
            srchBox.sendKeys(excel.getData(0, 1, 0) + "\n");  //Will read the second row-first column from the excel sheet#0
                    //Printing the title of the new page
            String title = driver.getTitle();
            System.out.println("The title is : " +title);
    }
    @After
    public void tearDown(){
            System.out.println("----We're now closing our test----");
            driver.quit();
    }
}

При выполнении приведенного выше кода сценарий автоматизации тестирования Selenium извлекает данные excel из второй строки листа excel и выдает результаты, как показано ниже:

Теперь, когда вы знаете, как выполнять параметризованные тесты JUnit, используя как аннотации @Parameters , так и Excel, я покажу вам, как масштабировать параметризованные тесты JUnit с помощью LambdaTest Selenium Grid.

Интеграция скриптов JUnit с лямбда-тестом Selenium Grid

Теперь, когда вы знаете, как параметризовать сценарии автоматизации тестирования Selenium в этом руководстве по Selenium JUnit, следующий вопрос, который может возникнуть, – это выполнение этих сценариев в нескольких операционных системах и браузерах.

Хотя вы можете настроить Selenium grid локально в своей системе, другим эффективным способом сделать это является использование Lambda-теста Selenium Grid и выполнение скриптов автоматического тестирования браузера в облаке.

Для этого вам просто нужно изменить сценарии автоматизации тестирования Selenium, которые мы использовали в приведенных выше примерах. Нам нужно будет добавить желаемую возможность в наши сценарии автоматизации тестирования Selenium, которые могут быть сгенерированы генератором желаемых возможностей Selenium, просто указав операционную систему, разрешение, сведения о браузере, версию Selenium и т.д. На снимке ниже вы можете увидеть, как генерируются эти сведения:

Далее нам нужно объявить учетные данные для проверки подлинности в тестовом скрипте, чтобы WebDriver указывал на правильный URL-адрес концентратора для выполнения. Ниже приведен сценарий окончательного выполнения (я использую сценарии аннотаций @Parameters, используемые в приведенном выше примере) для запуска тестов в LambdaTest Selenium Grid.

package parameterizedRun;
import java.net.MalformedURLException;
import java.net.URL;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;

public class SearchGoogle {



    static String username = "Your UserName;
    static String accesskey = "Your Access Key";
    static RemoteWebDriver driver = null;
    static String gridURL = "@hub.lambdatest.com/wd/hub";
    boolean status = false;


    @Test
    public void searchKeys(String kyWrd, String kyWrd1){
            System.out.println("----This is the beginning of our test----");
            DesiredCapabilities capabilities = new DesiredCapabilities();
            capabilities.setCapability("build", "your build name");
            capabilities.setCapability("name", "your test name");
            capabilities.setCapability("platform", "MacOS Catalina");
            capabilities.setCapability("browserName", "Chrome");
            capabilities.setCapability("version","80.0");
            try {
            driver = new RemoteWebDriver(new URL("https://" + username + ":" + accesskey + gridURL), capabilities);
            }
            catch (MalformedURLException e) {
            System.out.println("Invalid grid URL");
            } catch (Exception e) {
            System.out.println(e.getMessage());
            }

            driver.get("https://www.google.com/");
            driver.manage().window().maximize();
            System.out.println("----Let us start searching the keywords----");
            //Entering keyword in search box and searching it
            WebElement srchBox = driver.findElement(By.name("q"));
            srchBox.sendKeys(kyWrd + " " + kyWrd1 + "\n");
            //Printing the title of the new page
            String title = driver.getTitle();
            System.out.println("The title is : " +title);
            driver.quit();
        } 
}

Обратите внимание, что из трех классов, используемых в примере аннотации @Parameters в этом руководстве по Selenium JUnit, изменения будут внесены только в один класс, содержащий метод test для открытия браузера Chrome, а остальные два класса останутся неизменными. При выполнении нашего теста либо через eclipse, либо через cmd вы увидите результаты тестирования в журналах автоматизации LambdaTest, как показано ниже:

В приведенном выше сценарии для этого руководства по Selenium JUnit мы выполнили наши тесты в разных версиях операционной системы и браузера без необходимости настройки локальных компьютеров. Вот почему облачная Selenium Grid более эффективна и полезна благодаря своей способности запускать ваши тесты в нескольких браузерах за один раз, чем локальная Selenium Grid.

Завершая это

Теперь вам не придется мириться с разочарованием при повторном написании одного и того же теста Selenium с разными входными данными. В этом руководстве по Selenium JUnit вы узнали, что при практическом выполнении сценариев автоматизации тестирования Selenium вам необходимо знать, как запускать одни и те же тесты с несколькими наборами данных. Самый простой способ – параметризовать тестовые сценарии, а не менять их каждый раз, когда используются новые данные. Это можно сделать либо путем параметризации с помощью аннотации @Parameters, либо с помощью листа excel.

На этом заканчивается данное руководство Selenium JUnit по параметризованным тестам. Дайте нам знать в разделе комментариев ниже, что вы думаете об этой статье. Помогите нам связаться с вашими коллегами, которые хотят узнать больше о параметризованных тестах JUnit, сделав нам ретвит в Twitter. Счастливого Тестирования!! 🙂

Оригинал: “https://dev.to/paulharshit/junit-parameterized-test-for-selenium-automation-with-examples-4f17”