Особенности огурцов: обзор
Опубликовано: 2022-04-20вступление
Gherkin — это язык, который до сих пор используется во многих средах автоматизации тестирования. Иногда это происходит потому, что клиент требует, чтобы мы его использовали, иногда потому, что так решает команда.
Честно говоря, для меня это не была любовь с первого взгляда. Лично у меня довольно долгий путь с огурцом — от того, что он сначала понравился, через какое-то время отвращение к языку, а затем он снова полюбился. В этой статье я представлю наиболее важные функции Cucumber вместе с реализацией Java.
Вот все функции Cucumber, описанные в этой статье:
Особенность | Описание |
---|---|
Сценарий | Простой сценарий |
Схема сценария | Требует от пользователя предоставления тестовых данных в разделе «Примеры». |
Таблицы данных | Требуется, чтобы пользователь предоставил тестовые данные для шага тестирования |
Контекст сценария | Совместное использование значений между этапами тестирования |
Типы данных огурца | Типы данных, обрабатываемые огурцом |
Регулярное выражение огурца | Использование регулярных выражений в сценариях с огурцами |
Огуречные крючки | Выполняет дополнительный код в тестовых сценариях |
Файл функции
Прежде всего, что такое файл функций? В техническом мире был создан нетехнический подход, позволяющий нетехническим людям сотрудничать с командой во время разработки приложения. Язык Gherkin был создан как дополнительный слой в подходе BDD. Тесты Gherkin расположены в так называемых файлах функций, которые склеены с кодом (Java, Kotlin, C# и т. д.). Обычно Gherkin очень прост в использовании и требует минимальных знаний в области программирования, но есть функции, которые требуют некоторого программирования.
Давайте начнем с чего-нибудь легкого.
Сценарий
Вот самый простой и простой в использовании пример теста Cucumber:
Особенность: Сценарий Предыстория: перед сценариями тестирования Учитывая, что я выполняю перед шагом @Тест Сценарий: Сценарий Учитывая, что я использую параметризованный шаг «Сценарий 1»,
Блок кода 1. Сценарий
Блок кода 1. содержит несколько пояснений:
- Функция : название файла функции.
- Background : ключевое слово, которое позволяет пользователю выполнять тестовые шаги перед каждым тестовым сценарием, определенным в файле функций.
- @Test : Тег, который сообщает среде тестирования, какой тестовый сценарий должен быть выполнен. «Тест» определяется пользователем. Мы можем использовать, например, «@SmokeTest»
- Сценарий : название тестового сценария.
В тестах Gherkin используются ключевые слова [Дано, Когда, Тогда, Но] перед каждым этапом теста. В нашем единственном тестовом шаге, кроме шага «Фон», мы используем параметр, в который мы передаем значение «Сценарий 1».
Теперь давайте посмотрим, как выглядит склеенный Java-код:
@Given("Я выполняю перед шагом") общественное недействительное iExecuteBeforeStep () { //некоторая реализация } @Given("Я использую параметризованный шаг {string}") public void iUseParametrizedStepOf (String p) { //некоторая реализация }
Блок кода 2. Реализация сценария на языке Java
Схема сценария
Давайте сделаем что-то более сложное:
Особенность: план сценария @Тест Схема сценария: Схема сценария Учитывая, что я запускаю шаг с «<parameter1>» и «<parameter2>» Примеры: | параметр1 | параметр2 | | параметр1а | параметр2а | | параметр1b | параметр2b |
Блок кода 3. Схема сценария
На этот раз мы будем использовать схему сценария, которая позволяет нам повторять сценарии тестирования с различными конфигурациями тестовых данных. Блок кода 3. содержит несколько вещей, которые нужно объяснить:
- Примеры : матрица тестовых данных для использования в тестовых сценариях. Первая строка — это заголовок с именами параметров.
И реализация Java:
@Given("Я запускаю шаг с {string} и {string}") public void iRunStepWithAnd (строка p1, строка p2) { //некоторая реализация }
Блок кода 4. Java-реализация Scenario Outline
Таблица данных
Схема сценария очень полезна, но что, если мы не хотим повторять весь тестовый сценарий, а только один шаг теста? У Gherkin есть способ сделать это, и он называется «Таблица данных».
Особенность: Таблица данных @Тест Сценарий: Сценарий таблицы данных Учитывая, что я проверяю, что столбец содержит ожидаемое значение | имя столбца | ожидаемое значение | | имяКолонки | некоторое ожидаемое значение |
Кодовый блок 5. Таблица данных
Сценарий с таблицей данных мало чем отличается от схемы сценария. Единственное, ключевое слово «Примеры» мы не ставим перед таблицей.
Реализация Java выглядит немного сложнее, чем в предыдущих случаях:
@Given("Я проверяю, что столбец содержит ожидаемое значение") public void iVerifyColumnValuesInTableUsingQueryFromFileOnSchema (DataTable dataTable) { Список<Карта<Строка, Строка>> data = dataTable.asMaps(); for (Форма Map<String, String>: данные) { Строка имя_столбца = form.get("имя_столбца"); Строка ожидаемого результата = form.get("expectedValue"); //некоторая реализация } } }
Блок кода 6. Java-реализация таблицы данных

Для доступа к данным из таблицы данных мы создаем специальную переменную dataTable типа «DataTable». Все данные будут храниться в переменной List.
Контекст сценария
Используя контекст сценария, мы можем обмениваться данными между шагами. Предположим, у нас есть двухшаговый сценарий, в котором мы хотим передать значение «данные» с шага 1 на шаг 2 (блок кода 7).
@Тест Сценарий: контекст сценария Учитывая, что я установил значение контекста сценария «данные» Учитывая, что я использую значение контекста сценария
Блок кода 7. Контекст сценария
Во-первых, нам нужно создать специальный класс ScenarioContext с функциями контекста сценария для установки и получения данных (блок кода 8). Контекст нашего сценария — это HashMap с парой ключ-значение. Мы будем идентифицировать значения по его ключу.
- scriptContext() : HashMap пары ключ-значение
- setContext() : метод ключ-значение для хранения данных контекста сценария
- getContext() : метод для получения данных, предоставляющих ключ
открытый класс ScenarioContext { частный Map<String, Object> scriptContext; общедоступный сценарийContext () { scriptContext = новый HashMap<>(); } public void setContext (ключ контекста, значение объекта) { scriptContext.put(key.toString(), значение); } открытый объект getContext (контекстный ключ) { вернуть сценарийContext.get(key.toString()); } } общественное перечисление Контекст { Я БЫ; }
Блок кода 8. Java-реализация класса Scenario Context
Имея это, мы можем использовать реализованные методы. Затем на шаге 1 мы устанавливаем значение в контексте сценария, а на шаге 2 получаем значение (блок кода 9).
ScenarioContext ScenarioContext = новый ScenarioContext(); @Given("Я установил значение контекста сценария {string}") public void iSetScenarioContextValue (строковое значение) { scriptContext.setContext(Context.ID, значение); } @Given("Я использую значение контекста сценария") общественное недействительное iUseScenarioContextValue () { Строка sharedValue = scriptContext.getContext(Context.ID).toString(); }
Блок кода 9. Шаги контекста сценария
Типы данных огурца
Cucumber обрабатывает ограниченное количество типов данных. Мы можем определить строки, целые числа и значения с плавающей запятой, но в случае логических значений нам нужно кодировать некоторые обходные пути.
@Тест Сценарий: Сценарий с переменными Учитывая, что я использую строку "string", int 1, float 1.1 и логическое значение "false"
Блок кода 10. Типы данных огурца
Код Java будет выглядеть примерно так:
@Given("Я использую строку {string}, int {int}, float {float} и логическое значение {string}") public void iUseStringIntFloatAndBoolean (String var1, int var2, double var3, String var4) { логическое значение f = логическое значение.valueOf (var4); //какой-то код }
Блок кода 11. Java-реализация типов данных Cucumber
Регулярное выражение огурца
Это еще одна часто используемая функция. Блок кода 12 показывает двухэтапный сценарий, который отличается только использованием разных значений переменных (var1 и var2). На самом деле это всего лишь один шаг, и в коде Java (блок кода 13) мы определяем только один метод, но с регулярным выражением и одним параметром var.
@Тест Сценарий: сценарий регулярного выражения Учитывая, что я использую переменную var1 Учитывая, что я использую переменную var2
Блок кода 12. Регулярные выражения в Cucumber
@Given("^Я использую переменную (.*)") public void examTimeTableInSummerSeason (String var) { если (var.equals("var1")){ //какой-то код } иначе если (var.equals ("var2")) { //какой-то код } }
Блок кода 13. Java-реализация регулярного выражения Cucumber
Огуречные крючки
И последнее, но не менее важное: крючки для огурцов.
Блок кода 14 представляет 4 наиболее важных хука:
- @Before : выполняет код перед каждым тестовым сценарием.
- @After : выполняет код после каждого тестового сценария.
- @BeforeStep : выполняет код перед каждым шагом теста.
- @AfterStep : выполняет код после каждого шага теста.
@До публичная пустота перед сценарием () { //какой-то код } @После общественная недействительность после сценария () { //какой-то код } @BeforeStep публичная пустота перед шагом () { //какой-то код } @AfterStep общественная недействительность после шага () { //какой-то код }
Блок кода 14. Крючки огурца
Резюме
Надеюсь, я убедил вас использовать Gherkin в своих тестах. Эти несколько функций сделают ваши тесты более читабельными и понятными людям, не являющимся техническими специалистами. Также новым участникам будет легче понять бизнес-логику и сократить время адаптации.