Работа с несколькими незначительными изменениями в SpecFlow

#.net #cucumber #bdd #specflow #gherkin

#.net #cucumber #bdd #specflow #корнишон

Вопрос:

Всем привет, мы разрабатываем веб-сервис, который будет доступен через SOAP и REST (xml и JSon). Наши функции specflow в основном одинаковы, т.е:

 Scenario: There are at least 3 radio Channels 
Given The test server is up and running 
And The previously obtained channel list is reset
When I request a list of radio channels
Then the resulting deliveryPackage contains a list of  at least 3 items
  

Все эти функции необходимо протестировать для интерфейса SOAP, для интерфейса REST / Xml и для интерфейса REST / JSon.

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

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

Итак, два вопроса: 1) Как мне запустить функцию 3 раза для 3 разных интерфейсов, которые ожидают одни и те же сценарии? 2) Как мне каждый раз выбирать правильный файл step?

Решение (1), вероятно, решит (2).

Ответ №1:

Мой коллега дал нам хорошо работающее решение: Наброски сценария:

 Scenario Outline: Channels on different protocols
Given The test server is up and running
And The previously obtained channel list is reset
When I request a list of radio channels for the <protocol> and <binding>
Then the resulting deliveryPackage contains a list of  at least 3 items
Scenarios: 
| protocol | binding                          |
| XML      | BasicHttpBinding_IProgramService |
| JSON     | BasicHttpBinding_IProgramService |
| SOAP     | CustomBinding_IProgramService    |
  

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

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

Дополнительная информация здесь: Управление группами связанных сценариев

Ответ №2:

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

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

Другой вопрос: если SpecFlow — подходящее место для настройки таких шагов, не следует ли эти детали тестировать на другом уровне (тесты интеграции инфраструктуры и модульные тесты для компонентов), поэтому Gherkin используется только для сквозного тестирования приемочного варианта использования. Некоторое время назад я бы настаивал на том, что SpecFlow — неподходящий инструмент для таких тестов, но я вижу, что Gherkin успешно используется на всех уровнях, поэтому, возможно, ваш вопрос поднимает хороший вопрос о том, как SpecFlow (и Gherkin) могут быть приняты для обеспечения такого рода тестирования без повторения кода.

Ответ №3:

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

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

Затем вы устанавливаете StepScopeAttribute в методе или классе, чтобы указать, что этот метод / класс ограничен определенной функцией / сценарием / тегом. Здесь есть пример проекта от автора:

https://github.com/techtalk/SpecFlow/tree/master/Tests/FeatureTests/ScopedSteps

Комментарии:

1. Боюсь, это не идеальное решение, в итоге мы получили бы несколько тысяч функций, каждая из которых является 3-кратной копией — нет ничего, что соответствовало бы опции Cucumber указывать, откуда загружать файлы step?

2. Насколько я знаю, нет. Вы всегда можете расширить исходный код таким образом, чтобы сценарий генерировал тест с помощью атрибута NUnit TestCaseAttribute. Затем это могло бы предоставить тег, который затем разрешил бы правильный метод с использованием StepScope.

Ответ №4:

Как насчет того, чтобы сказать:

 When I request a list of radio channels for JSON, XML and SOAP
Then the corresponding resulting deliveryPackages contains a list of  at least 3 items
  

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

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