Как создать Data-Driven Framework в Selenium WebDriver с использованием Cucumber?

Что такое Data-Driven Framework и его преимущества?

Data-Driven Framework (DDF) — это методология автоматизированного тестирования, в которой тестовые данные хранятся отдельно от тестового кода. Вместо того, чтобы жестко кодировать входные значения непосредственно в скриптах, DDF считывает эти данные из внешних источников, таких как CSV, Excel, базы данных или JSON-файлы.

Преимущества Data-Driven Framework:

  • Улучшенная поддержка повторного использования: Один и тот же тестовый сценарий может быть выполнен с разными наборами данных, уменьшая дублирование кода.
  • Повышенная читаемость и поддерживаемость: Разделение данных и логики делает тесты более понятными и простыми в обслуживании.
  • Упрощенное расширение тестового покрытия: Добавление новых тестовых случаев требует только добавления данных, а не изменения кода.
  • Возможность тестирования с большими объемами данных: DDF позволяет эффективно тестировать приложение с различными комбинациями входных значений.

Преимущества использования Cucumber для Data-Driven тестирования

Cucumber — это инструмент Behavior-Driven Development (BDD), который позволяет писать тесты на простом, понятном языке, близком к естественному. Интеграция Cucumber с Selenium WebDriver предоставляет следующие преимущества для Data-Driven тестирования:

  • Четкое описание тестовых сценариев: Feature-файлы Cucumber позволяют описывать тестовые сценарии на языке Gherkin, что делает их понятными для всех членов команды, включая нетехнических специалистов.
  • Параметризация сценариев: Cucumber позволяет передавать данные в тестовые сценарии через таблицы Scenario Outline и Examples, упрощая создание data-driven тестов.
  • Автоматическая генерация документации: Cucumber генерирует отчеты о тестировании, которые служат документацией к требованиям и тестовым сценариям.
  • Интеграция с Selenium WebDriver: Cucumber легко интегрируется с Selenium WebDriver, позволяя автоматизировать взаимодействие с веб-элементами на основе данных, полученных из внешних источников.

Необходимые инструменты и технологии

Для создания Data-Driven Framework с Cucumber и Selenium WebDriver потребуется:

  • Java (или другой поддерживаемый язык программирования): Для написания Step Definitions.
  • Selenium WebDriver: Для взаимодействия с веб-браузером.
  • Cucumber: Для BDD-тестирования и параметризации сценариев.
  • JUnit (или другой фреймворк для модульного тестирования): Для запуска тестов Cucumber.
  • Библиотека для работы с CSV/Excel (например, Apache POI, OpenCSV): Для чтения данных из внешних источников.
  • IntelliJ IDEA (или другая IDE): Для разработки и отладки кода.
  • Maven (или Gradle): Для управления зависимостями проекта.

Настройка окружения и инструментов

Установка Selenium WebDriver

Selenium WebDriver можно установить как Java dependency через Maven или Gradle. В pom.xml (для Maven) необходимо добавить следующую зависимость:

<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>4.18.1</version>
</dependency>

Не забудьте обновить версию до актуальной.

Также необходимо скачать драйвер для используемого браузера (ChromeDriver, GeckoDriver и т.д.) и указать путь к нему в системной переменной webdriver.chrome.driver (или соответствующей переменной для другого браузера).

Настройка Cucumber

Аналогично, Cucumber устанавливается как dependency. Для Cucumber версии 7+:

<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>cucumber-java</artifactId>
    <version>7.15.0</version>
</dependency>
<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>cucumber-junit</artifactId>
    <version>7.15.0</version>
    <scope>test</scope>
</dependency>

Установка и настройка необходимых библиотек и зависимостей

Для работы с CSV файлами потребуется библиотека OpenCSV:

<dependency>
    <groupId>com.opencsv</groupId>
    <artifactId>opencsv</artifactId>
    <version>5.9</version>
</dependency>

Для работы с Excel файлами подойдет Apache POI:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>5.2.5</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.5</version>
</dependency>

Настройка проекта: создание структуры каталогов

Рекомендуемая структура каталогов проекта:

src/
  main/
    java/
      # Основной код проекта
  test/
    java/
      stepDefinitions/
        # Step Definitions Cucumber
      runners/
        # Классы для запуска тестов Cucumber
    resources/
      features/
        # Feature-файлы Cucumber (.feature)
      data/
        # CSV/Excel файлы с тестовыми данными

Разработка Data-Driven Framework

Определение структуры входных данных (например, CSV, Excel)

Предположим, у нас есть CSV файл users.csv со следующей структурой:

username,password,email
user1,pass1,user1@example.com
user2,pass2,user2@example.com

Реализация Feature-файлов Cucumber с параметризованными сценариями

Feature-файл login.feature:

Feature: Login functionality
  Scenario Outline: Login with valid credentials
    Given User is on the login page
    When User enters username "<username>" and password "<password>"
    And User clicks on the login button
    Then User should be logged in successfully

    Examples:
      | username | password  |
      | user1    | pass1     |
      | user2    | pass2     |
Реклама

Создание Step Definitions для работы с данными

Step Definitions в классе LoginSteps.java:

import io.cucumber.java.en.Given;
import io.cucumber.java.en.Then;
import io.cucumber.java.en.When;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import io.github.bonigarcia.wdm.WebDriverManager;

public class LoginSteps {

    private WebDriver driver;

    @Given("User is on the login page")
    public void user_is_on_the_login_page() {
         WebDriverManager.chromedriver().setup();
         driver = new ChromeDriver();
         driver.get("http://example.com/login"); // Замените на фактический URL страницы входа
    }

    @When("User enters username \"{string}\" and password \"{string}\"")
    public void user_enters_username_and_password(String username, String password) {
        WebElement usernameField = driver.findElement(By.id("username"));
        WebElement passwordField = driver.findElement(By.id("password"));

        usernameField.sendKeys(username);
        passwordField.sendKeys(password);
    }

    @When("User clicks on the login button")
    public void user_clicks_on_the_login_button() {
        WebElement loginButton = driver.findElement(By.id("login-button"));
        loginButton.click();
    }

    @Then("User should be logged in successfully")
    public void user_should_be_logged_in_successfully() {
        //Assert that login successful
        driver.quit();
    }
}

Интеграция Selenium WebDriver для взаимодействия с веб-элементами

В приведенном выше примере Step Definitions показано, как Selenium WebDriver используется для поиска элементов на веб-странице (например, по ID) и взаимодействия с ними (например, ввод текста в поля и нажатие на кнопку).

Чтение и обработка данных из внешних источников

Реализация методов для чтения данных из CSV/Excel файлов

Пример чтения данных из CSV файла с использованием OpenCSV:

import com.opencsv.CSVReader;
import java.io.FileReader;
import java.util.List;

public class CSVReaderUtil {

    public static List<String[]> readDataFromCSV(String filePath) throws Exception {
        try (CSVReader reader = new CSVReader(new FileReader(filePath))) {
            return reader.readAll();
        }
    }
}

Передача данных в Step Definitions

Для передачи данных из CSV файла в Step Definitions можно модифицировать Step Definitions и Feature файл:

Измененный Feature файл login.feature:

Feature: Login functionality

  Scenario Outline: Login with data from CSV
    Given User is on the login page
    When User logs in with username "<username>" and password "<password>"
    Then User should be logged in successfully

    Examples:
      | username | password |
      | ${username}  | ${password} |

Измененные Step Definitions LoginSteps.java:

import io.cucumber.java.en.Given;
import io.cucumber.java.en.Then;
import io.cucumber.java.en.When;
import java.util.List;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import io.github.bonigarcia.wdm.WebDriverManager;

public class LoginSteps {

    private WebDriver driver;
    private List<String[]> csvData;

    @Given("User is on the login page")
    public void user_is_on_the_login_page() {
        WebDriverManager.chromedriver().setup();
        driver = new ChromeDriver();
        driver.get("http://example.com/login"); // Замените на фактический URL страницы входа
    }

    @When("User logs in with username \"{string}\" and password \"{string}\"")
    public void user_logs_in_with_data_from_csv(String username, String password) {
        WebElement usernameField = driver.findElement(By.id("username"));
        WebElement passwordField = driver.findElement(By.id("password"));

        usernameField.sendKeys(username);
        passwordField.sendKeys(password);
    }

    @Then("User should be logged in successfully")
    public void user_should_be_logged_in_successfully() {
        //Assert that login successful
        driver.quit();
    }

}

В этом примере нужно добавить логику чтения CSV файла, например, в @Before хук Cucumber и сохранить данные в csvData. Затем в Step Definition user_logs_in_with_data_from_csv извлекать данные из csvData в зависимости от итерации.

Обработка различных типов данных (строки, числа, даты)

При чтении данных из внешних источников необходимо учитывать их тип и преобразовывать их в нужный формат. Например, если из CSV файла считывается дата в строковом формате, ее необходимо преобразовать в объект Date перед использованием.

Запуск тестов и анализ результатов

Настройка запуска тестов Cucumber

Для запуска тестов Cucumber необходимо создать класс Runner:

import io.cucumber.junit.Cucumber;
import io.cucumber.junit.CucumberOptions;
import org.junit.runner.RunWith;

@RunWith(Cucumber.class)
@CucumberOptions(
        features = "src/test/resources/features",
        glue = "stepDefinitions",
        plugin = {"pretty", "html:target/cucumber-reports"}
)
public class RunCucumberTest {
}

Генерация отчетов о тестировании

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

Анализ результатов тестов и выявление ошибок

Анализ отчетов Cucumber позволяет выявить проблемные места в приложении и определить, какие тестовые случаи не прошли. На основе этой информации можно исправить ошибки и улучшить качество приложения.

Примеры отчетов и их интерпретация

Отчеты Cucumber содержат следующую информацию:

  • Feature Summary: Общая информация о количестве Feature-файлов, сценариев и шагов.
  • Scenario Results: Результаты выполнения каждого сценария (Passed, Failed, Skipped, Pending).
  • Step Results: Результаты выполнения каждого шага (Passed, Failed, Skipped, Pending).
  • Error Messages: Сообщения об ошибках, возникших при выполнении шагов.
  • Screenshots: Скриншоты, сделанные при возникновении ошибок (если настроено).

Анализ этой информации позволяет быстро выявлять причины сбоев тестов и принимать меры по их устранению.


Добавить комментарий