Cucumber программа что это

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

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

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

Gherkin

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

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

What is Cucumber ?

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

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

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

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

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

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

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

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

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

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

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

Cucumber автотесты с нуля Selenide на примере написания бота | QA Automaion


Первым делом добавим cucumber в зависимости Maven:

info.cukes cucumber-java 1.2.4

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

junit junit 4.12 info.cukes cucumber-junit 1.2.4

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Читайте также:
Windows средство удаления вредоносных программ что это

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

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

    Фреймворк по умолчанию оборачивает данные, перечисленные через запятую, в ArrayList:

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

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

Дано в меню доступны пункты Файл и Редактировать и О программе
Дано в меню доступны пункты | Файл | | Редактировать | | О программе |
Дано в меню доступны пункты | Файл | true | | Редактировать | false | | О программе | true |
public void вМенюДоступныПункты(Map arg) < // что-то сделать >

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

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

public List asMaps(Class keyType,Class valueType)

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

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

Тестирование API REST с огурцом

Это руководство знакомит сCucumber, широко используемым инструментом для приемочного тестирования пользователей, и с тем, как использовать его в тестах REST API.

Кроме того, чтобы сделать статью автономной и независимой от любых внешних REST-сервисов, мы будем использовать WireMock, библиотеку веб-сервисов-заглушек и насмешек. Если вы хотите узнать больше об этой библиотеке, обратитесь кintroduction to WireMock.

2. Корнишон — язык огурца

Cucumber — это инфраструктура тестирования, которая поддерживает Behavior Driven Development (BDD), позволяя пользователям определять операции приложения в виде простого текста. Работает на основеGherkin Domain Specific Language (DSL). Этот простой, но мощный синтаксис Gherkin позволяет разработчикам и тестировщикам писать сложные тесты, оставляя их понятными даже для нетехнических пользователей.

2.1. Знакомство с корнишоном

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

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

Вот простой пример документа Gherkin:

Feature: A short description of the desired functionality Scenario: A business situation Given a precondition And another precondition When an event happens And another event happens too Then a testable outcome is achieved And something else is also completed

В подразделах ниже будет описана пара наиболее важных элементов в структуре корнишона.

2.2. Особенность

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

Весь текст, кроме ключевого словаFeature, пропускается парсером Cucumber и включается только в целях документации.

2.3. Сценарии и шаги

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

Эти действия выполняются с помощью шагов, обозначенных одним из пяти ключевых слов:Given,When,Then,And иBut.

  • Given: этот шаг предназначен для перевода системы в четко определенное состояние перед тем, как пользователи начнут взаимодействовать с приложением. ПредложениеGiven можно рассматривать как предварительное условие для варианта использования.
  • When: ШагWhen используется для описания события, которое происходит с приложением. Это может быть действие, предпринятое пользователями, или событие, вызванное другой системой.
  • Then: На этом шаге указывается ожидаемый результат теста. Результат должен быть связан с бизнес-ценностями тестируемой функции.
  • And иBut: эти ключевые слова можно использовать для замены указанных выше ключевых слов шага, когда имеется несколько шагов одного типа.

Огурец на самом деле не различает эти ключевые слова, однако они все еще существуют, чтобы сделать функцию более удобочитаемой и соответствовать структуре BDD.

3. Реализация Cucumber-JVM

Изначально Cucumber был написан на Ruby и был портирован на Java с реализацией Cucumber-JVM, которая является темой этого раздела.

3.1. Maven Зависимости

Чтобы использовать Cucumber-JVM в проекте Maven, в POM должна быть включена следующая зависимость:

info.cukes cucumber-java 1.2.4 test

Чтобы облегчить тестирование JUnit с помощью Cucumber, нам нужна еще одна зависимость:

info.cukes cucumber-junit 1.2.4

В качестве альтернативы, мы можем использовать другой артефакт, чтобы воспользоваться лямбда-выражениями в Java 8, которые не будут рассмотрены в этом руководстве.

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

Сценарии корнишона были бы бесполезны, если бы они не были переведены в действия, и именно здесь вступают в игру определения шагов. По сути, определение шага — это аннотированный Java-метод с прикрепленным шаблоном, задачей которого является преобразование шагов Gherkin в виде простого текста в исполняемый код. После анализа документа объекта Cucumber выполнит поиск определений шагов, которые соответствуют предварительно заданным шагам корнишона для выполнения.

Читайте также:
Channels что за программа

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

Given I have registered a course in example

И определение шага:

Когда Cucumber прочитает данный шаг, он будет искать определения шагов, чьи аннотирующие шаблоны соответствуют тексту корнишона. На нашей иллюстрации обнаружено, что методtestMethod соответствует, и затем выполняется его код, в результате чего на консоли выводится строкаLet me in!.

4. Создание и выполнение тестов

4.1. Написание файла функций

Начнем с объявления сценариев и шагов в файле с именем, заканчивающимся расширением.feature:

Feature: Testing a REST API Users should be able to submit GET and POST requests to a web service, represented by WireMock Scenario: Data Upload to a web service When users upload data on a project Then the server should handle it and return a success status Scenario: Data retrieval from a web service When users want to get information on the Cucumber project Then the requested data is returned

Теперь мы сохраняем этот файл в каталоге с именемFeature при условии, что каталог будет загружен в путь к классам во время выполнения, например src/main/resources.

4.2. Настройка JUnit для работы с Cucumber

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

Как видите, элементfeatures вCucumberOption находит файл функций, созданный ранее. Другой важный элемент, называемыйglue, предоставляет пути к определениям шагов. Однако, если тестовый набор и определения шагов находятся в том же пакете, что и в этом руководстве, этот элемент может быть удален.

4.3. Написание определений шагов

Когда Cucumber анализирует шаги, он будет искать методы, помеченные ключевыми словами Gherkin, чтобы найти соответствующие определения шагов. В этом руководстве эти определения шагов определены в классе в том же пакете сCucumberTest.

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

А вот метод, соответствующий шагу корнишона, который получает аргумент из текста, который будет использоваться для получения информации от веб-службы REST:

Как видите, методusersGetInformationOnAProject принимает аргументString, который является именем проекта. Этот аргумент объявлен(.+) в аннотации, и здесь он соответствуетCucumber в тексте шага.

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

4.4. Создание и выполнение тестов

Сначала мы начнем со структуры JSON, чтобы проиллюстрировать данные, загруженные на сервер с помощью запроса POST и загруженные на клиент с помощью GET. Эта структура сохраняется в полеjsonString и показана ниже:

Чтобы продемонстрировать REST API, в игру вступает сервер WireMock:

WireMockServer wireMockServer = new WireMockServer(options().dynamicPort());

Кроме того, в этом руководстве будет использоваться API-интерфейс Apache HttpClient для представления клиента, используемого для подключения к серверу:

CloseableHttpClient httpClient = HttpClients.createDefault();

Теперь перейдем к написанию кода тестирования в рамках определений шагов. Сначала мы сделаем это для методаusersUploadDataOnAProject.

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

wireMockServer.start();

Использование API WireMock для заглушки службы REST:

configureFor(«localhost», wireMockServer.port()); stubFor(post(urlEqualTo(«/create»)) .withHeader(«content-type», equalTo(«application/json»)) .withRequestBody(containing(«testing-framework»)) .willReturn(aResponse().withStatus(200)));

Теперь отправьте на сервер запрос POST с содержимым, взятым из поляjsonString, объявленного выше:

HttpPost request = new HttpPost(«http://localhost:» + wireMockServer.port() + «/create»); StringEntity entity = new StringEntity(jsonString); request.addHeader(«content-type», «application/json»); request.setEntity(entity); HttpResponse response = httpClient.execute(request);

Следующий код подтверждает, что запрос POST был успешно получен и обработан:

assertEquals(200, response.getStatusLine().getStatusCode()); verify(postRequestedFor(urlEqualTo(«/create»)) .withHeader(«content-type», equalTo(«application/json»)));

Сервер должен остановиться после использования:

wireMockServer.stop();

Второй метод, который мы здесь реализуем, -usersGetInformationOnAProject(String projectName ). Как и в первом тесте, нам нужно запустить сервер, а затем заглушить службу REST:

wireMockServer.start(); configureFor(«localhost», wireMockServer.port()); stubFor(get(urlEqualTo(«/projects/cucumber»)) .withHeader(«accept», equalTo(«application/json»)) .willReturn(aResponse().withBody(jsonString)));

Отправка запроса GET и получение ответа:

HttpGet request = new HttpGet(«http://localhost:» + wireMockServer.port() + «/projects/» + projectName.toLowerCase()); request.addHeader(«accept», «application/json»); HttpResponse httpResponse = httpClient.execute(request);

Home

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

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

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

Gherkin

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

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

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

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

Читайте также:
Picture package что за программа

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

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. Класс, указанный в этой аннотации, определяет каким образом запускать тесты.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Фреймворк по умолчанию оборачивает данные, перечисленные через запятую, в ArrayList:

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

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

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

public void вМенюДоступныПункты(Map arg) < // что-то сделать >
Дано в меню доступны пункты | Файл | true | 5 | | Редактировать | false | 8 | | О программе | true | 2 |

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

public List asMaps(Class keyType,Class valueType)

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

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

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru