Структура сценария cucumber

Software-Testing.Ru - портал специалистов по тестированию и обеспечению качества ПО

Автор: Сурин Анатолий, ведущий инженер по тестированию АО «СберТех»

Оригинальная публикация: https://habrahabr.ru/post/332754/

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

В данной статье мы рассмотрим один из самых популярных фреймворков для автоматизации тестирования с использованием BDD-подхода – Cucumber. Также посмотрим, как он работает и какие средства предоставляет.

Первоначально Cucumber был разработан Ruby-сообществом, но со временем был адаптирован и для других популярных языков программирования. В данной статье рассмотрим работу Cucumber на языке Java.

Gherkin

BDD тесты – это простой текст, на человеческом языке, написанный в форме истории (сценария), описывающей некоторое поведение.

В Cucumber для написания тестов используется Gherkin-нотация, которая определяет структуру теста и набор ключевых слов. Тест записывается в файл с расширением *.feature и может содержать как один, так и более сценариев.

Рассмотрим пример теста на русском языке с использованием Gherkin:

# language: ru
@all
Функция: Аутентификация банковской карты
  Банкомат должен спросить у пользователя PIN-код банковской карты
  Банкомат должен выдать предупреждение, если пользователь ввел неправильный PIN-код
  Аутентификация успешна, если пользователь ввел правильный PIN-код

  Предыстория:
    Допустим пользователь вставляет в банкомат банковскую карту
    И банкомат выдает сообщение о необходимости ввода PIN-кода

  @correct
  Сценарий: Успешная аутентификация
    Если пользователь вводит корректный PIN-код
    То банкомат отображает меню и количество доступных денег на счету

  @fail
  Сценарий: Некорректная аутентификация
    Если пользователь вводит некорректный PIN-код
    То банкомат выдает сообщение, что введённый PIN-код неверный

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

Обратите внимание на структуру сценария:

1. Получить начальное состояние системы;
2. Что-то сделать;
3. Получить новое состояние системы.

В примере жирным выделены ключевые слова. Ниже представлен полный список ключевых слов на русском языке:

  1. Дано, Допустим, Пусть – используются для описания предварительного, ранее известного состояния;
  2. Когда, Если – используются для описания ключевых действий;
  3. И, К тому же, Также – используются для описания дополнительных предусловий или действий;
  4. Тогда, То – используются для описания ожидаемого результата выполненного действия;
  5. Но, А – используются для описания дополнительного ожидаемого результата;
  6. Функция, Функционал, Свойство – используется для именования и описания тестируемого функционала. Описание может быть многострочным;
  7. Сценарий – используется для обозначения сценария;
  8. Предыстория, Контекст – используется для описания действий, выполняемых перед каждым сценарием в файле;
  9. Структура сценария, Примеры – используется для создания шаблона сценария и таблицы параметров, передаваемых в него.

Ключевые слова, перечисленные в пунктах 1-5, используются для описания шагов сценария, Cucumber их технически не различает. Вместо них можно использовать символ *, но делать так не рекомендуется. У этих слов есть определенная цель, и они были выбраны именно для неё.

Список зарезервированных символов:

# – обозначает комментарии;
@ – тэгирует сценарии или функционал;
| – разделяет данные в табличном формате;
«»» – обрамляет многострочные данные.

Сценарий начинается со строки # language: ru. Эта строчка указывает Cucumber, что в сценарии используется русский язык. Если её не указать, фреймворк, встретив в сценарии русский текст, выбросит исключение LexingError и тест не запустится. По умолчанию используется английский язык.

Простой проект

Cucumber-проект состоит из двух частей – это текстовые файлы с описанием сценариев (*.feature) и файлы с реализацией шагов на языке программирования (в нашем случае — файлы *.java).

Для создания проекта будем использовать систему автоматизации сборки проектов Apache Maven.
Первым делом добавим cucumber в зависимости Maven:

<dependency>
    <groupId>info.cukes</groupId>
    <artifactId>cucumber-java</artifactId>
    <version>1.2.4</version>
</dependency>

Для запуска тестов будем использовать JUnit (возможен запуск через TestNG), для этого добавим еще две зависимости:

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>
<dependency>
    <groupId>info.cukes</groupId>
    <artifactId>cucumber-junit</artifactId>
    <version>1.2.4</version>
</dependency>

Библиотека cucumber-junit содержит класс cucumber.api.junit.Cucumber, который позволяет запускать тесты, используя JUnit аннотацию RunWith. Класс, указанный в этой аннотации, определяет каким образом запускать тесты.

Создадим класс, который будет являться точкой входа для наших тестов.

import cucumber.api.CucumberOptions;
import cucumber.api.SnippetType;
import cucumber.api.junit.Cucumber;
import org.junit.runner.RunWith;

@RunWith(Cucumber.class)
@CucumberOptions(
        features = "src/test/features",
        glue = "ru.savkk.test",
        tags = "@all",
        dryRun = false,
        strict = false,
        snippets = SnippetType.UNDERSCORE,
//        name = "^Успешное|Успешная.*"
)
public class RunnerTest {
}

Обратите внимание, название класса должно иметь окончание Test, иначе тесты не будут запускаться.

Рассмотрим опции Cucumber:

  1. features – путь к папке с .feature файлами. Фреймворк будет искать файлы в этой и во всех дочерних папках. Можно указать несколько папок, например: features = {«src/test/features», «src/test/feat»};
  2. glue – пакет, в котором находятся классы с реализацией шагов и «хуков». Можно указать несколько пакетов, например, так: glue = {«ru.savkk.test», «ru.savkk.hooks»};
  3. tags – фильтр запускаемых тестов по тэгам. Список тэгов можно перечислить через запятую. Символ ~ исключает тест из списка запускаемых тестов, например ~@fail;
  4. dryRun – если true, то сразу после запуска теста фреймворк проверяет, все ли шаги теста разработаны, если нет, то выдает предупреждение. При false предупреждение будет выдаваться по достижении неразработанного шага. По умолчанию false.
  5. strict – если true, то при встрече неразработанного шага тест остановится с ошибкой. False — неразработанные шаги пропускаются. По умолчанию false.
  6. snippets – указывает в каком формате фреймворк будет предлагать шаблон для нереализованных шагов. Доступны значения: SnippetType.CAMELCASE, SnippetType.UNDERSCORE.
  7. name – фильтрует запускаемые тесты по названиям удовлетворяющим регулярному выражению.

Для фильтрации запускаемых тестов нельзя одновременно использовать опции tags и name.

Создание «фичи»

В папке src/test/features создадим файл с описание тестируемого функционала. Опишем два простых сценария снятия денег со счета — успешный и провальный.

# language: ru
@withdrawal
Функция: Снятие денег со счета

  @success
  Сценарий: Успешное снятие денег со счета
    Дано на счете пользователя имеется 120000 рублей
    Когда пользователь снимает со счета 20000 рублей
    Тогда на счете пользователя имеется 100000 рублей

  @fail
  Сценарий: Снятие денег со счета - недостаточно денег
    Дано на счете пользователя имеется 100 рублей
    Когда пользователь снимает со счета 120 рублей
    Тогда появляется предупреждение "На счете недостаточно денег"

Запускаем

Попробуем запустить RunnerTest со следующими настройками:

@RunWith(Cucumber.class)
@CucumberOptions(
        features = "src/test/features",
        glue = "ru.savkk.test",
        tags = "@withdrawal",
        snippets = SnippetType.CAMELCASE
)
public class RunnerTest {
}

В консоль появился результат прохождения теста:

Undefined scenarios:
test.feature:6 # Сценарий: Успешное снятие денег со счета
test.feature:12 # Сценарий: Снятие денег со счета - недостаточно денег

2 Scenarios (2 undefined)
6 Steps (6 undefined)
0m0,000s

You can implement missing steps with the snippets below:

@Дано("^на счете пользователя имеется (\d+) рублей$")
public void наСчетеПользователяИмеетсяРублей(int arg1) throws Throwable {
    // Write code here that turns the phrase above into concrete actions
    throw new PendingException();
}

@Когда("^пользователь снимает со счета (\d+) рублей$")
public void пользовательСнимаетСоСчетаРублей(int arg1) throws Throwable {
    // Write code here that turns the phrase above into concrete actions
    throw new PendingException();
}

@Тогда("^появляется предупреждение "([^"]*)"$")
public void появляетсяПредупреждение(String arg1) throws Throwable {
    // Write code here that turns the phrase above into concrete actions
    throw new PendingException();
}

Cucumber не нашел реализацию шагов и предложил свои шаблоны для разработки.
Создадим класс MyStepdefs в пакете ru.savkk.test и перенесем в него методы, предложенные фреймворком:

import cucumber.api.PendingException;
import cucumber.api.java.ru.*;

public class MyStepdefs {

    @Дано("^на счете пользователя имеется (\d+) рублей$")
    public void наСчетеПользователяИмеетсяРублей(int arg1) throws Throwable {
        // Write code here that turns the phrase above into concrete actions
        throw new PendingException();
    }

    @Когда("^пользователь снимает со счета (\d+) рублей$")
    public void пользовательСнимаетСоСчетаРублей(int arg1) throws Throwable {
        // Write code here that turns the phrase above into concrete actions
        throw new PendingException();
    }

    @Тогда("^появляется предупреждение "([^"]*)"$")
    public void появляетсяПредупреждение(String arg1) throws Throwable {
        // Write code here that turns the phrase above into concrete actions
        throw new PendingException();
    }
}

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

Как было сказано выше, для Cucumber технически нет отличия в ключевых словах, описывающих шаги, это верно и для аннотации, например:

@Когда("^пользователь снимает со счета (\d+) рублей$")
@Тогда("^пользователь снимает со счета (\d+) рублей$")

для фреймворка являются одинаковыми.

То, что в регулярных выражениях записано в скобках передается в метод в виде аргумента. Фреймворк самостоятельно определяет, что необходимо передавать из сценария в метод в виде аргумента. Это числа — (\d+). И текст, экранированный в кавычки — «([^»]*)». Это самые распространённые из передаваемых аргументов.

Ниже в таблице представлены элементы, используемые в регулярных выражениях:
регулярных выражениях:

Выражение Описание Соответствие
. Один любой символ (за исключение
переноса строки)
Ф
2
j
.* 0 или больше любых символов
(за исключением переноса строки)
Abracadabra
789-160-87

,

.+ Один или больше любых символов
(за исключением переноса строки)
Все, что относилось к
предыдущему, за исключением пустой
строки.
.{2} Любые два символа (за
исключением переноса строки)
Фф
22

JJ
.{1,3} От одного до трех любых
символов (за исключением переноса
строки)
Жжж
Уу
!
^ Якорь начала строки ^aaa соответствует aaa
^aaa соответствует aaabbb
^aaa не соответствует bbbaaa
$ Якорь конца строки aaa$ соответствует aaa
aaa$ не соответствует aaabbb
aaa$ соответствует bbbaaa
d*
[0-9]*
Любое число (или ничего) 12321

5323

d+
[0-9]+
Любое число Все, что относилось к
предыдущему, за исключением пустой
строки.
w* Любая буква, цифра или нижнее
подчеркивание (или ничего)
_we
_1ee
Gfd4
s Пробел, табуляция или перенос
строки
t, r
или n
«[^»]*» Любой символ (или ничего) в
кавычках
«aaa»
«»
«3213dsa»
? Делает символ или группу
символов необязательными
abc?
соответствует ab
или abc, но не b или bc
| Логическое ИЛИ aaa|bbb
соответствует aaa
или bbb, но не aaabbb
() Группа. В Cucumber
группа передается в определение шага
в виде аргумента.
(d+) рублей соответствует 10 рублей,
при этом 10 передается в метод шага в
виде аргумента
(?: ) Не передаваемая группа.
Cucumber не воспринимает
группу как аргумент.
(d+) (?:рублей|рубля) соответствует 3
рубля, при этом 3 передается в метод,
а «рубля» — нет.

Передача коллекций в аргументы

Часто возникает ситуация, когда из сценария в метод необходимо передать набор однотипных данных – коллекций. Для подобной задачи в Cucumber есть несколько решений:

  1. Фреймворк по умолчанию оборачивает данные, перечисленные через запятую, в ArrayList:
    Дано в меню доступны пункты Файл, Редактировать, О программе

    @Дано("^в меню доступны пункты (.*)$")
    public void вМенюДоступныПункты(List<String> arg) {
        // что-то сделать
    }

    Для замены разделителя, можно воспользоваться аннотацией Delimiter:

    Дано в меню доступны пункты Файл и Редактировать и О программе

    @Дано("^в меню доступны пункты (.+)$")
    public void вМенюДоступныПункты(@Delimiter(" и ") List<String> arg) {
        // что-то сделать
    }

  2. Данные, записанные в виде таблицы с одной колонкой, Cucumber также может обернуть в ArrayList:
    Дано в меню доступны пункты
      | Файл          |
      | Редактировать |
      | О программе   |

    @Дано("^в меню доступны пункты$")
    public void вМенюДоступныПункты(List<String> arg) {
        // что-то сделать
    }

  3. Данные, записанные в таблицу с двумя колонками, Cucumber может обернуть в ассоциативный массив, где данные из первой колонки – это ключ, а из второй – данные:
    Дано в меню доступны пункты
      | Файл          | true  |
      | Редактировать | false |
      | О программе   | true  |

    public void вМенюДоступныПункты(Map<String, Boolean> arg) {
        // что-то сделать
    }

  4. Передача данных в виде таблицы с большим количеством колонок возможна двумя способами:
    • DataTable
      Дано в меню доступны пункты
        | Файл          | true  | 5 |
        | Редактировать | false | 8 |
        | О программе   | true  | 2 |

      @Дано("^в меню доступны пункты$")
      public void вМенюДоступныПункты(DataTable arg) {
          // что-то сделать
      }

      DataTable – это класс, который эмулирует табличное представление данных. Для доступа к данным в нем имеется большое количество методов. Рассмотрим некоторые из них:

      public <K,V> List<Map<K,V>> asMaps(Class<K> keyType,Class<V> valueType)

      Конвертирует таблицу в список ассоциативных массивов. Первая строка таблицы используется для именования ключей, остальные как значения:

      Дано в меню доступны пункты
        | Название      | Доступен | Количество подменю |
        | Файл          | true     | 5                  |
        | Редактировать | false    | 8                  |
        | О программе   | true     | 2                  |

      @Дано("^в меню доступны пункты$")
      public void вМенюДоступныПункты(DataTable arg) {
          List<Map<String, String>> table = arg.asMaps(String.class, String.class);
          System.out.println(table.get(0).get("Название"));
          System.out.println(table.get(1).get("Название"));
          System.out.println(table.get(2).get("Название"));
      }

      Данный пример выведет на консоль:

      Файл
      Редактировать
      О программе

      public <T> List<List<T>> asLists(Class<T> itemType)

      Метод преобразует таблицу в список списков:

      Дано в меню доступны пункты
        | Файл          | true  | 5 |
        | Редактировать | false | 8 |
        | О программе   | true  | 2 |

      @Дано("^в меню доступны пункты$")
      public void вМенюДоступныПункты(DataTable arg) {
          List<List<String>> table = arg.asLists(String.class);
          System.out.print(table.get(0).get(0) + " ");
          System.out.print(table.get(0).get(1) + " ");
          System.out.println(table.get(0).get(2) + " ");
      
          System.out.print(table.get(1).get(0) + " ");
          System.out.print(table.get(1).get(1) + " ");
          System.out.println(table.get(1).get(2) + " ");
      }

      На консоль будет выведено:

      Файл true 5
      Редактировать false 8

      public List<List<String>> cells(int firstRow)

      Этот метод делает то же, что и предыдущий метод, за исключением того, что нельзя определить какого типа данные находятся в таблице, всегда возвращает список строк – List. В качестве аргумента метод принимает номер первой строки:

      Дано в меню доступны пункты
        | Файл          | true  | 5 |
        | Редактировать | false | 8 |
        | О программе   | true  | 2 |

      @Дано("^в меню доступны пункты$")
      public void вМенюДоступныПункты(DataTable arg) {
          List<List<String>> table = arg.cells(1);
          System.out.print(table.get(0).get(0) + " ");
          System.out.print(table.get(0).get(1) + " ");
          System.out.println(table.get(0).get(2) + " ");
      
          System.out.print(table.get(1).get(0) + " ");
          System.out.print(table.get(1).get(1) + " ");
          System.out.println(table.get(1).get(2) + " ");
      }

      Метод выведет на консоль:

      Редактировать false 8
      О программе true 2

    • Class
      Cucumber может создать объекты из табличных данных, переданных из сценария. Существует два способа это сделать.

      Создадим для примера класс Menu:

      public class Menu {
          private String title;
          private boolean isAvailable;
          private int subMenuCount;
      
          public String getTitle() {
              return title;
          }
      
          public boolean getAvailable() {
              return isAvailable;
          }
      
          public int getSubMenuCount() {
              return subMenuCount;
          }
      }

      Для первого способа шаг в сценарии запишем в следующем виде:

      Дано в меню доступны пункты
        | title         | isAvailable | subMenuCount |
        | Файл          | true        | 5            |
        | Редактировать | false       | 8            |
        | О программе   | true        | 2            |

      Реализация:

      @Дано("^в меню доступны пункты$")
      public void вМенюДоступныПункты(List<Menu> arg) {
          for (int i = 0; i < arg.size(); i++) {
              System.out.print(arg.get(i).getTitle() + " ");
              System.out.print(Boolean.toString(arg.get(i).getAvailable()) + " ");
              System.out.println(Integer.toString(arg.get(i).getSubMenuCount()));
          }
      }

      Вывод в консоль:

      Файл true 5
      Редактировать false 8
      О программе true 2

      Фреймворк создает связанный список объектов из таблицы с тремя колонками. В первой строке таблицы должны быть указаны наименования полей класса, создаваемого объекта. Если какое-то поле не указать, оно не будет инициализировано.

      Для второго способа приведем шаг сценария к следующему виду:

      Дано в меню доступны пункты
        | title        | Файл | Редактировать | О программе |
        | isAvailable  | true | false         | true        |
        | subMenuCount | 5    | 8             | 2           |

      А в аргументе описания шага используем аннотацию @Transpose.

      @Дано("^в меню доступны пункты$")
      public void вМенюДоступныПункты(@Transpose List<Menu> arg) {
          // что-то сделать
      }

      Cucumber, как и в предыдущем примере, создаст связанный список объектов, но, в данном случае, наименования полей записывается в первой колонке таблицы.

  5. Многострочные аргументы

    Для передачи многострочных данных в аргумент метода, их необходимо экранировать тремя двойными кавычками:

    Тогда отображается форма с текстом
    """
    На ваш номер телефона был выслан одноразовый пароль.
    Для подтверждения платежа необходимо ввести полученный
    одноразовый пароль.
    """

    Данные в метод приходят в виде объекта класса String:

    @Тогда("^отображается форма с текстом$")
    public void отображаетсяФормаСТекстом(String expectedText) {
        // что-то сделать
    }

Date

Фреймворк самостоятельно приводит данные из сценария к типу данных, указанному в аргументе метода. Если это невозможно, то выбрасывает исключение ConversionException. Это справедливо и для классов Date и Calendar. Рассмотрим пример:

Дано дата создания документа 04.05.2017
@Дано("^дата создания документа (.+)$")
public void датаСозданияДокумента (Date arg) {
    // что-то сделать
}

Все прекрасно сработало, Cucumber преобразовал 04.05.2017 в объект класса Date со значением «Thu May 04 00:00:00 EET 2017».

Рассмотрим еще один пример:

Дано дата создания документа 04-05-2017
@Дано("^дата создания документа (.+)$")
public void датаСозданияДокумента (Date arg) {
    // что-то сделать
}

Дойдя до этого шага, Cucumber выбросил исключение:

cucumber.deps.com.thoughtworks.xstream.converters.ConversionException: Couldn't convert "04-05-2017" to an instance of: [class java.util.Date]

Почему первый пример сработал, а второй нет?

Дело в том, что в Cucumber встроена поддержка форматов дат чувствительных к текущей локали. Если необходимо записать дату в формате, отличающемся от формата текущей локали, нужно использовать аннотацию Format:

Дано дата создания документа 04-05-2017
@Дано("^дата создания документа (.+)$")
public void датаСозданияДокумента (@Format("dd-MM-yyyy") Date arg) {
    // что-то сделать
}

Структура сценария

Бывают случаи, когда необходимо запустить тест несколько раз с различным набором данных, в таких случая на помощь приходит конструкция «Структура сценария»:

# language: ru
@withdrawal
Функция: Снятие денег со счета

  @success
  Структура сценария: Успешное снятие денег со счета
    Дано на счете пользователя имеется <изначально> рублей
    Когда пользователь снимает со счета <снято> рублей
    Тогда на счете пользователя имеется <осталось> рублей

    Примеры:
      | изначально | снято | осталось |
      | 10000      | 1     | 9999     |
      | 9999       | 9999  | 0        |

Суть данной конструкции заключается в том, что в места, обозначенные символами <>, вставляются данные из таблицы Примеры. Тест будет запускаться поочередно для каждой строки из данной таблицы. Названия колонок должно совпадать с названием мест вставки данных.

Использование хуков

Cucumber поддерживает хуки (hooks) – методы, запускаемые до или после сценария. Для их обозначения используется аннотация Before и After. Класс с хуками должен находиться в пакете, указанном в опциях фреймворка. Пример класса с хуками:

import cucumber.api.java.After;
import cucumber.api.java.Before;

public class Hooks {
    @Before
    public void prepareData() {
        //подготовить данные
    }

    @After
    public void clearData() {
        //очистить данные
    }
}

Метод c аннотацией Before будет запускаться перед каждым сценарием, After – после.

Порядок выполнения

Хукам можно задать порядок, в котором они будут выполняться. Для этого необходимо в аннотации указать параметр order. По умолчанию значение order равно 10000.

Для Before чем меньше это значение, тем раньше выполнится метод:

@Before(order = 10)
public void connectToServer() {
    //подключиться к серверу
}

@Before(order = 20)
public void prepareData() {
    //подготовить данные
}

В данном примере первым выполнится метод connectToServer(), затем prepareData().

After отрабатывает в обратном порядке.

Тэгирование

В параметре value можно указать тэги сценариев, для которых будут отрабатывать хуки. Символ ~ означает «за исключением». Пример:

@Before(value = "@correct", order = 30)
public void connectToServer() {
    //сделай что-нибудь
}

@Before(value = "~@fail", order = 20)
public void prepareData() {
    //сделай что-нибудь
}

Метод connectToServer будет выполнен для всех сценариев с тэгом correct, метод prepareData для всех сценариев за исключением сценариев с тэгом fail.

Scenario class

Если в определении метода-хука в аргументе указать объект класса Scenario, то в данном методе можно будет узнать много полезной информации о запущенном сценарии, например:

@After
public void getScenarioInfo(Scenario scenario) {
    System.out.println(scenario.getId());
    System.out.println(scenario.getName());
    System.out.println(scenario.getStatus());
    System.out.println(scenario.isFailed());
    System.out.println(scenario.getSourceTagNames());
}
# language: ru
@all
Функция: Аутентификация банковской карты
  Банкомат должен спросить у пользователя PIN-код банковской карты
  Банкомат должен выдать предупреждение если пользователь ввел неправильный PIN-код
  Аутентификация успешна если пользователь ввел правильный PIN-код

  Предыстория:
    Допустим пользователь вставляет в банкомат банковскую карту
    И банкомат выдает сообщение о необходимости ввода PIN-кода

  @correct
  Сценарий: Успешная аутентификация
    Если пользователь вводит корректный PIN-код
    То банкомат отображает меню и количество доступных денег на счету

Выведет в консоль:

аутентификация-банковской-карты;успешная-аутентификация
Успешная аутентификация
passed
false
[@correct, @all]

В заключение

Cucumber — очень мощный и гибкий фреймворк, который можно использовать в связке со многими другими популярными инструментами. Например, с Selenium – фреймворком для автоматизации веб-приложений, или Yandex.Allure – библиотекой, позволяющей создавать удобные отчеты.
Всем удачи в автоматизации.

Обсудить в форуме

На что обратить внимание?

  1. Концепция BDD — есть расширение методологии TDD.
  2. Тесты пишутся на предметно-ориентированном языке, их легко изменять.
  3. Тесты становятся доступны как программистам и тестировщикам, так и менеджерам.
  4. Тесты не зависят от целевого языка программирования. Миграция на другой язык сильно упрощается.

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

Сценарий – описание поведения определенной функциональности системы, составленное на естественном языке по определенному шаблону. Важно, что для подготовки сценариев используются общеупотребительные языки. Это позволяет автоматизаторам и тестировщикам заказчика легко составлять сценарии вместе.

Общеупотребительный язык – определенные лингвистические конструкции, интерпретируемые программным кодом автотестов. Как следствие, отпадает необходимость трудозатрат на преломление, изменение или же конкретизацию документации под разработку или QA.

BDD фокусируется на следующих вопросах:

  1. С чего начинается процесс.
  2. Что нужно тестировать, а что нет.
  3. Сколько проверок должно быть совершено за один раз.
  4. Что можно назвать проверкой.
  5. Как понять, почему тест не прошёл.

Исходя из этих вопросов, BDD требует, чтобы шаги тестов были целыми предложениями, которые начинаются с глагола в сослагательном наклонении и следовали бизнес целям.

Описание приемочных тестов должно вестись на гибком языке пользовательской истории. В настоящее время в практике BDD устоялась следующая структура:
1) Заголовок (англ. Title). В сослагательной форме должно быть дано описание бизнес-цели.

2) Описание (англ. Narrative). В краткой и свободной форме должны быть раскрыты следующие вопросы:

  1. Кто является заинтересованным лицом данной истории;
  2. Что входит в состав данной истории;
  3. Какую ценность данная история предоставляет для бизнеса

3) Сценарии (англ. Scenarios). В одной спецификации может быть один и более сценариев, каждый из которых раскрывает одну из ситуаций поведения пользователя. Каждый сценарий обычно строится по одной и той же схеме:

  1. Начальные условия (одно или несколько);
  2. Событие, которое инициирует начало этого сценария;
  3. Ожидаемый результат или результаты.

На что обратить внимание?

  1. Технически сопоставление происходит посредством регулярного выражения /^User enters login ‘(.+)’$/ , которое и находится в Step Definition.
  2. Логин пользователя (он же захваченный параметр ‘user_login’) передается в переменную login_word. Она в свою очередь передается на вход функции enter().

2) Результаты шагов
Исполнение каждого шага завершается в одним из следующих статусов:

  1. Success
  2. Undefined
  3. Pending
  4. Failed Steps
  5. Skipped
  6. Ambiguous

Рассмотрим каждый более детально:
1) Success
В случае, если Cucumber находит нужный Step Definition, он запускает выполнение содержимого шага. Если блок кода в соответствующем Step Definition не выдает ошибок по ходу исполнения, шаг помечается как успешный.
Цвет: зеленый

2) Undefined
Если Cucumber не удается найти соответствующее определение шага, то степ помечается как неопределенный и все последующие шаги в сценарии будут пропущены.
Цвет: желтый

3) Pending
Если определение шага выполнено не полностью, то шаг помечается как в ожидании.
Цвет: желтый

4) Failed Steps
Если блок кода внутри Step Definition завершается с ошибкой, то шаг считается проваленным.
Цвет: красный

5) Skipped
Шаги, следующие за Undefined, Pending и Failed степами, не вызываются.
Цвет: голубой

6) Ambiguous
Чтобы Cucumber точно знал, какой блок кода ему вызывать, определение шага должно быть строго уникальным. Cucumber возвращает Cucumber::Ambiguous error, в случае если присутствуют неоднозначные Step Definitions.

3) Организация хранения шагов

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

Технически абсолютно неважно, как будут называться эти файлы, и какие шаги будут в них храниться. Однако существует рекомендация называть их *_steps.rb (если используется Ruby).
Например, в приложении для резюме будет уместно выделить следующие файлы:

Копирование и вставка сценариев использующих разные значения очень быстро становится утомительным:

Сценарий: съесть 5 из 12
  Пусть есть 12 огуречиков
  Когда я съел 5 огуречиков
  Тогда у меня должно остаться 7 оругечиков
Сценарий: съесть 5 из 20
  Пусть есть 20 огуречиков
  Когда я съел 5 огуречиков
  Тогда у меня должно остаться 15 огуречиков
     
Scenario: eat 5 out of 12
  Given there are 12 cucumbers
  When I eat 5 cucumbers
  Then I should have 7 cucumbers

Scenario: eat 5 out of 20
  Given there are 20 cucumbers
  When I eat 5 cucumbers
  Then I should have 15 cucumbers

Структуры сценариев (scenario outlines) позволяют нам более кратко передавать такие примеры используя шаблоны с вставками (placeholders) при помощи ключевых слов Структура сценария (Scenario Outline), Примеры (Examples) и символов <> для выделения параметров:

Структура сценария: поедание
  Пусть есть <изначально> огуречиков
  Когда я съел <съедено> огуречиков
  Тогда у меня должно остаться <осталось> огуречиков

  Примеры:
 | изначально | съедено | осталось |
 | 12 | 5 | 7 |
 | 20 | 5 | 15 |
  
Scenario Outline: eating
  Given there are <start> cucumbers
  When I eat <eat> cucumbers
  Then I should have <left> cucumbers

  Examples:
 | start | eat | left |
 | 12 | 5 | 7 |
 | 20 | 5 | 15 |
  

Шаги Структуры сценария (Scenario Outline) представляют из себя шаблон, который никогда не будет выполнен напрямую. Вместо этого структура сценария запускается для каждой строки в Примерах (Examples) кроме первой (с заголовками).

Это работает благодаля вставкам (placeholders). Вставки (Placeholders) должны быть расположены между знаков < >. Например:

    Пусть <я обычная вставка и у меня всё в порядке>  
    Given <I'm a placeholder and I'm ok>

Вставки (placeholders) отмечают места куда должны быть вставлены настоящие значения из таблицы Примеров (Examples). Если текст вставки (placeholder) совпадает с названием колонки в таблице примеров (examples), тогда значения из этой колонки будут вставлены вместо вставки (placeholder).

Так же можно использовать вставки (placeholders) в Multiline Step Arguments.

ВАЖНО: Ваши определения шагов (step definitions) никогда не будут совпадать со значениями вставки. Вместо них всегда будут подставлены значения из таблицы примеров (examples)

Например, когда будет выполнена первая строка из таблицы примеров (examples):

    Examples:
 | start | eat | left |
 | 12 | 5 | 7 |
  

Выполнится следующий сценарий:

    Scenario: controlling order
  Given there are 12 cucumbers # <start> replaced with 12
  When I eat 5 cucumbers # <eat> replaced with 5
  Then I should have 7 cucumbers # <left> replaced with 7
  

Огурец – Обзор

Чтобы получить больше преимуществ от тестирования программного обеспечения, организации в настоящее время делают шаг вперед. Они реализуют важные сценарии приемочных испытаний, пока идет разработка. Этот подход обычно известен как развитие, управляемое поведением (BDD).

Behavior Driven Development дает нам возможность создавать тестовые сценарии как с точки зрения разработчика, так и клиента. Таким образом, вначале разработчики, менеджеры проектов, QA, тестировщики приемлемости пользователей и владелец продукта (акционер) все собрались вместе и обсудили, какие тестовые сценарии следует пройти, чтобы назвать это программное обеспечение / приложение успешным. Таким образом, они предлагают набор тестовых сценариев. Все эти тестовые сценарии написаны на простом английском языке, поэтому они также служат для документации.

пример

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

  • Пользователь должен иметь возможность войти в систему с правильным именем пользователя и правильным паролем.

  • Пользователь не должен иметь возможность войти в систему с неправильным именем пользователя и правильным паролем.

  • Пользователь не должен иметь возможность войти в систему с правильным именем пользователя и неправильным паролем.

Пользователь должен иметь возможность войти в систему с правильным именем пользователя и правильным паролем.

Пользователь не должен иметь возможность войти в систему с неправильным именем пользователя и правильным паролем.

Пользователь не должен иметь возможность войти в систему с правильным именем пользователя и неправильным паролем.

Как это устроено

К тому времени, когда код готов, тестовые сценарии тоже готовы. Код должен пройти тестовые сценарии, определенные в BDD. Если этого не произойдет, потребуется рефакторинг кода. Код блокируется только после успешного выполнения определенных тестовых сценариев.

BDD

Это очень простое понятие, но то, что нам нужно для реализации этой концепции. Ответ таков: структура, управляемая поведением (BDD). Cucumber – один из таких инструментов с открытым исходным кодом, который поддерживает разработку, основанную на поведении. Чтобы быть более точным, Cucumber может быть определен как структура тестирования, основанная на простом английском тексте. Он служит документацией, автоматизированными тестами и средством разработки – все в одном.

Так что же делает огурец? Это может быть описано в следующих шагах –

Огурец читает код, написанный простым английским текстом (язык Gherkin – будет представлен позже в этом руководстве) в файле возможностей (будет представлен позже).

Он находит точное соответствие каждого шага в определении шага (файл кода – подробности предоставлены позже в руководстве).

Куском кода, который должен быть выполнен, могут быть различные программные среды, такие как Selenium, Ruby on Rails и т. Д. Не каждый инструмент среды BDD поддерживает каждый инструмент.

Это стало причиной популярности Cucumber среди других фреймворков, таких как JBehave, JDave, Easyb и т. Д.

Cucumber поддерживает более десятка различных программных платформ, таких как –

  • Рубин на рельсах
  • Селен
  • PicoContainer
  • Spring Framework
  • Watir

Преимущества огурца перед другими инструментами

  • Cucumber поддерживает разные языки, такие как Java.net и Ruby.

  • Он действует как мост между деловым и техническим языком. Мы можем сделать это, создав тестовый пример в простом английском тексте.

  • Он позволяет писать тестовый скрипт без знания какого-либо кода, он также позволяет привлекать и непрограммистов.

  • В отличие от других инструментов, он служит целям комплексной среды тестирования.

  • Благодаря простой архитектуре тестового сценария, Cucumber обеспечивает повторное использование кода.

Cucumber поддерживает разные языки, такие как Java.net и Ruby.

Он действует как мост между деловым и техническим языком. Мы можем сделать это, создав тестовый пример в простом английском тексте.

Он позволяет писать тестовый скрипт без знания какого-либо кода, он также позволяет привлекать и непрограммистов.

В отличие от других инструментов, он служит целям комплексной среды тестирования.

Благодаря простой архитектуре тестового сценария, Cucumber обеспечивает повторное использование кода.

Огурец – Окружающая среда

В этой главе мы увидим настройку среды для Cucumber с Selenium WebDriver и Java на Windows Machine.

Предварительные условия для настройки среды

Ниже приведены предварительные условия, необходимые для настройки –

Джава

Зачем нам нужно – Java – это надежный язык программирования. Cucumber поддерживает платформу Java для выполнения.

Как установить

Шаг 1 – Загрузите jdk и jre по следующей ссылке http://www.oracle.com/technetwork/java/javase/downloads/index.html

Шаг 2 – Примите лицензионное соглашение.

Шаг 3 – Установите JDK и JRE.

Шаг 4 – Установите переменную среды, как показано на следующих скриншотах.

Свойства системы

Изменить системную переменную

Затмение

Зачем нам это нужно – Eclipse – интегрированная среда разработки (IDE). Он содержит базовое рабочее пространство и расширяемую систему плагинов для настройки среды.

Как установить

Шаг 1 – Убедитесь, что на вашем компьютере установлена ​​JAVA.

Шаг 2 – Загрузите Eclipse с https://eclipse.org/downloads/

Шаг 3 – Распакуйте и Eclipse установлен.

специалист

Зачем нам это нужно – Maven – это инструмент автоматизации сборки, используемый в основном для проектов Java. Он предоставляет общую платформу для выполнения таких действий, как генерация исходного кода, компиляция кода, упаковка кода в jar и т. Д. Позже, если какая-либо из версий программного обеспечения изменяется, Maven предоставляет простой способ соответствующим образом изменить тестовый проект.

Как установить

Шаг 1 – Загрузите Maven по следующей ссылке – https://maven.apache.org/download.cgi

Шаг 2 – Распакуйте файл и запомните местоположение.

Шаг 3 – Создайте переменную окружения MAVEN_HOME, как показано на следующем снимке экрана.

Системные переменные

Шаг 4 – Редактируйте переменную Path и включите Maven, как показано на следующем снимке экрана.

Изменить переменную пути

Шаг 5 – Загрузите плагин MAVEN из Eclipse.

Шаг 6 – Откройте Eclipse.

Шаг 7 – Перейдите в Справка → Торговая площадка Eclipse → Поиск Maven → Интеграция Maven для Eclipse → INSTALL.

Настройте огурец с Maven

Шаг 1 – Создайте проект Maven.

  • Перейдите в Файл → Создать → Другие → Maven → Проект Maven → Далее.

  • Укажите идентификатор группы (идентификатор группы будет идентифицировать ваш проект однозначно во всех проектах).

  • Укажите идентификатор артефакта (идентификатор артефакта – это имя банки без версии. Вы можете выбрать любое имя, которое находится в нижнем регистре). Нажмите на Готово.

Перейдите в Файл → Создать → Другие → Maven → Проект Maven → Далее.

Укажите идентификатор группы (идентификатор группы будет идентифицировать ваш проект однозначно во всех проектах).

Укажите идентификатор артефакта (идентификатор артефакта – это имя банки без версии. Вы можете выбрать любое имя, которое находится в нижнем регистре). Нажмите на Готово.

Проект New Maven

Шаг 2 – Откройте pom.xml.

  • Перейдите к исследователю пакетов в левой части Eclipse.

  • Разверните проект CucumberTest .

  • Найдите файл pom.xml .

  • Щелкните правой кнопкой мыши и выберите опцию, откройте «Текстовый редактор».

Перейдите к исследователю пакетов в левой части Eclipse.

Разверните проект CucumberTest .

Найдите файл pom.xml .

Щелкните правой кнопкой мыши и выберите опцию, откройте «Текстовый редактор».

Шаг 3 – Добавить зависимость для селена: это будет указывать Maven, какие файлы Selenium JAR должны быть загружены из центрального хранилища в локальное хранилище.

  • Откройте pom.xml в режиме редактирования, создайте тег зависимостей (<dependencies> </ dependencies>) внутри тега проекта.

  • Внутри тега зависимости создайте тег зависимости (<зависимость> </ зависимость>).

  • Укажите следующую информацию в теге зависимости.

Откройте pom.xml в режиме редактирования, создайте тег зависимостей (<dependencies> </ dependencies>) внутри тега проекта.

Внутри тега зависимости создайте тег зависимости (<зависимость> </ зависимость>).

Укажите следующую информацию в теге зависимости.

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

Шаг 4. Добавление зависимости для Cucumber-Java: это будет указывать Maven, какие файлы Cucumber должны быть загружены из центрального репозитория в локальный репозиторий.

  • Создайте еще один тег зависимости.

  • Укажите следующую информацию в теге зависимости

Создайте еще один тег зависимости.

Укажите следующую информацию в теге зависимости

<dependency> 
   <groupId>info.cukes</groupId>
   <artifactId>cucumber-java</artifactId> 
   <version>1.0.2</version> 
   <scope>test</scope> 
</dependency>

Шаг 5. Добавление зависимости для Cucumber-JUnit: это будет указывать Maven, какие файлы Cucumber JUnit следует загружать из центрального репозитория в локальный репозиторий.

  • Создайте еще один тег зависимости.

  • Укажите следующую информацию в теге зависимости

Создайте еще один тег зависимости.

Укажите следующую информацию в теге зависимости

<dependency> 
   <groupId>info.cukes</groupId> 
   <artifactId>cucumber-junit</artifactId> 
   <version>1.0.2</version> 
   <scope>test</scope> 
</dependency>

Шаг 6 – Добавьте зависимость для JUnit: это будет указывать Maven, какие файлы JUnit должны быть загружены из центрального репозитория в локальный репозиторий.

  • Создайте еще один тег зависимости.

  • Укажите следующую информацию в теге зависимости.

Создайте еще один тег зависимости.

Укажите следующую информацию в теге зависимости.

<dependency> 
   <groupId>junit</groupId> 
   <artifactId>junit</artifactId> 
   <version>4.10</version> 
   <scope>test</scope> 
</dependency>

Шаг 7 – Проверьте двоичные файлы.

  • После успешного редактирования pom.xml сохраните его.

  • Перейдите в Проект → Очистить – это займет несколько минут.

После успешного редактирования pom.xml сохраните его.

Перейдите в Проект → Очистить – это займет несколько минут.

Вы сможете увидеть репозиторий Maven, как показано на следующем скриншоте.

Проводник пакетов

  • Создайте файл объектов (будет рассмотрен позже).

  • Создайте файл определения шага (будет рассмотрен позже).

  • Создайте JUnit Runner для запуска теста (будет рассмотрено позже).

Создайте файл объектов (будет рассмотрен позже).

Создайте файл определения шага (будет рассмотрен позже).

Создайте JUnit Runner для запуска теста (будет рассмотрено позже).

Огурец – корнишоны

Пока что у нас есть понимание огурца и того, что он делает. Он выполняет тестовые сценарии, которые были определены в файле возможностей (о чем пойдет речь в последующих главах). Язык, на котором написаны эти исполняемые файлы объектов, известен как Gherkin . Gherkin – это простой английский текстовый язык, который помогает инструменту Cucumber интерпретировать и выполнять тестовые сценарии.

Можно подумать, что много раз обсуждалось, что Cucumber поддерживает простой английский текст, тогда почему нам нужен отдельный язык – корнишоны. Ответ лежит в концепции развития, управляемого поведением.

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

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

пример

Особенность – Функциональность входа для сайта социальной сети. Учитывая, что я пользователь социальной сети. Когда я ввожу имя пользователя как username1. И я ввожу пароль как пароль1. Тогда я должен быть перенаправлен на домашнюю страницу сайта.

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

Пример нескольких других ключевых слов –

  • Фон
  • Но
  • *
  • План сценария
  • Примеры

Огурец проанализирует каждый шаг, записанный в файле определения шага (будет рассмотрен позже). Таким образом, шаги, упомянутые в файле возможностей и файле определения шагов (будут рассмотрены позже), должны совпадать.

Вы можете найти банки с корнишонами в папке Maven Dependency в Package Explorer. Он загружается вместе с другими банками огурца. Это будет похоже на следующий скриншот –

Корнишоны

Еще один интересный факт о корнишоне – он поддерживает не только английский, но и многие другие родные языки, такие как французский, финский, индонезийский, венгерский, хинди, урду, гуджарати и т. Д.

Огурец – Особенности

Функция может быть определена как отдельная единица или функциональность проекта. Давайте рассмотрим очень распространенный пример сайта социальной сети. Как выглядит особенность этого продукта / проекта? Несколько основных функций могут быть определены как –

  • Создайте и удалите пользователя из социальной сети.

  • Функциональность входа пользователя на сайт социальной сети.

  • Обмен фотографиями или видео на сайте социальной сети.

  • Отправка запроса на добавление в друзья.

  • Выйти.

Создайте и удалите пользователя из социальной сети.

Функциональность входа пользователя на сайт социальной сети.

Обмен фотографиями или видео на сайте социальной сети.

Отправка запроса на добавление в друзья.

Выйти.

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

Функция обычно содержит список сценариев, которые должны быть протестированы для этой функции. Файл, в котором мы храним функции, описание функций и сценариев, которые необходимо протестировать, называется Feature File . Мы увидим больше о функциональных файлах в следующей главе.

Ключевое слово для представления тестируемой функции в Gherkins – «Feature». Рекомендуется написать небольшое описание функции под названием функции в файле функций. Это также удовлетворит потребность в хорошей документации.

пример

Особенность – Функциональность входа для сайта социальной сети.

Пользователь должен иметь возможность войти на сайт социальной сети, если имя пользователя и пароль верны.

Пользователю должно отображаться сообщение об ошибке, если имя пользователя и пароль неверны.

Пользователь должен перейти на домашнюю страницу, если имя пользователя и пароль верны.

Файлы функций

Файл, в котором написаны тесты Cucumber, известен как файлы компонентов. Желательно, чтобы для каждой тестируемой функции был отдельный файл. Расширение файла функции должно быть «.feature».

Можно создать столько файлов объектов, сколько необходимо. Чтобы иметь организованную структуру, у каждого объекта должен быть один файл объектов.

Например –

Sr.No Особенность Имя файла функции
1 Логин пользователя userLogin.feature
2 Поделиться постом sharePost.feature
3 Создать учетную запись createAccount.feature
4 Удалить аккаунт deleteAccount.feature

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

Простой файл функций состоит из следующих ключевых слов / частей –

  • Feature – Название тестируемой функции.

  • Описание (необязательно). Опишите тестируемую функцию.

  • Сценарий – что такое тестовый сценарий.

  • Дано – Предварительное условие перед выполнением шагов теста.

  • Когда – конкретное условие, которое должно соответствовать, чтобы выполнить следующий шаг.

  • Затем – Что должно произойти, если условие, указанное в КОГДА, удовлетворяется.

Feature – Название тестируемой функции.

Описание (необязательно). Опишите тестируемую функцию.

Сценарий – что такое тестовый сценарий.

Дано – Предварительное условие перед выполнением шагов теста.

Когда – конкретное условие, которое должно соответствовать, чтобы выполнить следующий шаг.

Затем – Что должно произойти, если условие, указанное в КОГДА, удовлетворяется.

пример

ОсобенностьВход пользователя в социальную сеть.

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

Пользователю должно отображаться сообщение об ошибке, если имя пользователя и пароль неверны.

Пользователь должен перейти на домашнюю страницу, если имя пользователя и пароль верны.

Схема – Функциональность входа для сайта социальной сети.

Данный пользователь переходит на Facebook. Когда я ввожу имя пользователя как «<имя пользователя>» и пароль как «<пароль>». Тогда логин должен быть неудачным.

| username  | password  |
| username1 | password1 |

* Ключевое слово AND используется для отображения связи между двумя условиями. И может использоваться с любыми другими ключевыми словами, такими как GIVEN, WHEN и THEN .

Нет логических подробностей, записанных в файле возможностей.

Определения шагов

У нас есть готовый файл функций с определенными тестовыми сценариями. Тем не менее, это еще не все сделано. Огурец на самом деле не знает, какой фрагмент кода должен быть выполнен для какого-либо конкретного сценария, описанного в файле возможностей.

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

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

Пример файла определения шага

public void goToFacebook() { 
   driver = new FirefoxDriver(); 
   driver.navigate().to("https://www.facebook.com/"); 
} 
@When "^user logs in using Username as "([^"]*)" and Password as "([^"]*)"$"
public void I_enter_Username_as_and_Password_as(String arg1, String arg2) {
   driver.findElement(By.id("email")).sendKeys(arg1);
   driver.findElement(By.id("pass")).sendKeys(arg2);
   driver.findElement(By.id("u_0_v")).click(); 
} 
@Then"^login should be unsuccessful$" 
public void validateRelogin() { 
   if(driver.getCurrentUrl().equalsIgnoreCase(
      "https://www.facebook.com/login.php?login_attempt=1&lwv=110")){ 
         System.out.println("Test Pass");
   } else { 
      System.out.println("Test Failed"); 
   } 
   driver.close(); 
}

Таким образом, для каждой функции, независимо от того, какой код вы хотите выполнить на каждом шаге теста (например, GIVEN / THEN / WHEN), вы можете написать его в файле определения шага. Убедитесь, что код / ​​функция была определена для каждого из шагов.

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

Огурец – Сценарии

Сценарий является одной из основных структур корнишона. Каждый сценарий начинается с ключевого слова «Сценарий:» (или локализованного) и сопровождается необязательным заголовком сценария. Каждая функция может иметь один или несколько сценариев, и каждый сценарий состоит из одного или нескольких этапов. Очень простой пример сценария может быть –

Сценарий – проверка функциональности справки.

Данный пользователь переходит на Facebook.

Когда пользователь нажимает кнопку Справка, открывается страница справки.

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

Схема сценария аналогична структуре сценария; Единственная разница заключается в предоставлении нескольких входов. Как вы можете видеть в следующем примере, контрольный пример остается тем же и не повторяемым. Внизу мы предоставили несколько входных значений для переменных «Имя пользователя» и «Пароль». Во время выполнения фактического теста Cucumber заменит переменную на введенные значения и выполнит тест. После выполнения pass-1 тест будет перезапущен для второй итерации с другим входным значением. Такая переменная или заполнители могут быть представлены знаком «<>» при упоминании в выражениях корнишона.

пример

Схема сценария – Функциональность входа для сайта социальной сети. Данный пользователь переходит на Facebook.

Когда пользователь входит в систему, используя имя пользователя как «<имя пользователя>» и пароль как «<пароль>», то вход должен быть успешным.

| username | password  | 
| user1    | password1 | 
| user2    | password2 |

Есть несколько советов и приемов, чтобы правильно определить сценарии Cucumber.

  • Каждый шаг должен быть четко определен, чтобы он не создавал путаницы для читателя.

  • Не повторяйте сценарий тестирования, если необходимо, используйте схему сценария для реализации повторения.

  • Разработайте шаг теста таким образом, чтобы его можно было использовать в нескольких сценариях и набросках сценариев.

  • Насколько это возможно, держите каждый шаг полностью независимым. Например: «Данный пользователь вошел в систему». Это можно разделить на два этапа

    • При условии, что пользователь вводит имя пользователя.
    • Клики по логину.

Каждый шаг должен быть четко определен, чтобы он не создавал путаницы для читателя.

Не повторяйте сценарий тестирования, если необходимо, используйте схему сценария для реализации повторения.

Разработайте шаг теста таким образом, чтобы его можно было использовать в нескольких сценариях и набросках сценариев.

Насколько это возможно, держите каждый шаг полностью независимым. Например: «Данный пользователь вошел в систему». Это можно разделить на два этапа

Огурец – Аннотации

Аннотация – это предопределенный текст, который имеет определенное значение. Это позволяет компилятору / интерпретатору знать, что нужно делать после выполнения. Огурец получил следующие несколько аннотаций –

  • Дано

    • Он описывает предварительные условия для теста, который будет выполнен.

    • Пример – ПОДАРОК ​​Я пользователь Facebook

  • Когда

    • Он определяет точку запуска для выполнения любого тестового сценария.

    • Пример – КОГДА я ввожу “<имя пользователя>”

  • Тогда

    • Затем содержит ожидаемый результат для теста, который будет выполнен.

    • Пример – ТОГДА логин должен быть успешным.

  • И

    • Он обеспечивает логическое условие И между любыми двумя операторами. И может использоваться в сочетании с инструкциями GIVEN, WHEN и THEN.

    • Пример – КОГДА я ввожу свой «<username>» И я вводю свой «<пароль>»

  • Но

    • Это означает логическое условие ИЛИ между любыми двумя утверждениями. ИЛИ может использоваться вместе с инструкциями GIVEN, WHEN и THEN.

    • Пример – ТОГДА логин должен быть успешным. НО домашняя страница не должна отсутствовать.

  • Сценарий

    • Подробная информация о сценарии в тесте должна быть зафиксирована после ключевого слова «Сценарий:»

    • Пример –

      Сценарий:

      ПОДАРОК ​​Я пользователь Facebook

      КОГДА я вхожу в

      И я вхожу в мой

      ТОГДА логин должен быть успешным.

      НО домашняя страница не должна отсутствовать.

  • План сценария – (будет рассмотрен позже)

  • Примеры – (будет рассмотрено позже)

  • Фон

    • Фон обычно содержит инструкцию о том, что настраивать перед выполнением каждого сценария. Однако он выполняется после хука «До» (будет рассмотрен позже). Так что это идеально подходит для кода, когда мы хотим настроить веб-браузер или установить соединение с базой данных.

      • Пример –

        Фон:

        Перейти на домашнюю страницу Facebook.

Дано

Он описывает предварительные условия для теста, который будет выполнен.

Пример – ПОДАРОК ​​Я пользователь Facebook

Когда

Он определяет точку запуска для выполнения любого тестового сценария.

Пример – КОГДА я ввожу “<имя пользователя>”

Тогда

Затем содержит ожидаемый результат для теста, который будет выполнен.

Пример – ТОГДА логин должен быть успешным.

И

Он обеспечивает логическое условие И между любыми двумя операторами. И может использоваться в сочетании с инструкциями GIVEN, WHEN и THEN.

Пример – КОГДА я ввожу свой «<username>» И я вводю свой «<пароль>»

Но

Это означает логическое условие ИЛИ между любыми двумя утверждениями. ИЛИ может использоваться вместе с инструкциями GIVEN, WHEN и THEN.

Пример – ТОГДА логин должен быть успешным. НО домашняя страница не должна отсутствовать.

Сценарий

Подробная информация о сценарии в тесте должна быть зафиксирована после ключевого слова «Сценарий:»

Пример –

Сценарий:

ПОДАРОК ​​Я пользователь Facebook

КОГДА я вхожу в

И я вхожу в мой

ТОГДА логин должен быть успешным.

НО домашняя страница не должна отсутствовать.

План сценария – (будет рассмотрен позже)

Примеры – (будет рассмотрено позже)

Фон

Фон обычно содержит инструкцию о том, что настраивать перед выполнением каждого сценария. Однако он выполняется после хука «До» (будет рассмотрен позже). Так что это идеально подходит для кода, когда мы хотим настроить веб-браузер или установить соединение с базой данных.

Пример –

Фон:

Перейти на домашнюю страницу Facebook.

Пример сценария

Давайте автоматизируем сценарий, чтобы лучше понимать аннотации.

Шаг 1

Создайте тестовый проект Maven с именем AnnotationTest .

  • Перейдите в Файл → Создать → Другие → Maven → Проект Maven → Далее.

  • Укажите идентификатор группы (идентификатор группы будет идентифицировать ваш проект однозначно во всех проектах).

  • Укажите идентификатор артефакта (идентификатор артефакта – это имя банки без версии. Вы можете выбрать любое имя в нижнем регистре).

  • Нажмите на Готово.

  • Откройте pom.xml –

    • Перейдите к исследователю пакетов в левой части Eclipse.

    • Разверните проект AnnotationTest.

    • Найдите файл pom.xml.

    • Щелкните правой кнопкой мыши и выберите опцию Открыть с помощью «Текстового редактора».

  • Добавить зависимость для Selenium – это будет указывать Maven, какие файлы jar Selenium следует загружать из центрального хранилища в локальное хранилище.

    • Откройте файл pom.xml в режиме редактирования, создайте тег зависимостей (<dependencies> </ dependencies>) внутри тега проекта.

    • Внутри тега зависимости создайте тег зависимости (<зависимость> </ зависимость>).

    • Укажите следующую информацию в теге зависимости.

Перейдите в Файл → Создать → Другие → Maven → Проект Maven → Далее.

Укажите идентификатор группы (идентификатор группы будет идентифицировать ваш проект однозначно во всех проектах).

Укажите идентификатор артефакта (идентификатор артефакта – это имя банки без версии. Вы можете выбрать любое имя в нижнем регистре).

Нажмите на Готово.

Откройте pom.xml –

Перейдите к исследователю пакетов в левой части Eclipse.

Разверните проект AnnotationTest.

Найдите файл pom.xml.

Щелкните правой кнопкой мыши и выберите опцию Открыть с помощью «Текстового редактора».

Добавить зависимость для Selenium – это будет указывать Maven, какие файлы jar Selenium следует загружать из центрального хранилища в локальное хранилище.

Откройте файл pom.xml в режиме редактирования, создайте тег зависимостей (<dependencies> </ dependencies>) внутри тега проекта.

Внутри тега зависимости создайте тег зависимости (<зависимость> </ зависимость>).

Укажите следующую информацию в теге зависимости.

<dependency> 
   <groupId>org.seleniumhq.selenium</groupId> 
   <artifactId>selenium-java</artifactId> 
   <version>2.47.1</version> 
</dependency>
  • Добавить зависимость для Cucumber-Java – это будет указывать Maven, какие файлы Cucumber должны быть загружены из центрального репозитория в локальный репозиторий.

    • Создайте еще один тег зависимости.

    • Предоставьте следующую информацию в теге зависимостей.

Добавить зависимость для Cucumber-Java – это будет указывать Maven, какие файлы Cucumber должны быть загружены из центрального репозитория в локальный репозиторий.

Создайте еще один тег зависимости.

Предоставьте следующую информацию в теге зависимостей.

<dependency> 
   <groupId>info.cukes</groupId> 
   <artifactId>cucumber-java</artifactId> 
   <version>1.0.2</version> 
   <scope>test</scope> 
</dependency>
  • Добавить зависимость для Cucumber-JUnit – это будет указывать Maven, какие файлы Cucumber JUnit должны быть загружены из центрального репозитория в локальный репозиторий.

    • Создайте еще один тег зависимости.

    • Укажите следующую информацию в теге зависимости.

Добавить зависимость для Cucumber-JUnit – это будет указывать Maven, какие файлы Cucumber JUnit должны быть загружены из центрального репозитория в локальный репозиторий.

Создайте еще один тег зависимости.

Укажите следующую информацию в теге зависимости.

<dependency> 
   <groupId>info.cukes</groupId> 
   <artifactId>cucumber-junit</artifactId> 
   <version>1.0.2</version> 
   <scope>test</scope> 
</dependency>
  • Добавить зависимость для JUnit – это будет указывать Maven, какие файлы JUnit должны быть загружены из центрального репозитория в локальный репозиторий.

    • Создайте еще один тег зависимости.

    • Укажите следующую информацию в теге зависимости.

Добавить зависимость для JUnit – это будет указывать Maven, какие файлы JUnit должны быть загружены из центрального репозитория в локальный репозиторий.

Создайте еще один тег зависимости.

Укажите следующую информацию в теге зависимости.

<dependency> 
   <groupId>junit</groupId> 
   <artifactId>junit</artifactId> 
   <version>4.10</version> 
   <scope>test</scope> 
</dependency>
  • Проверьте двоичные файлы.

    • После успешного редактирования pom.xml сохраните его.

    • Перейдите в Проект → Очистить – это займет несколько минут.

Проверьте двоичные файлы.

После успешного редактирования pom.xml сохраните его.

Перейдите в Проект → Очистить – это займет несколько минут.

Шаг 2

Создайте пакет с именем Annotation в src / test / java

  • Выберите недавно созданный проект.

  • Щелкните правой кнопкой мыши и выберите «Новый».

  • Выберите опцию «Пакет».

  • Назовите это как «Аннотация».

  • Сохрани это.

Выберите недавно созданный проект.

Щелкните правой кнопкой мыши и выберите «Новый».

Выберите опцию «Пакет».

Назовите это как «Аннотация».

Сохрани это.

Шаг 3

Создайте файл объектов с именем annotation.feature .

  • Выберите и щелкните правой кнопкой мыши на схеме пакета.

  • Нажмите на «Новый» файл.

  • Дайте файлу имя, такое как outline.feature .

  • Запишите следующий текст в файл и сохраните его.

Выберите и щелкните правой кнопкой мыши на схеме пакета.

Нажмите на «Новый» файл.

Дайте файлу имя, такое как outline.feature .

Запишите следующий текст в файл и сохраните его.

Feature: annotation 
#This is how background can be used to eliminate duplicate steps 

Background: 
   User navigates to Facebook Given 
   I am on Facebook login page 

#Scenario with AND 
Scenario: 
   When I enter username as "TOM"
   And I enter password as "JERRY" 
   Then Login should fail 

#Scenario with BUT 
Scenario: 
   When I enter username as "TOM" 
   And I enter password as "JERRY" 
   Then Login should fail 
   But Relogin option should be available

Шаг 4

Создайте файл определения шага.

  • Выберите и щелкните правой кнопкой мыши на схеме пакета.

  • Нажмите на «Новый» файл.

  • Дайте имя файла как annotation.java

  • Запишите следующий текст в файл и сохраните его.

Выберите и щелкните правой кнопкой мыши на схеме пакета.

Нажмите на «Новый» файл.

Дайте имя файла как annotation.java

Запишите следующий текст в файл и сохраните его.

package Annotation; 

import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.firefox.FirefoxDriver; 

import cucumber.annotation.en.Given; 
import cucumber.annotation.en.Then; 
import cucumber.annotation.en.When; 

public class annotation { 
   WebDriver driver = null; 
   @Given("^I am on Facebook login page$") 
	
   public void goToFacebook() { 
      driver = new FirefoxDriver(); 
      driver.navigate().to("https://www.facebook.com/"); 
   }
	
   @When("^I enter username as "(.*)"$") 
   public void enterUsername(String arg1) {   
      driver.findElement(By.id("email")).sendKeys(arg1); 
   }
	
   @When ("^I enter password as "(.*)"$") 
   public void enterPassword(String arg1) {
      driver.findElement(By.id("pass")).sendKeys(arg1);
      driver.findElement(By.id("u_0_v")).click(); 
   } 
	
   @Then("^Login should fail$") 
   public void checkFail() {  
      if(driver.getCurrentUrl().equalsIgnoreCase(
         "https://www.facebook.com/login.php?login_attempt=1&lwv=110")){ 
            System.out.println("Test1 Pass"); 
      } else { 
         System.out.println("Test1 Failed"); 
      } 
      driver.close(); 
   } 
	
   @Then("^Relogin option should be available$") 
   public void checkRelogin() { 
      if(driver.getCurrentUrl().equalsIgnoreCase(
         "https://www.facebook.com/login.php?login_attempt=1&lwv=110")){ 
            System.out.println("Test2 Pass"); 
      } else { 
         System.out.println("Test2 Failed"); 
      } 
      driver.close(); 
   }
} 

Шаг 5

Создайте файл класса бегуна.

  • Выберите и щелкните правой кнопкой мыши на схеме пакета.

  • Нажмите на «Новый» файл.

  • Дайте файлу имя, например, runTest.java

  • Запишите следующий текст в файл и сохраните его.

Выберите и щелкните правой кнопкой мыши на схеме пакета.

Нажмите на «Новый» файл.

Дайте файлу имя, например, runTest.java

Запишите следующий текст в файл и сохраните его.

package Annotation; 

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

@RunWith(Cucumber.class) 
@Cucumber.Options(format = {"pretty", "html:target/cucumber"})
 
public class runTest { 
}

Шаг 6

Запустите тест, используя опцию –

  • Выберите файл runTest.java из проводника пакетов.

  • Щелкните правой кнопкой мыши и выберите параметр «Запуск от имени».

  • Выберите JUnit test.

Выберите файл runTest.java из проводника пакетов.

Щелкните правой кнопкой мыши и выберите параметр «Запуск от имени».

Выберите JUnit test.

При запуске этого файла класса вы увидите следующее:

  • Facebook открывается в новом экземпляре браузера Firefox.

  • TOM будет передан в качестве ввода в поле имени пользователя.

  • Джерри будет передан в качестве ввода в поле пароля.

  • Логин будет нажат.

  • В браузере появится сообщение о неудачном входе в систему.

  • В консоли вы увидите напечатанный «Test Pass»

  • Шаг с 1 по 5. Будет повторен для имени пользователя как “” и пароля как “”.

Facebook открывается в новом экземпляре браузера Firefox.

TOM будет передан в качестве ввода в поле имени пользователя.

Джерри будет передан в качестве ввода в поле пароля.

Логин будет нажат.

В браузере появится сообщение о неудачном входе в систему.

В консоли вы увидите напечатанный «Test Pass»

Шаг с 1 по 5. Будет повторен для имени пользователя как “” и пароля как “”.

Огурец – набросок сценария

Схема сценария в основном заменяет переменную / ключевые слова значением из таблицы. Каждая строка в таблице считается сценарием.

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

Сценарий:

Данный пользователь переходит на Facebook

Когда я ввожу правильное имя пользователя и пароль

Тогда вход должен быть успешным

Сценарий:

Данный пользователь переходит на Facebook

Когда я ввожу правильный адрес электронной почты и пароль

Тогда вход должен быть успешным

Сценарий:

Данный пользователь переходит на Facebook

Когда я ввожу правильный номер телефона и пароль

Тогда вход должен быть успешным

Здесь, если мы посмотрим ближе, для вышеупомянутых трех сценариев: операторы одинаковы, изменяется только входной параметр (имя пользователя / адрес электронной почты / номер телефона). Вот где важность набросков сценария вступает в картину.

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

пример

Давайте создадим пример схемы сценария –

Шаг 1 – Создайте тестовый проект Maven с именем ScenarioOutlineTest

  • Перейдите в Файл → Создать → Другие → Maven → Проект Maven → Далее.

  • Укажите идентификатор группы (идентификатор группы будет идентифицировать ваш проект однозначно во всех проектах).

  • Укажите идентификатор артефакта (идентификатор артефакта – это имя банки без версии. Вы можете выбрать любое имя в нижнем регистре).

  • Нажмите на Готово.

  • Откройте pom.xml

    • Перейдите к исследователю пакетов в левой части Eclipse.

    • Разверните проект CucumberTest.

    • Найдите файл pom.xml.

    • Щелкните правой кнопкой мыши и выберите опцию Открыть с помощью «Текстового редактора».

  • Добавить зависимость для Selenium – это будет указывать Maven, какие файлы jar Selenium следует загружать из центрального хранилища в локальное хранилище.

    • Откройте файл pom.xml в режиме редактирования, создайте тег зависимостей (<dependencies> </ dependencies>) внутри тега проекта.

    • Внутри тега зависимости создайте тег зависимости (<зависимость> </ зависимость>).

    • Укажите следующую информацию в теге зависимости.

Перейдите в Файл → Создать → Другие → Maven → Проект Maven → Далее.

Укажите идентификатор группы (идентификатор группы будет идентифицировать ваш проект однозначно во всех проектах).

Укажите идентификатор артефакта (идентификатор артефакта – это имя банки без версии. Вы можете выбрать любое имя в нижнем регистре).

Нажмите на Готово.

Откройте pom.xml

Перейдите к исследователю пакетов в левой части Eclipse.

Разверните проект CucumberTest.

Найдите файл pom.xml.

Щелкните правой кнопкой мыши и выберите опцию Открыть с помощью «Текстового редактора».

Добавить зависимость для Selenium – это будет указывать Maven, какие файлы jar Selenium следует загружать из центрального хранилища в локальное хранилище.

Откройте файл pom.xml в режиме редактирования, создайте тег зависимостей (<dependencies> </ dependencies>) внутри тега проекта.

Внутри тега зависимости создайте тег зависимости (<зависимость> </ зависимость>).

Укажите следующую информацию в теге зависимости.

<dependency> 
   <groupId>org.seleniumhq.selenium</groupId> 
   <artifactId>selenium-java</artifactId> 
   <version>2.47.1</version> 
</dependency>
  • Добавить зависимость для Cucumber-Java: это будет указывать Maven, какие файлы Cucumber должны быть загружены из центрального репозитория в локальный репозиторий.

    • Создайте еще один тег зависимости.

    • Предоставьте следующую информацию в теге зависимостей.

Добавить зависимость для Cucumber-Java: это будет указывать Maven, какие файлы Cucumber должны быть загружены из центрального репозитория в локальный репозиторий.

Создайте еще один тег зависимости.

Предоставьте следующую информацию в теге зависимостей.

<dependency> 
   <groupId>info.cukes</groupId> 
   <artifactId>cucumber-java</artifactId> 
   <version>1.0.2</version> 
   <scope>test</scope> 
</dependency>
  • Добавить зависимость для Cucumber-JUnit: это будет указывать Maven, какие файлы Cucumber JUnit следует загружать из центрального репозитория в локальный репозиторий.

    • Создайте еще один тег зависимости.

    • Укажите следующую информацию в теге зависимости.

Добавить зависимость для Cucumber-JUnit: это будет указывать Maven, какие файлы Cucumber JUnit следует загружать из центрального репозитория в локальный репозиторий.

Создайте еще один тег зависимости.

Укажите следующую информацию в теге зависимости.

<dependency> 
   <groupId>info.cukes</groupId> 
   <artifactId>cucumber-junit</artifactId> 
   <version>1.0.2</version> 
   <scope>test</scope> 
</dependency>
  • Добавить зависимость для JUnit – это будет указывать Maven, какие файлы JUnit должны быть загружены из центрального репозитория в локальный репозиторий.

    • Создайте еще один тег зависимости.

    • Укажите следующую информацию в теге зависимости.

Добавить зависимость для JUnit – это будет указывать Maven, какие файлы JUnit должны быть загружены из центрального репозитория в локальный репозиторий.

Создайте еще один тег зависимости.

Укажите следующую информацию в теге зависимости.

<dependency> 
   <groupId>junit</groupId> 
   <artifactId>junit</artifactId> 
   <version>4.10</version> 
   <scope>test</scope> 
</dependency>
  • Добавить зависимость для JUnit – это будет указывать Maven, какие файлы JUnit должны быть загружены из центрального репозитория в локальный репозиторий.

    • Создайте еще один тег зависимости.

    • Укажите следующую информацию в теге зависимости.

Добавить зависимость для JUnit – это будет указывать Maven, какие файлы JUnit должны быть загружены из центрального репозитория в локальный репозиторий.

Создайте еще один тег зависимости.

Укажите следующую информацию в теге зависимости.

<dependency> 
   <groupId>junit</groupId> 
   <artifactId>junit</artifactId> 
   <version>4.10</version> 
   <scope>test</scope> 
</dependency>
  • Проверьте двоичные файлы.

    • После успешного редактирования pom.xml сохраните его.

    • Перейдите в Проект → Очистить – это займет несколько минут.

Проверьте двоичные файлы.

После успешного редактирования pom.xml сохраните его.

Перейдите в Проект → Очистить – это займет несколько минут.

Шаг 2 – Создайте пакет с именем «outline» в src / test / java

Пакет Java

Шаг 3 – Создайте файл объектов с именем «outline.feature»

  • Выберите и щелкните правой кнопкой мыши на схеме пакета.

  • Нажмите на «Новый» файл.

  • Дайте имя файла, например, “outline.feature”

    • Запишите следующий текст в файл и сохраните его.

      Особенность – Схема Сценария

      Схема сценария – Функциональность входа для сайта социальной сети.

      Данный пользователь переходит на Facebook

      Когда я ввожу имя пользователя как «<имя пользователя>» и пароль как «<пароль>»

      Тогда логин должен быть неудачным

Выберите и щелкните правой кнопкой мыши на схеме пакета.

Нажмите на «Новый» файл.

Дайте имя файла, например, “outline.feature”

Запишите следующий текст в файл и сохраните его.

Особенность – Схема Сценария

Схема сценария – Функциональность входа для сайта социальной сети.

Данный пользователь переходит на Facebook

Когда я ввожу имя пользователя как «<имя пользователя>» и пароль как «<пароль>»

Тогда логин должен быть неудачным

Пример

| username  | password  | 
| username1 | password1 | 
| username2 | password2 |

Примечание. Здесь примерная аннотация описывает диапазон входных данных, предоставляемых при выполнении сценария. Тестовый сценарий будет выполняться для каждого из предоставленных входных данных. Итак, в данном примере тестовый сценарий будет выполнен трижды.

Шаг 4 – Создайте файл определения шага.

  • Выберите и щелкните правой кнопкой мыши на схеме пакета.

  • Нажмите на «Новый» файл.

  • Дайте имя файла как stepdefinition.java

  • Запишите следующий текст в файл и сохраните его.

Выберите и щелкните правой кнопкой мыши на схеме пакета.

Нажмите на «Новый» файл.

Дайте имя файла как stepdefinition.java

Запишите следующий текст в файл и сохраните его.

package Outline;
 
import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.firefox.FirefoxDriver; 

import cucumber.annotation.en.Given; 
import cucumber.annotation.en.Then; 
import cucumber.annotation.en.When; 

public class stepdefinition { 
   WebDriver driver = null; 
	
   @Given("^user navigates to facebook$") 
   public void goToFacebook() { 
      driver = new FirefoxDriver(); 
      driver.navigate().to("https://www.facebook.com/"); 
   } 
	
   @When("^I enter Username as "([^"]*)" and Password as "([^"]*)"$") 
   public void I_enter_Username_as_and_Password_as(String arg1, String arg2) {
      driver.findElement(By.id("email")).sendKeys(arg1);
      driver.findElement(By.id("pass")).sendKeys(arg2);
      driver.findElement(By.id("u_0_v")).click(); 
   } 
	
   @Then("^login should be unsuccessful$") 
   public void validateRelogin() { 
      if(driver.getCurrentUrl().equalsIgnoreCase(
      "https://www.facebook.com/login.php?login_attempt=1&lwv=110")){
         System.out.println("Test Pass"); 
      } else { 
         System.out.println("Test Failed"); 
      } 
      driver.close(); 
   }    
}

Примечание. В приведенном выше коде мы должны определить функцию, имеющую два входных аргумента: один для имени пользователя и другой для пароля. Таким образом, для каждого набора входных данных, представленных в примере тега, будут выполнены наборы GIVEN, WHEN и THEN.

Шаг 5 – Создайте файл класса бегуна.

  • Выберите и щелкните правой кнопкой мыши на схеме пакета.

  • Нажмите на «Новый» файл.

  • Дайте имя файла, например, runTest.java

  • Запишите следующий текст в файл и сохраните его.

Выберите и щелкните правой кнопкой мыши на схеме пакета.

Нажмите на «Новый» файл.

Дайте имя файла, например, runTest.java

Запишите следующий текст в файл и сохраните его.

package Outline; 

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

@RunWith(Cucumber.class) 
@Cucumber.Options(format = {"pretty", "html:target/cucumber"})

public class runTest { }
  • Запустите тест, используя опцию –

    • Выберите файл runTest.java из проводника пакетов.

    • Щелкните правой кнопкой мыши и выберите параметр «Запуск от имени» .

    • Выберите JUnit test.

Запустите тест, используя опцию –

Выберите файл runTest.java из проводника пакетов.

Щелкните правой кнопкой мыши и выберите параметр «Запуск от имени» .

Выберите JUnit test.

При запуске этого файла класса вы увидите следующие вещи

  • Facebook открывается в новом экземпляре браузера Firefox.

  • Имя пользователя1 и пароль1 будут переданы в качестве ввода в поле имени пользователя и пароля.

  • Логин будет нажат.

  • В браузере появится сообщение о неудачном входе в систему.

  • В консоли вы увидите напечатанный «Test Pass».

  • Результаты шагов с 1 по 5 будут повторно выполнены для имени пользователя2 и пароля2.

Facebook открывается в новом экземпляре браузера Firefox.

Имя пользователя1 и пароль1 будут переданы в качестве ввода в поле имени пользователя и пароля.

Логин будет нажат.

В браузере появится сообщение о неудачном входе в систему.

В консоли вы увидите напечатанный «Test Pass».

Результаты шагов с 1 по 5 будут повторно выполнены для имени пользователя2 и пароля2.

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

Огурец – Теги

Это выглядит просто, когда у нас есть только один, два или, может быть, пять сценариев в файле объектов. Однако в реальной жизни этого не происходит. Для каждой тестируемой функции у нас может быть 10, 20 или больше сценариев в одном файле функций. Они могут представлять разные цели (тест на дымность / регрессионный тест), разные перспективы (разработчик / QA / BA), разный статус (готов к выполнению / работа в процессе) и т. Д. Как управлять выполнением для такой массы?

Для этого Cucumber уже предоставил способ организовать выполнение сценария с помощью тегов в файле объектов. Мы можем определить каждый сценарий с помощью полезного тега. Позже, в файле runner, мы можем решить, какой именно тег (и, соответственно, сценарий) мы хотим, чтобы Cucumber выполнял. Тег начинается с «@». После «@» у вас может быть любой соответствующий текст для определения вашего тега. Давайте разберемся с этим на примере.

Предположим, есть два или более сценариев в файле объектов. Мы хотим выполнить только один сценарий в рамках теста на дым. Итак, во-первых, нужно определить этот сценарий, а во-вторых, пометить его текстом «@SmokeTest» в начале сценария. Давайте глубоко посмотрим на это –

Шаг 1 – Создайте проект Maven с именем cucumberTag .

Шаг 2 – Создайте пакет с именем cucumberTag в src / test / java

Шаг 3 – Создайте файл объектов с именем cucumberTag.feature .

Запишите следующий текст в файл и сохраните его. Этот файл содержит два сценария, в которых только один помечен как тег SmokeTest .

Особенность – огуречный тег

Схема сценария – Функциональность входа для сайта социальной сети.

Данный пользователь переходит на Facebook

Когда я ввожу имя пользователя как «<имя пользователя>» и пароль как «<пароль>»

Тогда логин должен быть неудачным

Примеры

| username  | password  | 
| username1 | password1 | 
| username2 | password2 |

Сценарий #following был помечен как SmokeTest, и это должно быть выполнено. @SmokeTest

Сценарий:

Данный пользователь переходит на Facebook

Когда я ввожу имя пользователя как «<>» и пароль как «<>»

Затем пользователь должен быть перенаправлен для повторной попытки входа

Шаг 4 – Создайте файл определения шага.

  • Выберите и щелкните правой кнопкой мыши на схеме пакета.

  • Нажмите на «Новый» файл.

  • Дайте файлу имя, например cucumberTag.java

  • Запишите следующий текст в файл и сохраните его.

Выберите и щелкните правой кнопкой мыши на схеме пакета.

Нажмите на «Новый» файл.

Дайте файлу имя, например cucumberTag.java

Запишите следующий текст в файл и сохраните его.

package cucumberTag;
 
import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.firefox.FirefoxDriver; 

import cucumber.annotation.en.Given; 
import cucumber.annotation.en.Then; 
import cucumber.annotation.en.When; 

public class cucumberTag { 
   WebDriver driver = null; 
	
   @Given("^user navigates to facebook$") 
   public void goToFacebook() { 
      driver = new FirefoxDriver(); 
      driver.navigate().to("https://www.facebook.com/"); 
   } 
	
   @When("^I enter Username as "([^"]*)" and Password as "([^"]*)"$") 
   public void I_enter_Username_as_and_Password_as(String arg1, String arg2) {
      driver.findElement(By.id("email")).sendKeys(arg1);
      driver.findElement(By.id("pass")).sendKeys(arg2);
      driver.findElement(By.id("u_0_v")).click(); 
   } 
	
   @Then("^login should be unsuccessful$") 
   public void validateRelogin() { 
      if(driver.getCurrentUrl().equalsIgnoreCase(
         "https://www.facebook.com/login.php?login_attempt=1&lwv=110")){ 
            System.out.println("Test Pass"); 
      } else { 
         System.out.println("Test Failed"); 
      }
      driver.close(); 
   } 
	
   @Then("^User should be redirected to login retry$") 
   public void loginRetry() { 
      if(driver.getCurrentUrl().equalsIgnoreCase(
         "https://www.facebook.com/login.php?login_attempt=1&lwv=110")){ 
            System.out.println("Test Pass"); 
      } else { 
         System.out.println("Test Failed"); 
      } 
      driver.close(); 
   } 
}

Шаг 5 – Создайте файл класса бегуна.

  • Создайте класс бегуна с именем runTest.java внутри пакета.

  • Напишите следующий код.

  • Сохраните файл.

Создайте класс бегуна с именем runTest.java внутри пакета.

Напишите следующий код.

Сохраните файл.

package cucumberTag; 

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

@RunWith(Cucumber.class) 
@Cucumber.Options(format = {"pretty", "html:target/cucumber"}) 

public class runTest { }
  • Запустите тестовый вариант.

  • Щелкните правой кнопкой мыши и выберите параметр «Запуск от имени» .

  • Выберите JUnit test.

Запустите тестовый вариант.

Щелкните правой кнопкой мыши и выберите параметр «Запуск от имени» .

Выберите JUnit test.

При запуске этого файла класса вы увидите следующие вещи.

  • Facebook открывается в новом экземпляре браузера Firefox.

  • Никакое значение не будет предоставлено для имени пользователя и поля пароля.

  • Логин будет нажат.

  • Страница повторного входа будет загружена.

Facebook открывается в новом экземпляре браузера Firefox.

Никакое значение не будет предоставлено для имени пользователя и поля пароля.

Логин будет нажат.

Страница повторного входа будет загружена.

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

Есть в основном два типа тегов –

  • Тег по умолчаниютег по умолчанию имеет предопределенные значения. Пример @ Dev, @ Игнорировать

  • Пользовательский тег – Пользовательский тег обеспечивает полную гибкость при выборе подходящего текста для определения вашего тега.

Тег по умолчаниютег по умолчанию имеет предопределенные значения. Пример @ Dev, @ Игнорировать

Пользовательский тег – Пользовательский тег обеспечивает полную гибкость при выборе подходящего текста для определения вашего тега.

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

Огурец также предоставляет способ инвертировать выбор тегов. Учтите, что из 25 определенных сценариев 10 помечены как тесты на дым. Мы обязаны выполнять только сценарии регрессионного тестирования.

Для этого мы можем использовать «~» в классе бегунов JUnit, чтобы исключить сценарий дымовых испытаний. Это будет выглядеть следующим образом.

@RunWith(Cucumber.class) 
@Cucumber.Options(format = {"pretty", "html:target/cucumber"}, 
   tags = {"~@SmokeTest"})
	
public class runTest { }

При определении нескольких тегов мы также можем определить логические и / или логические и операции.

  • Определение логического или в классе бегуна – @ dev, @ wip – говорит, что необходимо выполнить сценарии, соответствующие любому из этих тегов.

  • Определение логического или в классе бегуна – [@ dev, ~ @ wip] – говорит, что необходимо выполнить сценарии, соответствующие обоим тегам.

Определение логического или в классе бегуна – @ dev, @ wip – говорит, что необходимо выполнить сценарии, соответствующие любому из этих тегов.

Определение логического или в классе бегуна – [@ dev, ~ @ wip] – говорит, что необходимо выполнить сценарии, соответствующие обоим тегам.

Огурец – таблицы данных

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

С самого начала мы взяли пример функции входа в систему для сайта социальной сети, где у нас было только два входных параметра, которые нужно передать. Давайте подумаем о еще некоторой возможности. Как насчет функциональности «Регистрация нового пользователя»? Как правило, какие могут быть входные параметры при регистрации нового пользователя для сайта социальной сети? Что-то вроде следующего –

  • Имя пользователя
  • Адрес электронной почты
  • пароль
  • Повторно введите пароль
  • Дата рождения
  • Пол
  • Номер телефона

Особенность – Регистрация нового пользователя.

Убедитесь, что регистрация нового пользователя не удалась после ввода неверных данных.

Учитывая, что я на новой странице регистрации пользователя.

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

На первый взгляд это выглядит немного грязно. Итак, есть ли лучший способ управлять таким количеством входов? Ответом может быть «Таблица данных». Таблица данных – это набор входных данных для одного тега. Этот тег может быть ДАН, КОГДА или ТОГДА.

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

Учитывая, что я на новой странице регистрации пользователя

Когда я ввожу действительные данные на странице

| Fields                 | Values              |
| First Name             | Tom                 |
| Last Name              | Kenny               |
| Email Address          | someone@someone.com |
| Re-enter Email Address | someone@someone.com |
| Password               | Password1           |
| Birthdate              | 01                  |

Тогда регистрация пользователя должна быть успешной.

пример

Давайте автоматизируем пример таблицы данных.

Шаг 1 – Создайте тестовый проект Maven с именем «DataTableTest».

  • Перейдите в Файл → Создать → Другие → Maven → Проект Maven → Далее.

  • Укажите идентификатор группы ( идентификатор группы будет идентифицировать ваш проект однозначно во всех проектах).

  • Укажите идентификатор артефакта ( идентификатор артефакта – это имя банки без версии. Вы можете выбрать любое имя в нижнем регистре).

  • Нажмите на Готово.

  • Откройте pom.xml –

    • Перейдите к исследователю пакетов в левой части Eclipse.

    • Разверните проект CucumberTest.

    • Найдите файл pom.xml.

    • Щелкните правой кнопкой мыши и выберите опцию Открыть с помощью «Текстового редактора».

  • Добавить зависимость для Selenium: это будет указывать Maven, какие файлы jar Selenium должны быть загружены из центрального репозитория в локальный репозиторий.

    • Откройте файл pom.xml в режиме редактирования, создайте тег зависимостей (<dependencies> </ dependencies>) внутри тега проекта.

    • Внутри тега зависимости создайте тег зависимости. (<Зависимость> </ зависимость>).

    • Укажите следующую информацию в теге зависимости.

Перейдите в Файл → Создать → Другие → Maven → Проект Maven → Далее.

Укажите идентификатор группы ( идентификатор группы будет идентифицировать ваш проект однозначно во всех проектах).

Укажите идентификатор артефакта ( идентификатор артефакта – это имя банки без версии. Вы можете выбрать любое имя в нижнем регистре).

Нажмите на Готово.

Откройте pom.xml –

Перейдите к исследователю пакетов в левой части Eclipse.

Разверните проект CucumberTest.

Найдите файл pom.xml.

Щелкните правой кнопкой мыши и выберите опцию Открыть с помощью «Текстового редактора».

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

Откройте файл pom.xml в режиме редактирования, создайте тег зависимостей (<dependencies> </ dependencies>) внутри тега проекта.

Внутри тега зависимости создайте тег зависимости. (<Зависимость> </ зависимость>).

Укажите следующую информацию в теге зависимости.

<dependency> 
   <groupId>org.seleniumhq.selenium</groupId> 
   <artifactId>selenium-java</artifactId> 
   <version>2.47.1</version> 
</dependency>
  • Добавить зависимость для Cucumber-Java – это будет указывать Maven, какие файлы Cucumber должны быть загружены из центрального репозитория в локальный репозиторий.

    • Создайте еще один тег зависимости.

    • Укажите следующую информацию в теге зависимости.

Добавить зависимость для Cucumber-Java – это будет указывать Maven, какие файлы Cucumber должны быть загружены из центрального репозитория в локальный репозиторий.

Создайте еще один тег зависимости.

Укажите следующую информацию в теге зависимости.

<dependency> 
   <groupId>info.cukes</groupId> 
   <artifactId>cucumber-java</artifactId> 
   <version>1.0.2</version> 
   <scope>test</scope> 
</dependency>
  • Добавить зависимость для Cucumber-JUnit – это будет указывать Maven, какие файлы Cucumber JUnit должны быть загружены из центрального репозитория в локальный репозиторий.

    • Создайте еще один тег зависимости.

    • Укажите следующую информацию в теге зависимости.

Добавить зависимость для Cucumber-JUnit – это будет указывать Maven, какие файлы Cucumber JUnit должны быть загружены из центрального репозитория в локальный репозиторий.

Создайте еще один тег зависимости.

Укажите следующую информацию в теге зависимости.

<dependency> 
   <groupId>info.cukes</groupId> 
   <artifactId>cucumber-junit</artifactId> 
   <version>1.0.2</version> 
   <scope>test</scope> 
</dependency>
  • Добавить зависимость для JUnit – это будет указывать Maven, какие файлы JUnit должны быть загружены из центрального репозитория в локальный репозиторий.

    • Создайте еще один тег зависимости.

    • Укажите следующую информацию в теге зависимости

Добавить зависимость для JUnit – это будет указывать Maven, какие файлы JUnit должны быть загружены из центрального репозитория в локальный репозиторий.

Создайте еще один тег зависимости.

Укажите следующую информацию в теге зависимости

<dependency> 
   <groupId>junit</groupId> 
   <artifactId>junit</artifactId> 
   <version>4.10</version> 
   <scope>test</scope> 
</dependency>
  • Проверьте двоичные файлы.

    • После успешного редактирования pom.xml сохраните его.

    • Перейдите в Проект → Очистить – это займет несколько минут.

Проверьте двоичные файлы.

После успешного редактирования pom.xml сохраните его.

Перейдите в Проект → Очистить – это займет несколько минут.

Шаг 2 – Создайте пакет с именем dataTable в src / test / java

Шаг 3 – Создайте файл компонента.

  • Создайте файл объектов с именем dataTable .feature внутри пакета dataTable (более подробные шаги см. В разделе «Сценарий сценария»).

  • Напишите следующий текст.

    Особенность – Таблица данных

    Убедитесь, что регистрация нового пользователя не прошла успешно после ввода неверных данных.

    Сценарий:

    Учитывая, что я нахожусь на странице регистрации нового пользователя

    Когда я ввожу неверные данные на странице

Создайте файл объектов с именем dataTable .feature внутри пакета dataTable (более подробные шаги см. В разделе «Сценарий сценария»).

Напишите следующий текст.

Особенность – Таблица данных

Убедитесь, что регистрация нового пользователя не прошла успешно после ввода неверных данных.

Сценарий:

Учитывая, что я нахожусь на странице регистрации нового пользователя

Когда я ввожу неверные данные на странице

| Fields                 | Values              |
| First Name             | Tom                 |
| Last Name              | Kenny               |
| Email Address          | someone@someone.com |
| Re-enter Email Address | someone@someone.com |
| Password               | Password1           |
| Birthdate              | 01                  |

Тогда регистрация пользователя должна быть неудачной

  • Сохраните файл.

Сохраните файл.

Шаг 4 – Создать файл определения шага.

  • Создайте файл определения шага с именем «dataTable.java» внутри пакета dataTable (более подробные шаги см. В разделе «Схема сценария»).

  • Напишите следующий код.

Создайте файл определения шага с именем «dataTable.java» внутри пакета dataTable (более подробные шаги см. В разделе «Схема сценария»).

Напишите следующий код.

package dataTable; 

import java.util.List; 

import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.WebElement; 
import org.openqa.selenium.firefox.FirefoxDriver; 
import org.openqa.selenium.support.ui.Select;

import cucumber.annotation.en.Given; 
import cucumber.annotation.en.Then; 
import cucumber.annotation.en.When; 
import cucumber.table.DataTable; 

public class stepdefinition { 
   WebDriver driver = null;
	
   @Given("^I am on new user registration page$") 
   public void goToFacebook() { 
      //Intiate web browser instance. driver = new FirefoxDriver();
      driver.navigate().to("https://www.facebook.com/"); 
   } 
	
   @When("^I enter invalid data on the page$") 
   public void enterData(DataTable table){ 
      //Initialize data table 
      List<list> data = table.raw();
      System.out.println(data.get(1).get(1)); 
      
      //Enter data
      driver.findElement(By.name("firstname")).sendKeys(data.get(1).get(1));
      driver.findElement(By.name("lastname")).sendKeys(data.get(2).get(1));
      driver.findElement(By.name("reg_email__")).sendKeys(data.get(3).get(1));     
      driver.findElement(By.name("reg_email_confirmation__")).
         sendKeys(data.get(4).get(1)); 
      driver.findElement(By.name("reg_passwd__")).sendKeys(data.get(5).get(1)); 
      
      Select dropdownB = new Select(driver.findElement(By.name("birthday_day"))); 
      dropdownB.selectByValue("15"); 
		
      Select dropdownM = new Select(driver.findElement(By.name("birthday_month")));
      dropdownM.selectByValue("6"); 
		
      Select dropdownY = new Select(driver.findElement(By.name("birthday_year")));
      dropdownY.selectByValue("1990"); 
		
      driver.findElement(By.className("_58mt")).click(); 
      // Click submit button driver.findElement(By.name("websubmit")).click(); 
   } 
	
   @Then("^User registration should be unsuccessful$") 
   public void User_registration_should_be_unsuccessful() {
      if(driver.getCurrentUrl().equalsIgnoreCase("https://www.facebook.com/")){
         System.out.println("Test Pass"); 
      } else { 
         System.out.println("Test Failed"); 
      } 
      driver.close(); 
   } 
}
  • Сохраните файл.

Сохраните файл.

Шаг 5 – Создайте файл класса бегуна.

  • Создайте класс бегуна с именем runTest.java внутри пакета.

  • Напишите следующий код.

Создайте класс бегуна с именем runTest.java внутри пакета.

Напишите следующий код.

package dataTable; 

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

@RunWith(Cucumber.class) 
@Cucumber.Options(format = {"pretty", "html:target/cucumber"})
 
public class runTest { }
  • Сохраните файл.

  • Запустите тест, используя опцию

    • Выберите файл runTest.java из проводника пакетов.

    • Щелкните правой кнопкой мыши и выберите параметр «Запуск от имени».

    • Выберите JUnit test.

Сохраните файл.

Запустите тест, используя опцию

Выберите файл runTest.java из проводника пакетов.

Щелкните правой кнопкой мыши и выберите параметр «Запуск от имени».

Выберите JUnit test.

После успешного выполнения вы можете наблюдать следующие вещи.

  • Веб-сайт Facebook загружается.

  • Данные будут введены на странице регистрации.

  • Кнопка «Отправить» будет нажата.

  • Мы увидим, что домашняя страница не отображается, и на консоли будет написано «Test Pass».

Веб-сайт Facebook загружается.

Данные будут введены на странице регистрации.

Кнопка «Отправить» будет нажата.

Мы увидим, что домашняя страница не отображается, и на консоли будет написано «Test Pass».

Огурец – Комментарии

Комментарий в основном представляет собой кусок кода, предназначенный для целей документирования, а не для выполнения. Будь то файл определения шага или файл возможностей, чтобы сделать его более читаемым и понятным. Поэтому важно использовать / размещать комментарии в соответствующих местах файла. Это также помогает при отладке кода. Файлы объектов огурца могут иметь комментарии в любом месте. Чтобы оставлять комментарии, нам просто нужно начать утверждение со знака «#».

Разные языки программирования имеют разные нормы для определения комментариев. Посмотрим, как с этим справится Cucumber.

  • Файл определения шага. Если вы используете Java в качестве платформы, пометьте свои комментарии знаком «//».

  • Файл функций – В случае файла функций нам просто нужно поставить # перед началом комментария.

Файл определения шага. Если вы используете Java в качестве платформы, пометьте свои комментарии знаком «//».

Файл функций – В случае файла функций нам просто нужно поставить # перед началом комментария.

пример

Выделенный текст в программе ссылается на комментарии в коде.

Feature: annotation 

#This is how background can be used to eliminate duplicate steps 
Background: 
User navigates to Facebook 
Given I am on Facebook login page 

#Scenario with AND 
Scenario: 
When I enter username as "TOM" 
And I enter password as "JERRY" 
Then Login should fail 

#Scenario with BUT 
Scenario: 
When I enter username as "TOM" 
And I enter password as "JERRY" 
Then Login should fail 
But Relogin option should be available

Огурец – крючки

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

Чтобы лучше понять это понятие, давайте возьмем пример файла функции и файла определения шага.

Выделенная часть в данном операторе фактически выполняет работу по настройке веб-драйвера и завершению сеанса веб-драйвера. Таким образом, это на самом деле не имеет отношения к сути «данного утверждения», и это больше похоже на настройку для теста. Кроме того, если мы представим более широкую перспективу, то в случае нескольких сценариев для этой функции эта настройка и очистка веб-драйвера будет выполняться с каждым заданным оператором. Логично, что имеет смысл выполнить настройку и очистку только один раз.

Таким образом, для оптимизации можно использовать хуки. Чаще всего мы используем два типа крючков: крючок «До» и крючок «После». Метод / функция / фрагмент кода, определенные в хуках «До» и «После», всегда выполняются, даже если сценарий пройден или не пройден.

Как следует из названия, до того, как ловушка будет выполнена задолго до любых других тестовых сценариев, и после того, как ловушка будет выполнена после выполнения всех сценариев.

Хуки определяются только в файле определения шага.

Давайте автоматизируем пример до и после хука.

Шаг 1 – Создайте проект Maven как hookTest, добавьте необходимую зависимость в pom.xml.

Шаг 2 – Создайте пакет Java с именем hookTest в src / test / java

Шаг 3 – Создайте файл определения шага с именем hookTest.java в пакете.

package hookTest; 

import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.firefox.FirefoxDriver; 

import cucumber.annotation.en.Given; 
import cucumber.annotation.en.Then; 
import cucumber.annotation.en.When; 

public class hookTest {
   WebDriver driver = null; 
	
   @Before public void setUp(){ 
      driver = new FirefoxDriver(); 
   } 
	
   @Given("^user navigates to facebook$") 
   public void goToFacebook() { 
      driver.navigate().to("https://www.facebook.com/");
   } 
	
   @When("^I enter Username as "([^"]*)" and Password as "([^"]*)"$") 
   public void I_enter_Username_as_and_Password_as(String arg1, String arg2) {
      driver.findElement(By.id("email")).sendKeys(arg1);
      driver.findElement(By.id("pass")).sendKeys(arg2);
      driver.findElement(By.id("u_0_v")).click(); 
   } 
	
   @Then("^login should be unsuccessful$") 
   public void validateRelogin() { 
      if(driver.getCurrentUrl().equalsIgnoreCase(
         "https://www.facebook.com/login.php?login_attempt=1&lwv=110")){ 
            System.out.println("Test Pass"); 
      } else { 
         System.out.println("Test Failed"); 
      } 
      driver.close(); 
   } 
	
   @After public void cleanUp(){ 
      driver.close(); 
   } 
}

Шаг 4 – Создайте файл компонента с именем «hookTest.feature» в пакете.

Особенность – Сценарий Контур.

Схема сценария – Крюк-тест

Данный пользователь переходит на Facebook

Когда я ввожу имя пользователя как «<имя пользователя>» и пароль как «<пароль>»

Тогда логин должен быть неудачным

Примеры

| username  | password  | 
| username1 | password1 |

Шаг 5 – Создайте файл класса бегуна.

  • Создайте класс runner как runTest.java внутри пакета dataTable (более подробные шаги см. В разделе сценария раздела).

  • Напишите следующий код.

Создайте класс runner как runTest.java внутри пакета dataTable (более подробные шаги см. В разделе сценария раздела).

Напишите следующий код.

package hookTest; 

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

@RunWith(Cucumber.class) 
@Cucumber.Options(format = {"pretty", "html:target/cucumber"})  

public class runTest { }
  • Сохраните файл.

  • Запустите тест, используя опцию –

    • Выберите файл runTest.java из проводника пакетов.

    • Щелкните правой кнопкой мыши и выберите параметр «Запуск от имени».

    • Выберите JUnit test.

Сохраните файл.

Запустите тест, используя опцию –

Выберите файл runTest.java из проводника пакетов.

Щелкните правой кнопкой мыши и выберите параметр «Запуск от имени».

Выберите JUnit test.

Итак, теперь, когда мы запустим это, будет следующая последовательность выполнения.

  • Перед подключением – настройте веб-драйвер и другие необходимые условия для запуска теста.

  • Данное заявление

  • Когда заявление

  • Тогда заявление

  • После подключения – Закройте веб-драйвер и выполните процесс очистки.

Перед подключением – настройте веб-драйвер и другие необходимые условия для запуска теста.

Данное заявление

Когда заявление

Тогда заявление

После подключения – Закройте веб-драйвер и выполните процесс очистки.

Tagged Hooks

Мы также можем указать, хотим ли мы, чтобы хуки до и после выполнялись только с определенным тегом. Пример – @Before (‘@ Web’). Та же самая концепция тэга логическая и / или может быть применена и к хукам. Пример – @Before (@ dev, @ wip), @Before (@ dev, ~ @ wip)

Огурец – Параметры командной строки

Огурец можно использовать для тестирования практически любой компьютерной системы. До сих пор мы видели, как запустить тест с использованием Eclipse IDE. Есть еще один способ, с помощью которого мы можем запустить тест Cucumber через интерфейс командной строки. Так в чем преимущество этого?

Запуск любой среды тестирования из Терминала имеет свои преимущества, такие как переопределение конфигураций запуска, упомянутых в коде.

Чтобы выполнить тест Cucumber с помощью командной строки, выполните следующие шаги после настройки системы.

Шаг 1 – Создайте тестовый проект Maven с именем commandLine .

  • Перейдите в Файл → Создать → Другие → Maven → Проект Maven → Далее.

  • Укажите идентификатор группы (идентификатор группы будет идентифицировать ваш проект однозначно во всех проектах).

  • Укажите идентификатор артефакта (идентификатор артефакта – это имя банки без версии. Вы можете выбрать любое имя в нижнем регистре).

  • Нажмите на Готово.

  • Откройте pom.xml –

    • Перейдите к исследователю пакетов в левой части Eclipse.

    • Разверните проект CucumberTest.

    • Найдите файл pom.xml .

    • Щелкните правой кнопкой мыши и выберите опцию Открыть с помощью «Текстового редактора».

  • Добавить зависимость для Selenium – это будет указывать Maven, какие файлы jar Selenium следует загружать из центрального хранилища в локальное хранилище.

    • Откройте файл pom.xml в режиме редактирования, создайте тег зависимостей (<dependencies> </ dependencies>) внутри тега проекта.

    • Внутри тега зависимости создайте тег зависимости. (<Зависимость> </ зависимость>).

    • Укажите следующую информацию в теге зависимости.

Перейдите в Файл → Создать → Другие → Maven → Проект Maven → Далее.

Укажите идентификатор группы (идентификатор группы будет идентифицировать ваш проект однозначно во всех проектах).

Укажите идентификатор артефакта (идентификатор артефакта – это имя банки без версии. Вы можете выбрать любое имя в нижнем регистре).

Нажмите на Готово.

Откройте pom.xml –

Перейдите к исследователю пакетов в левой части Eclipse.

Разверните проект CucumberTest.

Найдите файл pom.xml .

Щелкните правой кнопкой мыши и выберите опцию Открыть с помощью «Текстового редактора».

Добавить зависимость для Selenium – это будет указывать Maven, какие файлы jar Selenium следует загружать из центрального хранилища в локальное хранилище.

Откройте файл pom.xml в режиме редактирования, создайте тег зависимостей (<dependencies> </ dependencies>) внутри тега проекта.

Внутри тега зависимости создайте тег зависимости. (<Зависимость> </ зависимость>).

Укажите следующую информацию в теге зависимости.

<dependency> 
   <groupId>org.seleniumhq.selenium</groupId> 
   <artifactId>selenium-java</artifactId> 
   <version>2.47.1</version> 
</dependency>
  • Добавить зависимость для Cucumber-Java – это будет указывать Maven, какие файлы Cucumber должны быть загружены из центрального репозитория в локальный репозиторий.

    • Создайте еще один тег зависимости.

    • Укажите следующую информацию в теге зависимости.

Добавить зависимость для Cucumber-Java – это будет указывать Maven, какие файлы Cucumber должны быть загружены из центрального репозитория в локальный репозиторий.

Создайте еще один тег зависимости.

Укажите следующую информацию в теге зависимости.

<dependency> 
   <groupId>info.cukes</groupId> 
   <artifactId>cucumber-java</artifactId> 
   <version>1.0.2</version> 
   <scope>test</scope> 
</dependency>
  • Добавить зависимость для Cucumber-JUnit – это будет указывать Maven, какие файлы Cucumber JUnit должны быть загружены из центрального репозитория в локальный репозиторий.

    • Создайте еще один тег зависимости.

    • Укажите следующую информацию в теге зависимости.

Добавить зависимость для Cucumber-JUnit – это будет указывать Maven, какие файлы Cucumber JUnit должны быть загружены из центрального репозитория в локальный репозиторий.

Создайте еще один тег зависимости.

Укажите следующую информацию в теге зависимости.

<dependency> 
   <groupId>info.cukes</groupId> 
   <artifactId>cucumber-junit</artifactId> 
   <version>1.0.2</version> 
   <scope>test</scope> 
</dependency>
  • Добавить зависимость для JUnit – это будет указывать Maven, какие файлы JUnit должны быть загружены из центрального репозитория в локальный репозиторий.

    • Создайте еще один тег зависимости.

    • Предоставьте следующую информацию в теге зависимостей.

Добавить зависимость для JUnit – это будет указывать Maven, какие файлы JUnit должны быть загружены из центрального репозитория в локальный репозиторий.

Создайте еще один тег зависимости.

Предоставьте следующую информацию в теге зависимостей.

<dependency> 
   <groupId>junit</groupId> 
   <artifactId>junit</artifactId> 
   <version>4.10</version> 
   <scope>test</scope> 
</dependency>
  • Проверьте двоичные файлы.

    • После успешного редактирования pom.xml сохраните его.

    • Перейдите в Проект → Очистить – это займет несколько минут.

Проверьте двоичные файлы.

После успешного редактирования pom.xml сохраните его.

Перейдите в Проект → Очистить – это займет несколько минут.

Шаг 2 – Создайте пакет с именем «outline» в src / test / java

Шаг 3 – Создайте файл объектов с именем «commandLine.feature».

  • Выберите и щелкните правой кнопкой мыши на схеме пакета.

  • Нажмите на «Новый» файл.

  • Дайте файлу имя, такое как «commandLine.feature»

  • Напишите ниже текст в файле и сохраните его.

    Особенность – Схема Сценария

    Схема сценария – Функциональность входа для сайта социальной сети.

    Учитывая, что пользователь переходит на Facebook

    Когда я ввожу имя пользователя как «<имя пользователя>» и пароль как «<пароль>»

    Тогда логин должен быть неудачным

Выберите и щелкните правой кнопкой мыши на схеме пакета.

Нажмите на «Новый» файл.

Дайте файлу имя, такое как «commandLine.feature»

Напишите ниже текст в файле и сохраните его.

Особенность – Схема Сценария

Схема сценария – Функциональность входа для сайта социальной сети.

Учитывая, что пользователь переходит на Facebook

Когда я ввожу имя пользователя как «<имя пользователя>» и пароль как «<пароль>»

Тогда логин должен быть неудачным

Примеры

| username  | password  | 
| username1 | password1 | 
| username2 | password2 |

Примечание. Здесь примерная аннотация описывает диапазон входных данных, предоставляемых при выполнении сценария. Тестовый сценарий будет выполняться для каждого из предоставленных входных данных. Итак, в данном примере тестовый сценарий будет выполнен трижды.

Шаг 4 – Создайте файл определения шага.

  • Выберите и щелкните правой кнопкой мыши на схеме пакета.

  • Нажмите на «Новый» файл.

  • Назовите файл как commandLine.java

  • Запишите следующий текст в файл и сохраните его.

Выберите и щелкните правой кнопкой мыши на схеме пакета.

Нажмите на «Новый» файл.

Назовите файл как commandLine.java

Запишите следующий текст в файл и сохраните его.

package Outline; 

import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.firefox.FirefoxDriver; 

import cucumber.annotation.en.Given; 
import cucumber.annotation.en.Then; i
import cucumber.annotation.en.When; 

public class stepdefinition { 
   WebDriver driver = null;
	
   @Given("^user navigates to facebook$") 
   public void goToFacebook() { 
      driver = new FirefoxDriver(); 
      driver.navigate().to("https://www.facebook.com/"); 
   } 
	
   @When("^I enter Username as "([^"]*)" and Password as "([^"]*)"$") 
   public void I_enter_Username_as_and_Password_as(String arg1, String arg2) {
      driver.findElement(By.id("email")).sendKeys(arg1);
      driver.findElement(By.id("pass")).sendKeys(arg2);
      driver.findElement(By.id("u_0_v")).click(); 
   } 
	
   @Then("^login should be unsuccessful$") 
   public void validateRelogin() { 
      if(driver.getCurrentUrl().equalsIgnoreCase(
         "https://www.facebook.com/login.php?login_attempt=1&lwv=110")){ 
            System.out.println("Test Pass"); 
      } else { 
         System.out.println("Test Failed"); 
      } 
      driver.close(); 
   } 
}

Примечание. В коде мы должны определить функцию, имеющую два входных аргумента: один для имени пользователя и другой для пароля. Таким образом, для каждого набора входных данных, представленных в примере тега, будут выполнены наборы GIVEN, WHEN и THEN.

Шаг 5 – Создайте файл класса бегуна.

  • Выберите и щелкните правой кнопкой мыши на схеме пакета.

  • Нажмите на «Новый» файл.

  • Дайте файлу имя, например, runTest.java

  • Запишите следующий текст в файл и сохраните его.

Выберите и щелкните правой кнопкой мыши на схеме пакета.

Нажмите на «Новый» файл.

Дайте файлу имя, например, runTest.java

Запишите следующий текст в файл и сохраните его.

package Outline; 

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

@RunWith(Cucumber.class) 
@Cucumber.Options(format = {"pretty", "html:target/cucumber"}) 

public class runTest { }
  • Откройте командную строку.

  • Перейдите в каталог, где находится этот пакет «commandLine». e: Workspace LoginTest src> cd test java

  • Запустите команду mvn test: вы увидите, что все сценарии, описанные в файле возможностей, были выполнены (если ошибок нет). Наконец, в нижней части вы найдете следующую информацию.

Откройте командную строку.

Перейдите в каталог, где находится этот пакет «commandLine». e: Workspace LoginTest src> cd test java

Запустите команду mvn test: вы увидите, что все сценарии, описанные в файле возможностей, были выполнены (если ошибок нет). Наконец, в нижней части вы найдете следующую информацию.

Результат

This describes the total test run, along with failure if any.

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

  • Теперь запустите команду mvn test – Dcucumber.options = “- help” в командной строке. Выполнение этого напечатает все доступные опции.

  • Чтобы запустить только определенные теги, введите в командной строке команду mvn test -Dcucumber.options = “- tags @SmokeTest”. Он будет запускать только теги, помеченные @SmokeTest.

  • Чтобы изменить формат результата, в командной строке введите команду E: Workspace LoginTest> mvn test -Dcucumber.options = “- плагин junit: target / cucumber-junit-report.xml” в командной строке. Изменяет отчет. отформатировать в генератор отчетов JUnit.

Теперь запустите команду mvn test – Dcucumber.options = “- help” в командной строке. Выполнение этого напечатает все доступные опции.

Чтобы запустить только определенные теги, введите в командной строке команду mvn test -Dcucumber.options = “- tags @SmokeTest”. Он будет запускать только теги, помеченные @SmokeTest.

Чтобы изменить формат результата, в командной строке введите команду E: Workspace LoginTest> mvn test -Dcucumber.options = “- плагин junit: target / cucumber-junit-report.xml” в командной строке. Изменяет отчет. отформатировать в генератор отчетов JUnit.

Огурец – Юнит Бегун

Важно понять, что такое Junit, прежде чем мы начнем обсуждение Cucumber JUnit Runner. JUnit – это инфраструктура модульного тестирования с открытым исходным кодом для языка программирования Java. JUnit играет важную роль в разработке управляемой тестами разработки и является одной из семейства платформ модульного тестирования, которые в совокупности известны как xUnit, созданный с помощью SUnit.

Преимущества использования JUnit

  • Модуль имеет графический интерфейс пользователя (GUI), позволяющий быстро и легко писать и тестировать исходный код.

  • JUnit позволяет разработчику постепенно создавать наборы тестов для измерения прогресса и обнаружения непреднамеренных побочных эффектов.

  • Тест может быть запущен непрерывно.

  • JUnit показывает прогресс теста в строке, которая обычно зеленого цвета, но становится красной, если тест не пройден.

Модуль имеет графический интерфейс пользователя (GUI), позволяющий быстро и легко писать и тестировать исходный код.

JUnit позволяет разработчику постепенно создавать наборы тестов для измерения прогресса и обнаружения непреднамеренных побочных эффектов.

Тест может быть запущен непрерывно.

JUnit показывает прогресс теста в строке, которая обычно зеленого цвета, но становится красной, если тест не пройден.

К настоящему времени мы увидели преимущества использования JUnit, но причина, по которой мы обсуждаем это сейчас, – это фреймворк Cucumber. С одной стороны, Cucumber предоставляет возможность нетехническому специалисту определять тестовые наборы для продукта, а с другой стороны, мы ожидаем, что такие тестовые наборы будут гладкими и своевременными.

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

  • Заинтересованные стороны записывают файл функции.

  • Файл определения шага будет создан соответственно.

  • Укажите класс бегуна JUnit для запуска серии тестов.

  • Как только мы запустим класс бегунов JUnit –

    • Он проанализирует файл объектов Gherkin.

    • Он будет выполнять функции, записанные в файле определения шага в соответствии с инструкциями файла объектов.

    • JUnit объединит результат теста.

    • Он создаст протокол испытаний в указанном формате (который может быть html / JSON).

Заинтересованные стороны записывают файл функции.

Файл определения шага будет создан соответственно.

Укажите класс бегуна JUnit для запуска серии тестов.

Как только мы запустим класс бегунов JUnit –

Он проанализирует файл объектов Gherkin.

Он будет выполнять функции, записанные в файле определения шага в соответствии с инструкциями файла объектов.

JUnit объединит результат теста.

Он создаст протокол испытаний в указанном формате (который может быть html / JSON).

Важным моментом здесь является то, как настроить JUnit для выполнения всех этих задач? Ниже приведены шаги –

Шаг 1 – Установите Java.

  • Загрузите jdk и jre по ссылке http://www.oracle.com/technetwork/java/javase/downloads/index.html.

  • Принять лицензионное соглашение.

  • Установите JDK и JRE.

  • Установите переменную среды, как показано на следующем снимке экрана.

Загрузите jdk и jre по ссылке http://www.oracle.com/technetwork/java/javase/downloads/index.html.

Принять лицензионное соглашение.

Установите JDK и JRE.

Установите переменную среды, как показано на следующем снимке экрана.

Установить Java

Шаг 2 – Установите Eclipse.

  • Зачем нам это нужно – Eclipse – интегрированная среда разработки (IDE). Он содержит базовое рабочее пространство и расширяемую систему плагинов для настройки среды.

  • Как установить

    • Убедитесь, что JAVA установлен на вашем компьютере.

    • Загрузите Eclipse с http://www.eclipse.org/downloads

    • Распакуйте и Eclipse установлен.

Зачем нам это нужно – Eclipse – интегрированная среда разработки (IDE). Он содержит базовое рабочее пространство и расширяемую систему плагинов для настройки среды.

Как установить

Убедитесь, что JAVA установлен на вашем компьютере.

Загрузите Eclipse с http://www.eclipse.org/downloads

Распакуйте и Eclipse установлен.

Шаг 3 – Установите Maven.

  • Зачем нам это нужно – Maven – это инструмент автоматизации сборки, используемый в основном для проектов Java. Он предоставляет общую платформу для выполнения таких действий, как генерация исходного кода, компиляция кода, упаковка кода в jar и т. Д. Также позже, если какая-либо из версий программного обеспечения изменяется, Maven предоставляет простой способ соответствующим образом изменить тестовый проект.

  • Как установить

    • Скачать Maven – https://maven.apache.org/download.cgi

    • Разархивируйте файл и запомните местоположение.

    • Создайте переменную окружения MAVEN_HOME, как показано на следующем снимке экрана.

Зачем нам это нужно – Maven – это инструмент автоматизации сборки, используемый в основном для проектов Java. Он предоставляет общую платформу для выполнения таких действий, как генерация исходного кода, компиляция кода, упаковка кода в jar и т. Д. Также позже, если какая-либо из версий программного обеспечения изменяется, Maven предоставляет простой способ соответствующим образом изменить тестовый проект.

Как установить

Скачать Maven – https://maven.apache.org/download.cgi

Разархивируйте файл и запомните местоположение.

Создайте переменную окружения MAVEN_HOME, как показано на следующем снимке экрана.

Maven Home

  • Отредактируйте переменную Path и включите Maven, как показано на следующем снимке экрана.

Отредактируйте переменную Path и включите Maven, как показано на следующем снимке экрана.

Переменная пути

  • Загрузите плагин MAVEN из Eclipse.

    • Откройте Затмение.

    • Нужна помощь → Торговая площадка Eclipse → Поиск maven → Интеграция Maven для Eclipse → INSTALL.

Загрузите плагин MAVEN из Eclipse.

Откройте Затмение.

Нужна помощь → Торговая площадка Eclipse → Поиск maven → Интеграция Maven для Eclipse → INSTALL.

Шаг 4 – Как настроить Cucumber с Maven

  • Создайте проект Maven в Eclipse.

    • Перейдите в Файл → Создать → Другие → Maven → Проект Maven → Далее.

    • Укажите идентификатор группы (идентификатор группы будет идентифицировать ваш проект однозначно во всех проектах).

    • Укажите идентификатор артефакта (идентификатор артефакта – это имя банки без версии. Вы можете выбрать любое имя в нижнем регистре).

    • Нажмите на Готово.

  • Откройте pom.xml

    • Перейдите к исследователю пакетов в левой части Eclipse.

    • Разверните проект CucumberTest.

    • Найдите файл pom.xml.

    • Щелкните правой кнопкой мыши и выберите опцию Открыть с помощью «Текстового редактора».

  • Добавить зависимость для Selenium – это будет указывать Maven, какие файлы jar Selenium следует загружать из центрального хранилища в локальное хранилище.

    • Откройте файл pom.xml в режиме редактирования, создайте тег зависимостей (<dependencies> </ dependencies>) внутри тега проекта.

    • Внутри тега зависимости создайте тег зависимости. (<Зависимость> </ зависимость>).

    • Укажите следующую информацию в теге зависимости.

Создайте проект Maven в Eclipse.

Перейдите в Файл → Создать → Другие → Maven → Проект Maven → Далее.

Укажите идентификатор группы (идентификатор группы будет идентифицировать ваш проект однозначно во всех проектах).

Укажите идентификатор артефакта (идентификатор артефакта – это имя банки без версии. Вы можете выбрать любое имя в нижнем регистре).

Нажмите на Готово.

Откройте pom.xml

Перейдите к исследователю пакетов в левой части Eclipse.

Разверните проект CucumberTest.

Найдите файл pom.xml.

Щелкните правой кнопкой мыши и выберите опцию Открыть с помощью «Текстового редактора».

Добавить зависимость для Selenium – это будет указывать Maven, какие файлы jar Selenium следует загружать из центрального хранилища в локальное хранилище.

Откройте файл pom.xml в режиме редактирования, создайте тег зависимостей (<dependencies> </ dependencies>) внутри тега проекта.

Внутри тега зависимости создайте тег зависимости. (<Зависимость> </ зависимость>).

Укажите следующую информацию в теге зависимости.

<dependency> 
   <groupId>org.seleniumhq.selenium</groupId> 
   <artifactId>selenium-java</artifactId> 
   <version>2.47.1</version> 
</dependency>
  • Добавить зависимость для Cucumber-Java – это будет указывать Maven, какие файлы Cucumber будут загружены из центрального репозитория в локальный репозиторий.

    • Создайте еще один тег зависимости.

    • Укажите следующую информацию в теге зависимости.

Добавить зависимость для Cucumber-Java – это будет указывать Maven, какие файлы Cucumber будут загружены из центрального репозитория в локальный репозиторий.

Создайте еще один тег зависимости.

Укажите следующую информацию в теге зависимости.

<dependency> 
   <groupId>info.cukes</groupId> 
   <artifactId>cucumber-java</artifactId> 
   <version>1.0.2</version> 
   <scope>test</scope> 
</dependency>
  • Добавить зависимость для Cucumber-JUnit: это будет указывать Maven, какие файлы Cucumber JUnit следует загружать из центрального репозитория в локальный репозиторий.

    • Создайте еще один тег зависимости.

    • Укажите следующую информацию в теге зависимости.

Добавить зависимость для Cucumber-JUnit: это будет указывать Maven, какие файлы Cucumber JUnit следует загружать из центрального репозитория в локальный репозиторий.

Создайте еще один тег зависимости.

Укажите следующую информацию в теге зависимости.

<dependency> 
   <groupId>info.cukes</groupId> 
   <artifactId>cucumber-junit</artifactId> 
   <version>1.0.2</version> 
   <scope>test</scope> 
</dependency>
  • Добавить зависимость для JUnit – это будет указывать Maven, какие файлы JUnit должны быть загружены из центрального репозитория в локальный репозиторий.

    • Создайте еще один тег зависимости.

    • Укажите следующую информацию в теге зависимости.

Добавить зависимость для JUnit – это будет указывать Maven, какие файлы JUnit должны быть загружены из центрального репозитория в локальный репозиторий.

Создайте еще один тег зависимости.

Укажите следующую информацию в теге зависимости.

<dependency> 
   <groupId>junit</groupId> 
   <artifactId>junit</artifactId> 
   <version>4.10</version> 
   <scope>test</scope> 
</dependency>
  • Проверить двоичные файлы

    • После успешного редактирования pom.xml сохраните его.

    • Перейдите в Проект → Очистить – это займет несколько минут.

    • После этого вы сможете увидеть репозиторий Maven, как на следующем скриншоте.

Проверить двоичные файлы

После успешного редактирования pom.xml сохраните его.

Перейдите в Проект → Очистить – это займет несколько минут.

После этого вы сможете увидеть репозиторий Maven, как на следующем скриншоте.

Репозиторий Maven

Шаг 5 – Создайте файл объектов (будет рассмотрен позже).

Шаг 6 – Создать файл определения шага (будет рассмотрен позже).

Шаг 7 – Создайте Junit Runner для запуска теста (будет рассмотрено позже).

Огурец – Отчеты

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

Для этого нам нужно интегрировать Cucumber с другим инструментом с открытым исходным кодом, таким как Ant / Junit. Здесь мы рассмотрим примеры JUnit, поскольку он обеспечивает поддержку языка Java.

Давайте посмотрим на детали другого формата отчета, который доступен и прост в использовании –

Довольно Формат (HTML Отчет)

Pretty Format генерирует отчет теста Cucumber в формате HTML, то есть в формате HTML. Это наиболее читаемый формат отчета. Он генерирует отчет точно так же, как и файл объектов, поэтому отслеживание также упрощается. Также вы можете указать место, куда вы хотите поместить этот отчет после выполнения теста. Это может быть –

  • Локальный каталог. Мы можем указать целевой каталог для отчета как любой локальный каталог компьютера, на котором будет выполняться тест.

  • Каталог сервера – у нас также есть возможность указать целевой каталог как любой каталог на сервере, который является общедоступным. Это обычно помогает, когда мы хотим, чтобы наши клиенты / заинтересованные стороны просматривали результаты теста в любой момент времени.

Локальный каталог. Мы можем указать целевой каталог для отчета как любой локальный каталог компьютера, на котором будет выполняться тест.

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

пример

Давайте автоматизируем пример красивого формата.

Шаг 1 – Создайте проект Maven с именем cucumberReport в Eclipse.

Шаг 2 – Создайте пакет с именем CucumberReport в src / test / java

Шаг 3 – Создайте файл объектов с именем cucumberReport.feature

Запишите следующий текст в файл и сохраните его.

Особенность – огуречный отчет

# Это проверка результата теста для теста Pass

Сценарий: функция входа в систему существует

Учитывая, что я открыл браузер

Когда я открываю сайт Facebook

Тогда кнопка логина должна существовать

# Это проверка результата теста для теста Failed

Сценарий: забытый пароль существует

Учитывая, что я открыл браузер

Когда я открываю сайт Facebook

Тогда ссылка на забытый пароль должна существовать

Примечание. Здесь первый сценарий будет пройден, а второй сценарий потерпит неудачу. Так что мы можем убедиться в том, как выглядит отчет о сбое и неудаче.

Шаг 4 – Создайте файл определения шага.

  • Выберите и щелкните правой кнопкой мыши на схеме пакета.

  • Нажмите на «Новый» файл.

  • Дайте имя файла как cucumberReport.java

  • Запишите следующий текст в файл и сохраните его.

Выберите и щелкните правой кнопкой мыши на схеме пакета.

Нажмите на «Новый» файл.

Дайте имя файла как cucumberReport.java

Запишите следующий текст в файл и сохраните его.

package CucumberReport; 

import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.firefox.FirefoxDriver; 

import cucumber.annotation.en.Given; 
import cucumber.annotation.en.Then; 
import cucumber.annotation.en.When; 

public class cucumberReport { 
   WebDriver driver = null;
	
   @Given("^I have open the browser$") 
   public void openBrowser() { 
      driver = new FirefoxDriver();
   } 
	
   @When("^I open Facebook website$") 
   public void goToFacebook() { 
      driver.navigate().to("https://www.facebook.com/"); 
   } 
	
   @Then("^Login button should exits$") 
   public void loginButton() { 
      if(driver.findElement(By.id("u_0_v")).isEnabled()) { 
         System.out.println("Test 1 Pass"); 
      } else { 
         System.out.println("Test 1 Fail");
      }
   } 
	
   @Then("^Forgot password link should exist$") 
   public void forgotPWD() { 
      if(driver.findElement(By.id("")).isEnabled()) { 
         System.out.println("Test 1 Pass"); 
      } else {
         System.out.println("Test 1 Fail");
      } 
   } 
}

Шаг 5 – Создайте файл класса бегуна.

  • Создайте класс бегуна с именем runTest.java внутри пакета.

  • Напишите следующий код. Сохраните файл.

Создайте класс бегуна с именем runTest.java внутри пакета.

Напишите следующий код. Сохраните файл.

package CucumberReport; 

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

@RunWith(Cucumber.class) 
@Cucumber.Options( 
   format = {"pretty", "html:target/Destination"} ) 
//Specifying pretty as a format option ensure that HTML report will be generated. 
//When we specify html:target/Destination - It will generate the HTML report 

inside the Destination folder, in the target folder of the maven project.
 
public class runTest { }
  • Запустите тест, используя опцию

    • Выберите файл runTest.java из проводника пакетов.

    • Щелкните правой кнопкой мыши и выберите параметр « Запуск от имени» .

    • Выберите JUnit test.

Запустите тест, используя опцию

Выберите файл runTest.java из проводника пакетов.

Щелкните правой кнопкой мыши и выберите параметр « Запуск от имени» .

Выберите JUnit test.

При запуске этого файла класса вы увидите следующие вещи.

Оба сценария будут выполнены один за другим.

В целевом каталоге будет создана папка с именем Destination.

Огурец Джсон

Отчет будет называться «Index.html».

Откройте Index.html с помощью веб-браузера.

Вы увидите отчет, упомянутый на следующем рисунке –

Огуречный отчет

Это точно выделяет цвет неудачного сценария. Более того, в этом сценарии вы увидите подсветку для неудачного шага. Это делает отладку очень простой.

JSON Report

К настоящему времени мы увидели, насколько прост HTML-отчет. Однако, если мы хотим передать информацию об этом отчете в любое другое приложение, в случае HTML-отчетов это довольно сложно. Здесь возникает необходимость в другом формате отчетности. Нотация объекта сценария JSON-Java является еще одним форматом для создания отчетов об испытаниях Cucumber. JSON – это объект, содержащий много информации, хранящейся в текстовом формате. Отчеты JSON приносят в таблицу другое значение. Отчет JSON также может использоваться в качестве полезной информации, передаваемой между различными серверами. Кроме того, его можно использовать для отображения в виде веб-страницы. В двух словах, отчеты JSON могут использоваться другим приложением.

Что такое информация о полезной нагрузке? Когда данные отправляются через Интернет, каждая передаваемая единица включает в себя как информацию заголовка, так и фактические отправляемые данные. Заголовок идентифицирует источник и назначение пакета, в то время как фактические данные упоминаются как полезная нагрузка. Чтобы сгенерировать отчет JSON, нам просто нужно внести изменения в файл бегуна.

  • Измените параметр формата в файле бегуна следующим образом.

Измените параметр формата в файле бегуна следующим образом.

package CucumberReport; 

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

@RunWith(Cucumber.class) 
@Cucumber.Options( format={"json:target/Destination/cucumber.json"}) 

//When we specify json:target/Destination/cucumber.json - It will generate the JSON  
report inside the Destination folder, in the target folder of the maven project.

public class runTest {}
  • Запустите тест, используя опцию –

    • Выберите файл runTest.java из проводника пакетов.

    • Щелкните правой кнопкой мыши и выберите опцию Run as .

    • Выберите JUnit test.

Запустите тест, используя опцию –

Выберите файл runTest.java из проводника пакетов.

Щелкните правой кнопкой мыши и выберите опцию Run as .

Выберите JUnit test.

  • При запуске этого файла класса вы увидите следующие вещи.

    • Оба сценария будут выполнены один за другим.

При запуске этого файла класса вы увидите следующие вещи.

Оба сценария будут выполнены один за другим.

Имя папки

  • Отчет будет называться cucumber.json (как указано в классе бегуна).

  • Откройте файл cucumber.json в текстовом редакторе.

  • Вы увидите отчет, упомянутый на следующем скриншоте после размещения разрывов строк –

Отчет будет называться cucumber.json (как указано в классе бегуна).

Откройте файл cucumber.json в текстовом редакторе.

Вы увидите отчет, упомянутый на следующем скриншоте после размещения разрывов строк –

Текстовый редактор

Примечание. JSON менее читаем по сравнению с форматом отчета HTML.

Огурец – отладка

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

Опция отладки доступна в Eclipse. Поместите точку останова. Нажмите на файл и выполните отладку, выполнив следующие действия:

Шаг 1 – Поместите точки останова вручную в файл определения шага Ruby.

пример

require 'ruby-debug' 
Then /^the process should exit cleanly$/ do 
breakpoint 
assert @exited_cleanly, "Process did not exit cleanly: #{@stdout}" 
end

Шаг 2 – Мы также можем определить отдельный шаг отладки, как показано ниже в файле определения шага.

Then /^I debug$/ do 
breakpoint 
0 
end

Шаг 3Webrat – это инструмент по умолчанию для тестирования огурцов с помощью Rails. Это позволяет вам делать такие вещи, как щелкать ссылки, вводить и отправлять формы и так далее.

Будут времена, когда вы будете пытаться нажать на что-то, например, и это не там. Вы получите большой кусок HTML-кода, и выяснить, что именно это означает, может быть очень сложно.

save_and_open_page

Webrat предоставляет метод save_and_open_page, который захватывает текущий HTML-код, сохраняет его, а затем открывает его в браузере. Очень полезно.

When /^I follow "(.*)"$/ do |link| 
save_and_open_page 
click_link(link) 
end

Огурец – тестирование Java

Чтобы запустить тест Cucumber с Java, выполните следующие действия.

Шаг 1 – Установите Java –

  • Скачать JDK и JRE из

    http://www.oracle.com/technetwork/java/javase/downloads/index.html

  • Принять лицензионное соглашение.

  • Установите JDK и JRE.

  • Установите переменную среды, как показано на следующем рисунке.

Скачать JDK и JRE из

http://www.oracle.com/technetwork/java/javase/downloads/index.html

Принять лицензионное соглашение.

Установите JDK и JRE.

Установите переменную среды, как показано на следующем рисунке.

Переменная среды

Шаг 2 – Установите Eclipse IDE –

  • Убедитесь, что JAVA установлен на вашем компьютере.

  • Загрузите Eclipse с https://eclipse.org/downloads/

  • Разархивируйте и установите Eclipse.

Убедитесь, что JAVA установлен на вашем компьютере.

Загрузите Eclipse с https://eclipse.org/downloads/

Разархивируйте и установите Eclipse.

Шаг 3 – Установите Maven –

  • Скачать Maven – https://maven.apache.org/download.cgi

  • Разархивируйте файл и запомните местоположение.

  • Создайте переменную окружения MAVEN_HOME, как показано на следующем рисунке.

Скачать Maven – https://maven.apache.org/download.cgi

Разархивируйте файл и запомните местоположение.

Создайте переменную окружения MAVEN_HOME, как показано на следующем рисунке.

Apache Maven

  • Отредактируйте переменную Path и включите Maven.

  • Скачать плагин MAVEN от Eclipse

    • Откройте Затмение.

    • Нужна помощь → Торговая площадка Eclipse → Поиск maven → Интеграция Maven для Eclipse → INSTALL

Отредактируйте переменную Path и включите Maven.

Скачать плагин MAVEN от Eclipse

Откройте Затмение.

Нужна помощь → Торговая площадка Eclipse → Поиск maven → Интеграция Maven для Eclipse → INSTALL

Шаг 4 – Настройте огурец с Maven.

  • Создать проект Maven.

    • Перейдите в Файл → Создать → Другие → Maven → Проект Maven → Далее.

    • Укажите идентификатор группы (идентификатор группы будет идентифицировать ваш проект однозначно во всех проектах).

    • Укажите идентификатор артефакта (идентификатор артефакта – это имя банки без версии. Вы можете выбрать любое имя в нижнем регистре).

    • Нажмите на Готово.

Создать проект Maven.

Перейдите в Файл → Создать → Другие → Maven → Проект Maven → Далее.

Укажите идентификатор группы (идентификатор группы будет идентифицировать ваш проект однозначно во всех проектах).

Укажите идентификатор артефакта (идентификатор артефакта – это имя банки без версии. Вы можете выбрать любое имя в нижнем регистре).

Нажмите на Готово.

Maven Project

Шаг 5 – Откройте pom.xml –

  • Перейдите к исследователю пакетов в левой части Eclipse.

  • Разверните проект CucumberTest.

  • Найдите файл pom.xml.

  • Щелкните правой кнопкой мыши и выберите опцию Открыть с помощью «Текстового редактора».

Перейдите к исследователю пакетов в левой части Eclipse.

Разверните проект CucumberTest.

Найдите файл pom.xml.

Щелкните правой кнопкой мыши и выберите опцию Открыть с помощью «Текстового редактора».

Шаг 6 – Добавить зависимость для Selenium – Это будет указывать Maven, какие файлы JAR Selenium должны быть загружены из центрального репозитория в локальный репозиторий.

  • Откройте файл pom.xml в режиме редактирования, создайте тег зависимостей (<dependencies> </ dependencies>) внутри тега проекта.

  • Внутри тега зависимости создайте тег зависимости. (<Зависимость> </ зависимость>)

  • Укажите следующую информацию в теге зависимости.

Откройте файл pom.xml в режиме редактирования, создайте тег зависимостей (<dependencies> </ dependencies>) внутри тега проекта.

Внутри тега зависимости создайте тег зависимости. (<Зависимость> </ зависимость>)

Укажите следующую информацию в теге зависимости.

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

Шаг 7. Добавление зависимости для Cucumber-Java. Это будет указывать Maven, какие файлы Cucumber необходимо загрузить из центрального репозитория в локальный репозиторий.

  • Создайте еще один тег зависимости.

  • Предоставьте следующую информацию в теге зависимостей.

Создайте еще один тег зависимости.

Предоставьте следующую информацию в теге зависимостей.

<dependency> 
   <groupId>info.cukes</groupId> 
   <artifactId>cucumber-java</artifactId> 
   <version>1.0.2</version> 
   <scope>test</scope> 
</dependency>

Шаг 8. Добавление зависимости для Cucumber-JUnit. Это будет указывать Maven, какие файлы Cucumber JUnit необходимо загрузить из центрального репозитория в локальный репозиторий.

  • Создайте еще один тег зависимости.

  • Укажите следующую информацию в теге зависимости.

Создайте еще один тег зависимости.

Укажите следующую информацию в теге зависимости.

<dependency> 
   <groupId>info.cukes</groupId> 
   <artifactId>cucumber-junit</artifactId> 
   <version>1.0.2</version> 
   <scope>test</scope> 
</dependency>

Шаг 9 – Добавить зависимость для JUnit – Это будет указывать Maven, какие файлы JUnit должны быть загружены из центрального репозитория в локальный репозиторий.

  • Создайте еще один тег зависимости.

  • Укажите следующую информацию в теге зависимости.

Создайте еще один тег зависимости.

Укажите следующую информацию в теге зависимости.

<dependency> 
   <groupId>junit</groupId> 
   <artifactId>junit</artifactId> 
   <version>4.10</version> 
   <scope>test</scope> 
</dependency>

Шаг 10 – Проверьте двоичные файлы.

  • После успешного редактирования pom.xml сохраните его.

  • Перейдите в Проект → Очистить – это займет несколько минут.

  • Вы сможете увидеть хранилище Maven.

После успешного редактирования pom.xml сохраните его.

Перейдите в Проект → Очистить – это займет несколько минут.

Вы сможете увидеть хранилище Maven.

Шаг 11 – Создайте пакет в src / test / java с именем cucumberJava .

Шаг 12 – Создайте файл объектов

  • Выберите и щелкните правой кнопкой мыши на схеме пакета.

  • Нажмите на «Новый» файл.

  • Дайте файлу имя, например cucumberJava.feature .

  • Запишите следующий текст в файл и сохраните его.

    Особенность: огурецЯва

    Сценарий: функция входа в систему существует

    Учитывая, что я открыл браузер

    Когда я открываю сайт Facebook

    Тогда кнопка логина должна выйти

Выберите и щелкните правой кнопкой мыши на схеме пакета.

Нажмите на «Новый» файл.

Дайте файлу имя, например cucumberJava.feature .

Запишите следующий текст в файл и сохраните его.

Особенность: огурецЯва

Сценарий: функция входа в систему существует

Учитывая, что я открыл браузер

Когда я открываю сайт Facebook

Тогда кнопка логина должна выйти

Шаг 13 – Создать файл определения шага –

  • Выберите и щелкните правой кнопкой мыши на схеме пакета.

  • Нажмите на «Новый» файл.

  • Дайте имени файла имя, такое как annotation.java .

  • Запишите следующий текст в файл и сохраните его.

Выберите и щелкните правой кнопкой мыши на схеме пакета.

Нажмите на «Новый» файл.

Дайте имени файла имя, такое как annotation.java .

Запишите следующий текст в файл и сохраните его.

package CucumberJava; 
import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.firefox.FirefoxDriver; 

import cucumber.annotation.en.Given; 
import cucumber.annotation.en.Then; 
import cucumber.annotation.en.When; 

public class cucumberJava { 
   WebDriver driver = null; 
   @Given("^I have open the browser$") 
   public void openBrowser() { 
      driver = new FirefoxDriver(); 
   } 
   @When("^I open Facebook website$") 
   public void goToFacebook() { 
      driver.navigate().to("https://www.facebook.com/"); 
   } 
   @Then("^Login button should exits$") 
   public void loginButton() { 
      if(driver.findElement(By.id("u_0_v")).isEnabled()) { 
         System.out.println("Test 1 Pass"); 
      } else { 
         System.out.println("Test 1 Fail"); 
      } 
      driver.close(); 
   } 
}

Шаг 14 – Создайте файл класса бегуна.

  • Выберите и щелкните правой кнопкой мыши на схеме пакета.

  • Нажмите на «Новый» файл.

  • Дайте имя файла как runTest.java .

  • Запишите следующий текст в файл и сохраните его.

Выберите и щелкните правой кнопкой мыши на схеме пакета.

Нажмите на «Новый» файл.

Дайте имя файла как runTest.java .

Запишите следующий текст в файл и сохраните его.

package cucumberJava; 
import org.junit.runner.RunWith; 
import cucumber.junit.Cucumber; 

@RunWith(Cucumber.class) 
@Cucumber.Options(format = {"pretty", "html:target/cucumber"}) 
public class runTest { 
}

Шаг 15 – Запустите тест, используя опцию –

  • Выберите файл runTest.java из проводника пакетов.

  • Щелкните правой кнопкой мыши и выберите параметр « Запуск от имени» .

  • Выберите JUnit test.

Выберите файл runTest.java из проводника пакетов.

Щелкните правой кнопкой мыши и выберите параметр « Запуск от имени» .

Выберите JUnit test.

После выполнения вы увидите следующие вещи:

  • Откроется экземпляр веб-браузера Firefox.

  • Откроется страница входа в Facebook в браузере.

  • Он обнаружит кнопку входа.

  • Браузер закроется.

  • В окне JUnit вы увидите сценарий с зеленой галочкой, который указывает на успешность выполнения теста.

Откроется экземпляр веб-браузера Firefox.

Откроется страница входа в Facebook в браузере.

Он обнаружит кнопку входа.

Браузер закроется.

В окне JUnit вы увидите сценарий с зеленой галочкой, который указывает на успешность выполнения теста.

Огурец – Рубиновый Тест

Язык Ruby имеет следующие преимущества –

  • Это легко понять.

  • Это объектно-ориентированный язык.

  • Это мощная библиотека классов.

  • Он имеет массовую онлайн-поддержку.

Это легко понять.

Это объектно-ориентированный язык.

Это мощная библиотека классов.

Он имеет массовую онлайн-поддержку.

Ниже приведен пошаговый процесс работы Cucumber с Ruby.

Шаг 1 – Установите Ruby.

  • Перейти на страницу загрузки RubyInstaller.

  • Загрузите версию, наиболее подходящую для вашей операционной системы (то есть 32- или 64-разрядную).

  • Запустите скачанный exe.

  • Во время установки установите флажки «Добавить Ruby…» и «Связать …», как показано на следующем рисунке.

Перейти на страницу загрузки RubyInstaller.

Загрузите версию, наиболее подходящую для вашей операционной системы (то есть 32- или 64-разрядную).

Запустите скачанный exe.

Во время установки установите флажки «Добавить Ruby…» и «Связать …», как показано на следующем рисунке.

Настройка Ruby

Шаг 2 – Загрузите и распакуйте комплект разработчика.

  • Перейти на страницу загрузки RubyInstaller.

  • Загрузите версию Devkit, наиболее подходящую для вашей операционной системы (т.е. 32- или 64-разрядную).

  • Извлеките devkit в папку c: Ruby Devkit.

  • Откройте командную строку.

  • Внутри Ruby devkit выполните следующую команду.

Перейти на страницу загрузки RubyInstaller.

Загрузите версию Devkit, наиболее подходящую для вашей операционной системы (т.е. 32- или 64-разрядную).

Извлеките devkit в папку c: Ruby Devkit.

Откройте командную строку.

Внутри Ruby devkit выполните следующую команду.

C:Rubydevkit> ruby dk.rb init 
C:Rubydevkit> ruby dk.rb install

Шаг 3 – Установите огурец и другой рубиновый камень.

  • Чтобы установить Cucumber, сначала обновите текущую настройку гема

Чтобы установить Cucumber, сначала обновите текущую настройку гема

C:UsersAdmin> gem update –system
  • Затем установите драгоценные камни, необходимые для веб-тестирования Cucumber.

Затем установите драгоценные камни, необходимые для веб-тестирования Cucumber.

C:UsersAdmin> gem install --no-ri --no-rdoc rspec 
C:UsersAdmin> gem install --no-ri --no-rdoc win32console 
C:UsersAdmin> gem install --no-ri --no-rdoc watir-webdriver 
C:UsersAdmin> gem install --no-ri --no-rdoc cucumber
  • Запустить огурец

Запустить огурец

C:UsersAdminDocuments>cucumber –init 
C:UsersAdminDocuments>cucumber

Шаг 4 – Установите IDE – KOMODO.

  • Перейти на страницу http://www.activestate.com/komodo-ide/downloads

  • Загрузите бесплатный пробный установщик.

  • Дважды щелкните по загруженному exe.

  • Следуйте инструкциям по установке.

  • Завершите установку и откройте IDE.

Перейти на страницу http://www.activestate.com/komodo-ide/downloads

Загрузите бесплатный пробный установщик.

Дважды щелкните по загруженному exe.

Следуйте инструкциям по установке.

Завершите установку и откройте IDE.

Шаг 5. Установите Watir. Перейдите в командную строку и выполните следующую команду: «gem install watir».

Шаг 6 – Установите rspec. Перейдите в командную строку и выполните следующую команду: «gem install rspec»

Шаг 7 – Создание файла объектов.

  • Откройте редактор KOMODO.

  • Нажмите на иконку нового файла.

  • Напишите следующий текст.

    Особенность: пользователи должны иметь возможность искать контент с помощью Google.

    Сценарий: поиск по термину.

    Учитывая, что я ввел “watir” в запрос.

    Когда я нажимаю «поиск»

    Тогда я должен увидеть некоторые результаты

Откройте редактор KOMODO.

Нажмите на иконку нового файла.

Напишите следующий текст.

Особенность: пользователи должны иметь возможность искать контент с помощью Google.

Сценарий: поиск по термину.

Учитывая, что я ввел “watir” в запрос.

Когда я нажимаю «поиск»

Тогда я должен увидеть некоторые результаты

  • Нажмите значок сохранения .

  • Дайте имя как CucumberRuby.feature.

  • Выберите любую папку, например: «e: WithRuby»

  • Сохраните файл.

Нажмите значок сохранения .

Дайте имя как CucumberRuby.feature.

Выберите любую папку, например: «e: WithRuby»

Сохраните файл.

Шаг 8 – Создать файл определения шага.

  • Откройте редактор KOMODO.

  • Нажмите «Новый» значок файла.

  • Напишите следующий код.

Откройте редактор KOMODO.

Нажмите «Новый» значок файла.

Напишите следующий код.

require "watir-webdriver" 
require "rspec/expectations" 

Given /^I have entered "([^"]*)" into the query$/ do |term| 
@browser ||= Watir::Browser.new :firefox 
@browser.goto "google.com" 
@browser.text_field(:name => "q").set term 
end 

When /^I click "([^"]*)"$/ do |button_name| 
@browser.button.click 
end 

Then /^I should see some results$/ do 
@browser.div(:id => "resultStats").wait_until_present 
@browser.div(:id => "resultStats").should exist 
@browser.close 
End
  • Нажмите значок сохранения.

  • Дайте имя как CucumberRuby.rb

  • Выберите любую папку, например: «e: WithRuby»

  • Сохраните файл.

Нажмите значок сохранения.

Дайте имя как CucumberRuby.rb

Выберите любую папку, например: «e: WithRuby»

Сохраните файл.

Шаг 9 – Создайте тестовый файл.

  • Откройте редактор KOMODO.

  • Нажмите на иконку «Новый».

  • Напишите следующий код.

Откройте редактор KOMODO.

Нажмите на иконку «Новый».

Напишите следующий код.

require "rubygems" 
require "test/unit" 
require "watir-webdriver" 

class GoogleSearch < Test::Unit::TestCase 
def setup 
@browser ||= Watir::Browser.new :firefox 
end 

def teardown 
@browser.close 
end 

def test_search 
@browser.goto "google.com" 
@browser.text_field(:name => "q").set "watir" 
@browser.button.click 
@browser.div(:id => "resultStats").wait_until_present assert 
@browser.title == "watir - Google Search" 
end 
end
  • Нажмите значок Сохранить.

  • Назовите файл как test.rb и выберите любую папку, например: «e: WithRuby»

  • Сохраните файл.

Нажмите значок Сохранить.

Назовите файл как test.rb и выберите любую папку, например: «e: WithRuby»

Сохраните файл.

Шаг 10 – Запустите файл функции.

  • Перейти к командной строке.

  • Перейти в каталог e: WithRuby

  • Запустите следующую команду.

Перейти к командной строке.

Перейти в каталог e: WithRuby

Запустите следующую команду.

e:With Ruby>ruby test.rb

После выполнения вы увидите следующие вещи:

Откроется экземпляр веб-браузера.

Веб-страница Google.com будет загружена.

Поиск текста watir будет введен.

Кнопка поиска будет размещена.

Результаты поиска должны отображаться на веб-странице.

Экземпляр браузера будет закрыт.

Software Development Life Cycle (SDLC — жизненный цикл разработки программного обеспечения) обычно включает людей двух типов: бизнес-профессионалов и инженеров. Поскольку их опыт находится в разных областях, бизнес-требования легко могут быть неправильно поняты или выражены нечетко, и конечный продукт может не соответствовать бизнес-потребностям. Behavior-Driven Development (BDD) — это процесс разработки программного обеспечения, который поощряет:

  • Сотрудничество всей команды.
  • Использование понятного для всех языка (ubiquitous language) для определения поведения системы, то есть спецификации.
  • Использование автоматических тестов для проверки (валидации) системы на соответствие спецификации.

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

Значит, спецификация, написанная в виде обычного текста, может быть выбрана платформой тестирования и затем выполнена? Что можно придумать, похожее на JUnit (JUnit – фреймворк для модульного тестирования программного обеспечения на языке Java)? Рассмотрим Cucumber! Cucumber читает спецификации и проверяет, что делает программное обеспечение, в соответствии с тем, что указано в спецификации. Это поможет вам интегрировать BDD в ваш SDLC. Cucumber доступен для многих языков программирования, а спецификации могут быть написаны на разных разговорных языках.

В этом туториале вы:

  • Примените Gherkin для определения характеристик.
  • Сможете интегрировать Cucumber в приложение Spring Boot.
  • Ознакомитесь с библиотеками, такими как Hamcrest и Rest Assured, для проверки спецификаций.
  • Узнаете, как разделить состояние между действиями.
  • Примените несколько потоков для параллельного выполнения тестов.
  • Узнаете, как бороться с нестабильными тестами.
  • Создадите отчеты об испытаниях.

Вы будете работать с приложением под названием artikles, созданным с помощью Spring Boot и Kotlin.

Заметка

В этой статье предполагается, что вы знакомы с основами Spring Boot и Hibernate.

Приступим

Щелкните на Download Materials, чтобы загрузить начальный проект. Запустите IntelliJ IDEA и выберите Open…. Затем перейдите к стартовому проекту и откройте его.

Скомпилируйте и запустите приложение. Вы обнаружите, что сервер работает на порту 8080.

Теперь создайте первую статью:

curl -X POST http://localhost:8080/articles -d '{"title":"Test","body":"Hello, World!"}' -H "Content-Type:application/json"

И отправьте запрос GET request:

curl http://localhost:8080/articles

В ответ вы получите только что созданную статью. Здорово! Теперь, когда ваше приложение запущено, запустите браузер и перейдите на localhost:8080/h2-console. Войдите в систему, используя следующие конфигурации:

Вы можете найти эти конфигурации в application.properties, расположенном в src/main/resources. Это приложение использует базу данных H2 в памяти. Имейте в виду, что остановка и перезапуск приложения приведет к сбросу базы данных. В стартовом проекте пока нет тестовых примеров. В следующих разделах вы узнаете, как интегрировать тесты в этот проект. А сейчас посмотрим Gherkin!

Gherkin

Спецификация исполняемого файла на самом деле не является «простым» текстом. Она написана в структурированном формате под названием Gherkin. Gherkin предоставляет набор грамматических правил и ключевых слов для описания спецификации. Спецификации находятся в файлах *.feature и содержат один или несколько сценариев. Каждый сценарий содержит серию шагов, которые Cucumber выполняет и проверяет на соответствие ожиданиям бизнеса.

Типичная спецификация выглядит так:

Feature: Bank transfer.

  Scenario: Money should be transferred from applicant account to beneficiary account.
	Given Account "001" has balance of "$100".
	And Account "002" has balance of "$1000".
	When Amount of "$50" is transferred from account "001" to account "002".
	Then Account "001" should have balance of "$50".
	And Account "002" should have balance of "$1050".

Gherkin предоставляет:

  • Feature группировать связанные сценарии.
  • Scenario или Example, чтобы сгруппировать серию шагов.
  • Given (дано), When (когда), Then (затем), And (и) и But (но) для описания шагов. Эти шаги выполняются последовательно.
  • Scenario Outline (схему сценария) для многократного запуска одного и того же Scenario (сценария) с использованием различных комбинаций входных данных.

Вы можете предоставить список входных данных для определения шага с помощью Data Tables (таблиц данных):

| account |   balance   |
|   001   |     $100    |
|   002   |     $150    |
|   004   |     $1000   |

Обратитесь к документации Gherkin (Gherkin documentation), чтобы узнать о ключевых словах и их использовании. Далее вы узнаете о Cucumber.

Cucumber

Cucumber связывает шаги Gherkin с определением шага (step definition). Определение шага — это метод, помеченный одним из ключевых слов шага: (@Given, @When, @Then или @But). Он содержит либо регулярное выражение (Regular Expression), либо Cucumber Expression, которое связывает метод с шагами Gherkin.

Определение шага для описанного выше сценария может выглядеть так:

import io.cucumber.java.en.*

class StepsDefinition {

  @Given("Account {string} has balance of {string}")
  fun setUpAccountWithBalance(account: String, balance: String) {
    // Account "001" has balance of "$100".
    // Account "002" has balance of "$1000".

    val money: Money = Money.from(balance)
    // setup account with [money]
  }

  @When("Amount of {string} is transferred from account {string} to account string")
  fun transferAmount(balance: String, fromAccountNumber: String, toAccountNumber: String) {
    // Amount of "$50" is transferred from account "001" to account "002".

    val fromAccount = getAccount(fromAccountNumber)
    val toAccount = getAccount(toAccountNumber)
    // Transfer balance
    TransferService.transfer(from=fromAccount, to=toAccount, amount=balance)
  }

  @Then("Account {string} should have balance of {string}.")
  fun validateAmount(accountNumber: String, balance: String) {
    // Account "001" should have balance of "$50".
    // Account "002" should have balance of "$1050".

    val account =  getAccount(accountNumber)
    assertEquals(balance, account.balance)
  }

  // ...
}

Методы определения шага либо инициализируют, либо устанавливают состояние, либо проверяют текущее состояние системы.

Cucumber Expressions поддерживают основные типы параметров, такие как {int}, {float}, {string}, {biginteger}, {double}, {long} и {word}. Вы можете узнать о них больше в документации Cucumber Expressions (Cucumber Expressions documentation).

Теперь, когда вы знаете о Cucumber, вы научитесь интегрировать его в проект Spring Boot.

Настройка Cucumber

Сначала добавьте в build.gradle следующие зависимости:

// 1
testImplementation("org.springframework.boot:spring-boot-starter-test")
testImplementation("io.rest-assured:rest-assured:4.4.0")

// 2
testImplementation("io.cucumber:cucumber-java:6.10.4")
// 3
testImplementation("io.cucumber:cucumber-spring:6.10.4")
// 4
testImplementation("io.cucumber:cucumber-junit-platform-engine:6.10.4")

// 5
testRuntimeOnly("org.junit.platform:junit-platform-console")

Итак, что здесь происходит?

1. Cucumber категорически настроен по отношению к библиотеке assertion, поэтому вы можете использовать ту, которая вам больше нравится. Вы будете использовать Rest Assured для имитации конечных точек HTTP и Hamcrest для подтверждения ответа HTTP.

2. Здесь добавляются основные классы и аннотации Cucumber в область тестирования.

3. cucumber-spring требуется, потому что приложение должно запускаться и быть готовым принимать HTTP-запросы перед выполнением любого из шагов.

4. cucumber-junit-platform-engine — это механизм, который JUnit Console Launcher использует для выполнения сценария Cucumber.

5. Используется Console Launcher (средство запуска консоли) для запуска платформы JUnit и выполнения тестовых примеров с консоли.

В build.gradle замените блок tasks.withType следующим:

tasks {
  val consoleLauncherTest by registering(JavaExec::class) {
    dependsOn(testClasses)
    classpath = sourceSets["test"].runtimeClasspath
    mainClass.set("org.junit.platform.console.ConsoleLauncher")
    args("--include-engine", "cucumber")
    args("--details", "tree")
    args("--scan-classpath")
    // Pretty prints the output in console
    systemProperty("cucumber.plugin", "pretty")
    // Hides Cucumber ads
    systemProperty("cucumber.publish.quiet", true)
  }

  test {
    dependsOn(consoleLauncherTest)
    exclude("**/*")
  }
}

Этот код настроил JUnit Console Launcher с ядром платформы (cucumber-junit-platform-engine) для выполнения сценариев Cucumber.

Выполните синхронизацию Gradle и выполните эту задачу, используя тест ./gradlew test на машинах Unix или тест gradlew.bat test в Windows. Вы должны увидеть запуск задачи gradle, а затем блок текста, который выглядит примерно так:

Test run finished after 147 ms
[         1 containers found      ]
[         0 containers skipped    ]
[         1 containers started    ]
[         0 containers aborted    ]
[         1 containers successful ]
[         0 containers failed     ]
[         0 tests found           ]
[         0 tests skipped         ]
[         0 tests started         ]
[         0 tests aborted         ]
[         0 tests successful      ]
[         0 tests failed          ]

Наконец, перейдите в Preferences > Plugins и убедитесь, что вы установили необходимые плагины для Cucumber и включили их в IntelliJ. Возможно, вам придется перезапустить IntelliJ после установки плагинов. Эти плагины помогают значительно упростить процесс тестирования при использовании Cucumber.

 

Теперь вы готовы интегрировать Cucumber в Spring Boot. Перед этим совершите краткую экскурсию по Rest Assured.

Rest Assured 

Rest Assured значительно упрощает тестирование служб REST. Как упоминалось ранее, вы будете использовать его для моделирования контроллеров REST, а затем проверить ответ.

Его API-интерфейсы следуют структуре Given-When-Then (дано-когда-тогда). Простой тест с использованием Rest Assured выглядит так:

// 1
val requestSpec: RequestSpecification = RestAssured
    .given()
    .contentType(ContentType.JSON)
    .accept(ContentType.JSON)
    .pathParam("id", 1)

// 2 
val response: Response = requestSpec
    .`when`()
    .get("https://jsonplaceholder.typicode.com/todos/{id}")

response
.then() // 3
.statusCode(200) // 4
.body("id", Matchers.equalTo(1)) // 4
.body("title", Matchers.notNullValue())
//...

Здесь:

1. Вы предоставили параметры пути и заголовки и создали RequestSpecification, используя их. Это раздел “given”.

2. Используя RequestSpecification, созданный выше, вы отправили запрос GET request на https://jsonplaceholder.typicode.com/todos/1?id=1. В случае успеха он возвращает ответ со следующей схемой:

{
  "userId": 1,
  "id": 1,
  "title": "delectus aut autem",
  "completed": false
}

3. Получив ответ HTTP, проверьте его соответствие вашим ожиданиям. then() возвращает ValidatableResponse, который предоставляет fluent interface, в котором вы можете связать свои методы assertion.

4. Вы подтвердили, соответствуют ли код состояния и HTTP-ответ ожидаемым с помощью Hamcrest Matchers.

Rest Assured может сделать гораздо больше. Обратитесь к документации Rest Assured documentation , чтобы узнать больше. Далее вы увидите это в действии.

Cucumber и Spring Boot

Spring Boot требуется несколько секунд, прежде чем он сможет начать обслуживание HTTP-запросов. Таким образом, вы должны предоставить контекст приложения для использования Cucumber.

Создайте класс SpringContextConfiguration.kt в src/test/kotlin/com/raywenderlich/artikles и вставьте фрагмент кода ниже:

import org.springframework.boot.test.context.SpringBootTest
import io.cucumber.spring.CucumberContextConfiguration

@SpringBootTest(
    classes = [ArtiklesApplication::class],
    webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
)
@CucumberContextConfiguration
class SpringContextConfiguration

Здесь вы настроили Spring Boot для запуска на случайном порту до начала выполнения теста.

В том же месте создайте класс ArticleStepDefs.kt, который будет содержать все определения шагов и расширит его от класса выше.

import org.springframework.boot.web.server.LocalServerPort
import io.cucumber.java.*
import io.cucumber.java.en.*
import io.restassured.RestAssured

class ArticleStepDefs : SpringContextConfiguration() {

  @LocalServerPort // 1
  private var port: Int? = 0

  @Before // 2
  fun setup(scenario: Scenario) {
    RestAssured.baseURI = "http://localhost:$port" // 3
    RestAssured.enableLoggingOfRequestAndResponseIfValidationFails()
  }
}

Итак, что здесь происходит?

1. В текущей конфигурации Spring Boot начинает прослушивать HTTP-запросы на случайном порту. @LocalServerPort связывает этот случайно назначенный порт с port.

2. @Before — это scenario hook, который Cucumber вызывает один раз перед каждым сценарием. Хотя scenario hook @After запускается после каждого сценария. Точно так же @BeforeStep и @AfterStep — это перехватчики шагов, которые запускаются до и после каждого шага соответственно. Вы можете использовать их для инициализации или очистки ресурсов или состояния.

3. Создаёте URI приложения, используя динамически выделенный порт, и используете его для настройки базового URL-адреса Rest Assured.

Теперь вы готовы сделать первый шаг.

Feature: Create Article

Добавьте новый каталог с именем create в /src/test/resources/com/raywenderlich/artikles/. Затем создайте новый файл с именем create-article.feature и вставьте следующий фрагмент:

Feature: Create Article.

  Scenario: As a user, I should be able to create new article.
  New article should be free by default and the created article should be viewable.
    Given Create an article with following fields
      | title | Cucumber                                      |
      | body  | Write executable specifications in plain text |

Вы определили сценарий в Gherkin. Он содержит только один шаг. Позже вы добавите другие шаги. Вы будете использовать предоставленные поля (в качестве полезной нагрузки HTTP) для создания статьи (отправьте запрос POST request).

Установив курсор на шаг, откройте контекстное меню. Выберите Create step definition. Затем выберите файл, в котором вы создадите соответствующий метод определения шага. В данном случае это ArticleStepDefs.kt.

 

Вы также можете вручную создать метод внутри ArticleStepDefs. Убедитесь, что шаг Gherkin соответствует выражению Cucumber. Для “Create an article with following fields” метод определения шага такой:

@Given("Create an article with following fields")
fun createAnArticleWithFollowingFields(payload: Map<String, Any>) {
}

Вышеупомянутый метод получает содержимое таблицы данных в виде payload (полезной нагрузки). Вы можете отправить его как полезную нагрузку HTTP запроса POST по адресу /article.

Наконец, запустите тест с помощью интерфейса командной строки или IDE. В IntelliJ создайте новую конфигурацию Cucumber Java со следующими значениями:

Main class: io.cucumber.core.cli.Main
Glue: com.raywenderlich.artikles
Program arguments: --plugin org.jetbrains.plugins.cucumber.java.run.CucumberJvm5SMFormatter

Выберите будущий файл для выполнения в Feature or folder path. Конфигурация будет выглядеть как на изображении ниже.

 

Нажмите кнопку Run (выполнить). Вы должны увидеть прохождение теста.

 

Далее вы узнаете, как справиться с распространенной проблемой в Cucumber — делить состояние между шагами.

State (состояние)

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

Поскольку вы тестируете с точки зрения пользователя или HTTP-клиента, выстраивайте состояние вокруг таких HTTP-конструкций, как запрос, ответ, полезная нагрузка и переменная пути (differentiator).

Создайте StateHolder.kt в src/test/kotlin/com/raywenderlich/artikles. Вставьте фрагмент ниже:

import io.restassured.response.Response
import io.restassured.specification.RequestSpecification
import java.lang.ThreadLocal

object StateHolder {

  private class State {
    var response: Response? = null
    var request: RequestSpecification? = null
    var payload: Any? = null

    /**
     * The value that uniquely identifies an entity
     */
    var differentiator: Any? = null
  }

  private val store: ThreadLocal = ThreadLocal.withInitial { State() }

  private val state: State
    get() = store.get()
}

store — это экземпляр ThreadLocal. Этот класс поддерживает карту между текущим потоком и экземпляром State. Вызов get() в store возвращает экземпляр State, связанный с current thread (текущим потоком). Это важно при выполнении тестов в нескольких потоках. Подробнее об этом вы узнаете позже.

Вам нужно выставить атрибуты State. Вставьте следующие методы в StateHolder:

fun setDifferentiator(value: Any) {
  state.differentiator = value
}

fun getDifferentiator(): Any? {
  return state.differentiator
}

fun setRequest(request: RequestSpecification) {
  state.request = request
}

fun getRequest(): RequestSpecification {
  var specs = state.request
  if (specs == null) {
    // 1
    specs = given()
        .contentType(ContentType.JSON)
        .accept(ContentType.JSON)
    setRequest(specs)
    return specs
  }
  return specs
}

fun setPayload(payload: Any): RequestSpecification {
  val specs = getRequest()
  state.payload = payload
  // 2
  return specs.body(payload)
}

fun getPayloadOrNull(): Any? {
  return state.payload
}

fun getPayload(): Any {
  return getPayloadOrNull()!!
}

fun setResponse(value: Response) {
  state.response = value
}

fun getResponse() = getResponseOrNull()!!

fun getResponseOrNull() = state.response

// 3
fun clear() {
  store.remove()
}

Эти методы (геттеры) соответствуют соглашениям языка Kotlin getX() и getXOrNull(). Следует отметить следующие нетипичные:

1. getRequest() возвращает минимально сконфигурированную RequestSpecification, если State текущего потока не имеет связанного экземпляра RequestSpecification. Вспомните раздел “Given” в Given-When-Then от Rest Assured.

2. setPayload() устанавливает HTTP-тело RequestSpecification, возвращаемого getRequest(). Это полезно для запросов PUT и POST.

3. clear() удаляет экземпляр State, связанный с текущим потоком.

Импорт выглядит так:

import io.restassured.RestAssured.given
import io.restassured.http.ContentType
import io.restassured.response.Response
import io.restassured.response.ValidatableResponse
import io.restassured.specification.RequestSpecification

В том же классе добавьте эти вспомогательные методы:

// 1
fun  getPayloadAs(klass: Class): T {
  return klass.cast(getPayload())
}

// 1
fun getPayloadAsMap(): Map<*, *> {
  return getPayloadAs(Map::class.java)
}

// 2
fun getValidatableResponse(): ValidatableResponse {
  return getResponse().then()
}

fun  extractPathValueFromResponse(path: String): T? {
  return extractPathValueFrom(path, getValidatableResponse())
}

// 3
private fun  extractPathValueFrom(path: String, response: ValidatableResponse): T? {
  return response.extract().body().path(path)
}

Эти методы:

1. Преобразует полезную нагрузку HTTP в другой класс.

2. Предоставляет API для подтверждения Rest Assured Response.

3. Извлекает значение из HTTP-ответа, сопоставленного с путем.

Найдите минутку, чтобы изучить этот класс. Затем вы увидите эти методы в действии.

Создание HTTP-клиента

Чтобы смоделировать контроллер REST, выполните HTTP-вызовы к конечной точке /articles. Используйте для этого Rest Assured.

Создайте HttpUtils.kt в src/test/kotlin/com/raywenderlich/artikles и вставьте фрагмент ниже:

import io.restassured.response.Response

fun  withPayload(payload: T, block: () -> Response?) {
  StateHolder.setPayload(payload)
  block()
}

object HttpUtils {

  private fun executeAndSetResponse(block: () -> Response): Response {
    val response = block()
    StateHolder.setResponse(response)
    return StateHolder.getResponse()
  }

  fun executePost(url: String): Response {
    return executeAndSetResponse {
      StateHolder.getRequest().post(url)
    }
  }

  fun executePut(url: String): Response {
    return executeAndSetResponse {
      StateHolder.getRequest().put(url)
    }
  }

  fun executeGet(url: String): Response {
    return executeAndSetResponse {
      StateHolder.getRequest().get(url)
    }
  }

  fun executeDelete(url: String): Response {
    return executeAndSetResponse {
      StateHolder.getRequest().delete(url)
    }
  }
} 

Методы в HttpUtils считывают payload (если требуется) и используют Rest Assured Request из State (состояния) текущего потока для выполнения HTTP-вызова. После получения ответа он сохраняет результат в State response.

Вставьте приведенный ниже фрагмент, чтобы завершить ранее созданный createAnArticleWithFollowingFields() в ArticleStepDefs.

// 1
withPayload(payload) {
  HttpUtils.executePost("/${Resources.ARTICLES}")
}
// If successful, store the "id" field in differentiator for use in later steps
if (StateHolder.getResponse().statusCode == 200) {
  // 2  
  StateHolder.setDifferentiator(
      StateHolder.extractPathValueFromResponse("id")!!
  )
}

Здесь:

1. Вы сделали POST-запрос к конечной точке /articles, предоставив payload в виде тела.

2. Напомним, что response State хранит ответ, полученный в результате HTTP-запросов. Если запрос успешен, вы извлекаете значение поля “id” из ответа и сохраняете его в differentiator. Позже вы будете использовать его для получения статьи по ее идентификатору.

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

Expected vs. Actual (ожидаемые и фактические)

Хорошо! Вернемся к файлу create-article.feature. В ранее созданном сценарии добавьте следующие шаги:

Then Should succeed
And "id" should not be null
And "title" should not be null
And "body" should not be null
And "lastUpdatedOn" should not be null
And "createdOn" should not be null
And "title" should be equal to "Cucumber"
And "articleType" should be equal to "FREE"
And "title" should be same as that in payload

When Fetch article by id
Then Should succeed
And "title" should be equal to "Cucumber"
And "id" should be equal to differentiator

Значения параметров, такие как ID, title и body, являются именами полей в ответе. Затем создайте соответствующие определения шагов в ArticleStepDefs:

@Then("{string} should not be null")
fun shouldNotBeNull(path: String) {
  // 1
  StateHolder.getValidatableResponse().body(path, notNullValue())
}

@Then("{string} should be equal to {string}")
fun shouldBeEqual(path: String, right: String) {
  StateHolder.getValidatableResponse().body(path, equalTo(right))
}

@Then("{string} should be equal to differentiator")
fun shouldBeEqualToDifferentiator(path: String) {
  StateHolder.getValidatableResponse().body(
      path,
      equalTo(StateHolder.getDifferentiator())
  )
}

@Then("{string} should be same as that in payload")
fun pathValueShouldBeSameAsPayload(path: String) {
  val valueFromResponse = StateHolder.getValidatableResponse()
      .extract().body().path<Comparable>(path)
  val valueFromPayload = StateHolder.getPayloadAsMap()[path]
  assert(valueFromResponse.equals(valueFromPayload))
}

@When("Fetch article by id")
fun fetchArticleById() {
  // 2
  val id = StateHolder.getDifferentiator()
  requireNotNull(id)
  HttpUtils.executeGet("/${Resources.ARTICLES}/${id}")
}

@Then("Should succeed")
fun requestShouldSucceed() {
  assertThat(
      StateHolder.getResponse().statusCode,
      allOf(
          greaterThanOrEqualTo(200),
          lessThan(300)
      )
  )
}

@Then("Should have status of {int}")
fun requestShouldHaveStatusCodeOf(statusCode: Int) {
  assertThat(
      StateHolder.getResponse().statusCode,
      equalTo(statusCode)
  )
}

Здесь:
1. getValidatableResponse() предоставляет удобный способ проверки ответа. Большинство методов assertion похожи, потому что они считывают значение в response, указанном именем поля, и используют Matchers Hamcrest для его подтверждения.
2. Напомним, что createAnArticleWithFollowingFields() также сохраняет значение поля “id” в differentiator. Вы используете его для получения соответствующей статьи, которая сохраняется в ответ.

Найдите минутку, чтобы понять вышеперечисленные методы и их отношение к шагам с Gherkin.
Дополнительный импорт должен выглядеть так:
import org.hamcrest.MatcherAssert.assertThat
import org.hamcrest.Matchers.*
// …

Наконец, запустите Java Cucumber конфигурацию Feature: create-article, чтобы выполнить сценарий. Вы должны увидеть что-то вроде этого:

Прекрасная работа! Вы завершили свой первый сценарий.

Feature: Get Article

Итак, вы научились писать шаги Gherkin и реализовывать их методы определения шагов. Теперь добавьте каталог get в /src/test/resources/com/raywenderlich/artikles/. Создайте там файл функции с именем get-article.feature и вставьте следующее:

Feature: Get Article.

  Scenario: As a user, I should be able to get all articles.
    Given Bulk create articles with following fields
      | title    | body                    |
      | Hamcrest | A testing library       |
      | AssertJ  | Fluent testing library  |
      | TDD      | Test Driven Development |
    When Fetch all articles
    Then Should succeed
    And Should have size of 3

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

Чтобы реализовать определения шагов, откройте ArticleStepDefs.kt и добавьте методы:

@Given("Bulk create articles with following fields")
fun bulkCreateArticles(payloads: List<Map<String, Any>>) {
  // 1
  payloads.forEach {
    createAnArticleWithFollowingFields(it)
  }
}

@When("Fetch all articles")
fun fetchAllArticles() {
  // 2
  HttpUtils.executeGet(Resources.ARTICLES)
}

@Then("Should have size of {int}")
fun shouldHaveSizeOf(size: Int) {
  assertThat(
      StateHolder.getValidatableResponse().extract().body().path<List>(""), // 3
      hasSize(size)
  )
}

Здесь:
1. Поскольку для массового создания не существует конечной точки, перебираете значения в таблице данных, вызывая createAnArticleWithFollowingFields() для каждой строки.
2. Отправляйте запрос GET request на конечную точку /articles. Ответом будет массив JSON.
3. Считываете корень, то есть весь массив JSON, как List (список). Затем проверяете его размер.

Теперь создайте копию Java Cucumber конфигурацию Feature: create-article. Назовите её Feature: get-article. Измените путь к функции на расположение файла для get-article.feature. Затем запустите, чтобы выполнить тесты.

Откройте окончательный проект для сценариев обновления, удаления и извлечения отдельной статьи и новых определений шагов. Окончательная структура тестового каталога будет выглядеть так:

Скопируйте файлы ArticleStepDefs.kt, get-article.feature, delete-article.feature и update-article.feature из финального проекта в свой начальный проект. В get-article.feature закомментируйте строку, содержащую @requiresDBClear, с помощью #. О тегах вы узнаете позже.

Один интересный сценарий в get-article.feature использует Scenario Outline для описания шаблона и Examples (примеры) для определения комбинации входных данных.

Этот сценарий выполняется трижды — один раз для каждого значения ID, заменяя «<id>» на каждом шаге.

Ваши тесты могут пройти или не пройти в зависимости от порядка выполнения файла функций. Причина:

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

Чтобы сделать это утверждение менее строгим, либо измените шаг на что-то вроде Should have size of at least 3 вместо Should have size of 3, либо очистите базу данных перед выполнением этого сценария. Далее вы узнаете, как организовать с помощью тегов.

Tags (тэги)

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

Раскомментируйте ранее закомментированный @requiresDBClear. Затем перейдите к ArticleStepDefs и взгляните на requiresDBClear:

@Before("@requiresDBClear")
fun requiresDBClear(scenario: Scenario) {
  println("Clearing table for ${scenario.name}")
  _repository.deleteAll()
}

requiresDBClear() содержит conditional hook (условный перехватчик), который запускается перед сценариями, помеченными тегом @requiresDBClear. Вы очищаете всю таблицу перед выполнением любого из шагов.

Запустите тесты. Теперь вы обнаружите, что все тесты пройдены.

Вы также можете комбинировать теги, используя @After(«@tag1 and not @tag2») или @After(«@tag1 and @tag2»).

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

Параллельное выполнение тестов

Откройте build.gradle и передайте ConsoleLauncher следующие аргументы после строки args («—scan-classpath»):

systemProperty("cucumber.execution.parallel.enabled", true)
systemProperty("cucumber.execution.parallel.config.strategy", "dynamic")

Выполните эту задачу с помощью ./gradlew test. Используйте ./gradlew test | grep ## для фильтрации логов. Вы можете видеть, что функции выполняются несколькими потоками.

Как и раньше, успех этих тестов также зависит от порядка выполнения. Если сценарий, помеченный тегом @requiresDBClear, выполняется параллельно с другим сценарием, в котором вы только что создали статью, и прямо перед шагом “fetch article by its id”, сценарий завершится неудачно, поскольку таблица уже будет очищена.

Чтобы этого не произошло, запускайте тесты изолированно. Вы узнаете об этом в следующем разделе.

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

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

Создайте файл src/test/resources/junit-platform.properties и добавьте следующее свойство:

cucumber.execution.exclusive-resources.isolated.read-write=org.junit.platform.engine.support.hierarchical.ExclusiveResource.GLOBAL_KEY

Перейдите в файл get-article.feature и пометьте Feature с помощью @isolated.

Теперь функция get-article.feature выполняется изолированно от других функций.

Повторно запустите тесты, и вы увидите, что все тесты пройдены.

Вы можете прочитать об этом больше в документации cucumber-unit-platform-engine documentation.

Далее вы узнаете о плагинах для создания отчетов.

Плагины отчетов

Cucumber предоставляет reporting plugins, которые вы можете использовать для создания отчетов.

Чтобы настроить плагины отчетов, перейдите в build.gradle и укажите ConsoleLauncher следующий аргумент:

systemProperty(
    "cucumber.plugin",
    "pretty, summary, timeline:build/reports/timeline, html:build/reports/cucumber.html"
)

Вы предоставили четыре плагина в формате CSV, а именно: pretty, summary, timeline и html.

Summary выводит итоговый тест в конце.

Плагин html генерирует отчеты в формате HTML по адресу build/report/cucumber.html.

Плагин timeline создает отчет в build/report/timeline, который показывает, как и какой поток выполнял сценарии, что отлично подходит для отладки нестабильных тестов.

Помните тег @isolated? В приведенном выше отчете показано выполнение get-article.feature отдельно от других функций.

Вы прошли весь путь! Вы узнали, как интегрировать Cucumber в приложение Spring Boot, писать и реализовывать определения шагов, использовать несколько потоков для их параллельного выполнения и создавать отчеты с помощью плагинов.

У Cucumber есть хорошо написанная документация по его использованию, а также по анти-шаблонам и BDD.

Оригинал статьи

Схема огурца и сценария

1. Вступление

Cucumber — это среда тестирования BDD (Поведенческая разработка).

Использование структурыto write repetitive scenarios с разными перестановками входов / выходов может занять довольно много времени, сложно поддерживать и, конечно, разочаровывать.

Компания Cucumber пришла с решением для сокращения этих усилий с помощью концепцииScenario Outline coupled with Examples. В следующем разделе мы попытаемся взять пример и посмотреть, как мы можем минимизировать эти усилия.

Если вы хотите узнать больше о подходе и языке Gherkin, посмотритеthis article.

2. Добавление поддержки огурца

Чтобы добавить поддержку Cucumber в простом проекте Maven, нам нужно будет добавить следующие зависимости:


    info.cukes
    cucumber-junit
    1.2.5
    test


    info.cukes
    cucumber-java
    1.2.5
    test


    org.hamcrest
    hamcrest-library
    1.3
    test

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

3. Простой пример

Давайте продемонстрируем как раздутый, так и краткий способ написания избранных файлов. Давайте сначала определим логику, для которой мы хотим написать тест:

Давайте сначала определим логику, для которой мы хотим написать тест:

public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }
}

4. Определение тестов на огурцы

4.1. Определение файла функций

Feature: Calculator
  As a user
  I want to use a calculator to add numbers
  So that I don't need to add myself

  Scenario: Add two numbers -2 & 3
    Given I have a calculator
    When I add -2 and 3
    Then the result should be 1

  Scenario: Add two numbers 10 & 15
    Given I have a calculator
    When I add 10 and 15
    Then the result should be 25

Как видно здесь, для проверки логики сложения здесь были применены 2 разные комбинации чисел. Кроме чисел, все сценарии точно такие же.

4.2. «Клей» код

Чтобы протестировать эти сценарии, важно определить каждый шаг с соответствующим кодом, чтобы преобразовать оператор в функциональный фрагмент кода:

public class CalculatorRunSteps {

    private int total;

    private Calculator calculator;

    @Before
    private void init() {
        total = -999;
    }

    @Given("^I have a calculator$")
    public void initializeCalculator() throws Throwable {
        calculator = new Calculator();
    }

    @When("^I add (-?\d+) and (-?\d+)$")
    public void testAdd(int num1, int num2) throws Throwable {
        total = calculator.add(num1, num2);
    }

    @Then("^the result should be (-?\d+)$")
    public void validateResult(int result) throws Throwable {
        Assert.assertThat(total, Matchers.equalTo(result));
    }
}

4.3. Класс бегунов

Для интеграции функций и связующего кода мы можем использовать бегуны JUnit:

@RunWith(Cucumber.class)
@CucumberOptions(
  features = { "classpath:features/calculator.feature" },
  glue = {"com.example.cucumber.calculator" })
public class CalculatorTest {}

5. Переписывание функций с использованием схем сценария

Мы видели в разделе 4.1. как определение файла объекта может быть трудоемкой задачей и более подвержено ошибкам. Тот же файл функций можно сократить до нескольких строк с помощьюScenario Outline:

Feature: Calculator
  As a user
  I want to use a calculator to add numbers
  So that I don't need to add myself

  Scenario Outline: Add two numbers  & 
    Given I have a calculator
    When I add  and 
    Then the result should be 

  Examples:
    | num1 | num2 | total |
    | -2 | 3 | 1 |
    | 10 | 15 | 25 |
    | 99 | -99 | 0 |
    | -1 | -10 | -11 |

При сравнении обычногоScenario Definition сScenario Outline значения больше не нужно жестко задавать в определениях шагов. Значения заменяются параметрами как<parameter_name> в самом определении шага.

В конце схемы сценария значения определяются в формате таблицы с разделителями-вертикальными чертами с использованиемExamples.

Пример для определенияExamples показан ниже:

Examples:
  | Parameter_Name1 | Parameter_Name2 |
  | Value-1 | Value-2 |
  | Value-X | Value-Y |

6. Заключение

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

Полный исходный код этой статьи можно найти наover on GitHub.

Понравилась статья? Поделить с друзьями:
  • Структура синопсиса сценария
  • Студия территория праздника
  • Студия праздник пряник
  • Структура режиссерского сценария
  • Студия событий галерея праздника