Можно ли в одном feature файле разместить несколько сценариев

Обновлено: 05.07.2024

После того, как вы стали более удобными в Behavior-Driven Developement с использованием SpecFlow, мне было интересно, есть ли несколько сценариев для одной и той же функции:

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

Просто чтобы назвать несколько. Я читал о тегах с использованием FeatureFlow Feature File, чтобы я мог сделать следующее:

Затем, используя [BeforeScenario("myTag")] , следует выполнить трюк.

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

Я правильно понял, или я здесь в тумане?

Я слишком далеко продвигаюсь?

Я что-то пропустил?

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

Я имею в виду, что все эти сценарии относятся к функции Register, и поэтому они должны быть определены в том же файле Feature.Feature SpecFlow, правильно?

Хорошо, у вас есть пара вопросов, поэтому я буду работать через них:

Затем использование [BeforeScenario ( "myTag" )] должно сделать трюк.

Атрибут hook BeforeScenario используется для запуска некоторого кода до выполнения сценария. Он часто используется для настройки среды для сценария (например, заполнение тестовой базы данных соответствующими данными); если используется для этой цели, то использование AfterScenario также может использоваться для очистки результата BeforeScenario.

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

Если я правильно вас понимаю, вы хотите иметь возможность использовать тег для управления, когда можно запустить/не запустить шаг в рамках сценария. Это невозможно с атрибутами hook SpecFlow; есть крючок BeforeStep, но это только позволяет вам выполнить код до запуска шага, он не позволяет игнорировать этот шаг.

Все ли "слишком короткий пароль", "нет предоставленных учетных данных" разные сценарии использования, или они что-то еще, что может поместиться где-нибудь еще в коде, например, сам блок тестирует?

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

Что касается вашего сценария:

Вместо этого используйте:

Посредством этого вы сможете повторно использовать "При вводе пароля" в "Зарегистрировать пользователя с слишком коротким паролем". Это приводит меня к:

Нет необходимости в отдельном шаге, в котором указано, что пароль слишком короткий. Просто повторите использование:

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

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

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

Затем использование [BeforeScenario("myTag")] должно сделать трюк.

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

Правильно ли я понял, или я здесь в тумане?

Не слишком ли далеко я зашел?

Я что-то упустил?

Все ли "too short password", "no credentials provided" рассматриваются как разные сценарии использования, или это что-то другое, что может поместиться только где-то еще в коде, как сами модульные тесты?

Я имею в виду, что все эти сценарии принадлежат функции Register, и как таковые они должны быть определены в одном файле функций Register.feature SpecFlow, верно?

1 ответ

Я использую protractor-cucumber-framework для автоматизации тестирования. У меня есть несколько файлов функций. Каждый файл функций имеет несколько сценариев. Я использую cucumber-html-reporter, чтобы получить отчет о выполнении теста HTML. Этот отчет HTML содержит подробную информацию об общем.

Я создал проект cucumber-spring, используя один боб EventFiringWebDriver spring для всех сценариев в каждом файле функций. Мои тесты работают нормально, и отсутствие открытия нового драйвера для каждого сценария сокращает общее время тестирования. Является ли это приемлемой практикой? Спасибо за.

Хорошо, у вас есть пара вопросов, так что я их проработаю:

Затем использование [BeforeScenario("myTag")] должно сделать трюк.

Атрибут BeforeScenario hook используется для запуска некоторого кода перед выполнением сценария. Он часто используется для настройки среды для сценария (например, для заполнения тестовой базы данных соответствующими данными); если он используется для этой цели, то использование AfterScenario также может быть использовано для очистки результата BeforeScenario.

Крючки позволяют выполнять подмножество тестов, которые должны быть выполняется по определенным правилам. Таким образом, метод When может быть выполнен с предопределенным контекстом

Если я вас правильно понимаю, вы хотите иметь возможность использовать тег для управления тем, когда шаг в сценарии может быть run/not-run. Это невозможно с атрибутами крючка SpecFlow; есть крючок BeforeStep, но это позволяет выполнять код только до запуска шага, он не позволяет игнорировать шаг.

Считаются ли все "too short password", "no credentials provided" различные сценарии использования, или это что-то другое, что может поместиться только где-то еще в коде, например, сами модульные тесты?

В вашем примере да, это разные сценарии для вашей функции "Register a new user". Если вы придерживаетесь строгого подхода BDD к своей разработке, то с вашим подходом к разработке "outside-in inside-out" вы также реализуете модульные тесты (возвращаясь к TDD как части процесса BDD), которые также будут охватывать проверку "too short password" и "no credentials provided".

Что касается вашего сценария:

Вместо того, чтобы использовать это, используйте:

Сделав это, вы сможете повторно использовать "When I enter my password" в "Register a user using a password that is too short". Это приводит меня к:

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

По той же причине не используйте:

просто повторное использование:

Похожие вопросы:

У меня есть файл функций Cucumber с более чем 66 сценариями! Название файла функций действительно отражает суть всех сценариев. Но 66 (200 шагов) кажется довольно большим числом. Не означает ли это.

Я пытаюсь установить rpath в моем файле спецификации с помощью оператора типа export LDFLAGS=-Wl-rpath=$ORIGIN/../lib Но я не могу правильно избежать $ORIGIN. Мне нужна команда to gcc, чтобы.

У меня есть файл Specflow .feature, содержащий несколько сценариев. Большинство сценариев в файле функций используют фон. Однако один сценарий не требует такого фона. Как я могу остановить работу.

Я использую protractor-cucumber-framework для автоматизации тестирования. У меня есть несколько файлов функций. Каждый файл функций имеет несколько сценариев. Я использую cucumber-html-reporter.

Я создал проект cucumber-spring, используя один боб EventFiringWebDriver spring для всех сценариев в каждом файле функций. Мои тесты работают нормально, и отсутствие открытия нового драйвера для.

У нас есть довольно сложная настройка спецификации интеграции с capybara и chrome. Это приводит к медленным характеристикам функций. Было бы неплохо, если бы спецификации функций выполнялись после.

у меня есть файл функций ALLTests, имеющий несколько сценариев Например: TC1, TC2 ,TC3 , TC4 Я хочу запустить только TC2 и TC4 с ALLTests по maven команду, как этого добиться ? Я попробовал --tags.

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

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

2. Корнишон – Язык огурца

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

2.1. Введение в корнишон

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

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

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

2.2. Характеристика

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

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

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

Эти действия выполняются с помощью шагов, определенных одним из пяти ключевых слов: Дано , Когда , Тогда , И , и Но|/.

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

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

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

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

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

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

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

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

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

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

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

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

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

4. Создание и запуск тестов

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

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

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

4.2. Настройка JUnit для работы с Огурцом

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

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

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

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

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

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

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

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

В качестве альтернативы мы могли бы использовать регулярное выражение:

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

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

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

Для демонстрации REST API мы используем сервер WireMock:

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

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

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

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

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

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

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

Вот реализация этого вспомогательного метода преобразования:

Следующее проверяет весь процесс:

Наконец, остановите сервер, как описано ранее.

5. Параллельное выполнение функций

Cucumber-JVM изначально поддерживает параллельное выполнение тестов в нескольких потоках. Мы будем использовать JUnit вместе с плагином Maven Failsafe для выполнения бегунов. В качестве альтернативы мы могли бы использовать Maven Surefire.

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

Теперь давайте добавим конфигурацию плагина:

Обратите внимание, что:

  • параллельный: может быть классами, методами или и тем , и другим – в нашем случае классы заставят каждый тестовый класс запускаться в отдельном потоке
  • количество потоков: указывает, сколько потоков должно быть выделено для этого выполнения

Это все, что нам нужно сделать, чтобы запустить функции Cucumber параллельно.

6. Заключение

В этом уроке мы рассмотрели основы Cucumber и то, как этот фреймворк использует доменный язык Gherkin для тестирования REST API.

Как обычно, все примеры кода, показанные в этом руководстве, доступны на GitHub .

Cucumber - это среда автоматического тестирования, которая поддерживает BDD (Behavior Driven Development), то есть разработку, управляемую поведением. Перед модульным тестированием или интеграционным тестированием этапы тестирования и информация о проверке заранее определяются на общем языке (английском), чтобы не разработчики могли понять этапы тестирования, цель каждого этапа модульного тестирования и интеграционного тестирования. А те, кто пишет модульные тесты и интеграционные тесты, могут писать код на основе заранее написанного фреймворка для достижения цели разработки, основанной на поведении.

1. Импортируйте плагин Cucumber в eclipse.Метод импорта такой же, как и у других плагинов здесь, поэтому нет никаких объяснений.

2. Создайте новый проект Java и импортируйте пакет jar, требуемый Cucumber, в проект Java (лучше создать новую папку и поместить в эту папку пакет jar).



3. Добавьте недавно импортированные файлы JAR через Путь сборки.





4. Создайте новый файл формата объекта, используемый для определения шагов. Вновь созданный файл формата объекта автоматически заполнит файл шаблона. Конкретный метод использования будет описан позже. Как и выше, лучше всего поместить его в определенную папку, в этом примере - папка Feature.





5. Импортируйте протестированный пакет в проект Java. В этом примере тестируется простой класс Calculator.


6. Создайте новый пакет.Имя пакета должно быть test.java или main.java, иначе при последующих этапах создания шагов определения Cucumber возникнет ошибка.

7. Создайте новый класс Step-Definition в пакете test.java.





1. .feature файл

Определяет шаги теста, включая следующие ключевые слова

  • Feature :Один .feature В файле есть ровно одно ключевое слово Feature. Опишите объект для тестирования, обычно это название теста.
  • Scenario :Один .feature В файле может быть 0 или более ключевых слов сценария. Сценарий тестового объекта, например тестовый метод Add (), может иметь несколько сценариев, таких как добавление двух целых чисел и добавление двух отрицательных чисел.
  • Given :Один .feature В файле есть ровно одно ключевое слово Given. Это эквивалентно заданным условиям в тестовом примере. Если вы хотите выразить несколько предустановленных условий, вы можете добавить их с помощью ключевого слова And.
  • When :Один .feature В файле есть ровно одно ключевое слово When. Конкретные шаги операции аналогичны шагам в тестовом примере. Если вы хотите выразить несколько этапов операции, вы можете добавить их с помощью ключевого слова And.
  • Then :Один .feature В файле есть ровно одно ключевое слово Then. Это эквивалентно ожидаемому результату в тестовом примере. Если вы хотите выразить несколько ожидаемых результатов, вы можете добавить их с помощью ключевого слова And.
  • And :Один .feature В файле может быть ноль или более ключевых слов And. Элемент And может дополнять дополнительные предустановленные условия или рабочие шаги.
  • But :Один .feature В файле может быть ноль или более ключевых слов But. Но, как и And, может использоваться вместе с Given, When и Then для добавления описаний отрицательных типов, обычно применимых только к отрицательным условиям. Такие как:

BUT home page should not be missing

  • Scenario Outline :Один .feature В файле может быть ноль или более ключевых слов схемы сценария. Когда в сцене есть несколько наборов значений, они должны использоваться вместе с примером и появляться парами.
  • Examples : Отображается в паре со схемой сценария, под которой находится список из нескольких тестовых значений.


2. Step-definition файл

Определение шага Cucumber в основном такое же, как и в других файлах формата Java, но вы можете выборочно проверять и автоматически добавлять комментарии Give, When, Then, And, But при создании.


После завершения будет автоматически сгенерирован файл java-шаблона, включающий ранее отмеченные комментарии.В этом примере отмечены флажками Given, When, Then и And. Формат комментария:

@Given("^you are in Given annotation$")

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

3. Файл выполнения теста

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

Аннотации RunWith одинаковы для каждого тестового файла фреймворка Cucumber, так как RunWith(Cucumber.class) 。 Содержимое аннотации CucumberOption необходимо изменить вручную в соответствии с реальной ситуацией.

Параметры аннотации CucumberOptions обычно имеют features 、 glue 、 monochrome с участием dryrun Подождите. среди них. f eature s с участием glue Необходимо, m onochrome с участием dryrun По желанию.

Features определяет относительный путь к файлу .feature в формате features = "имя файла .feature в папке проекта / .feature файл". например, features = "Feature / CalculatorAdd.feature"

Glue определяет имя пакета Step-difinition в формате glue = "полное имя пакета". например test.java.cucumberDefinition.

Параметр «монохромный» имеет два значения: «истина» и «ложь», значение по умолчанию - ложь, а формат - монохромный = логический. Используется для контроля удобочитаемости результатов тестирования. Если монохромный = true, результаты теста более читабельны. Когда монохромный = true, читаемость результатов теста плохая.

Параметр «сухой прогон» временно неизвестен.

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

Читайте также: