Подтвердить что ты не робот

Определения эталонных областей с SpecFlow?

Я использую SpecFlow для тестирования BDD-стиля. Некоторые из моих функций - тесты UI, поэтому они используют WatiN. Некоторые из них не являются тестами UI, поэтому они этого не делают.

В настоящий момент у меня есть один файл StepDefinitions.cs, охватывающий все мои функции. У меня есть шаг BeforeScenario, который инициализирует WatiN. Это означает, что все мои тесты запускают Internet Explorer, независимо от того, нужны они или нет.

Есть ли какой-либо способ в SpecFlow иметь определенный файл свойств, связанный с определенным набором определений шагов? Или я подхожу к этому с неправильного угла?

4b9b3361

Ответ 1

Существует простое решение вашей проблемы, если вы используете теги.

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

Feature: Save Proportion Of Sample Pool Required
  As an <User> 
  I want to <Configure size of the Sample required> 
  so that <I can advise the deployment team of resourcing requirments>.

  @WatiN
  Scenario: Save valid sample size mid range
  Given the user enters 10 as sample size
  When the user selects save
  Then the value is stored

И затем украсьте привязку BeforeScenario с атрибутом, который указывает тег:

[BeforeScenario("WatiN")]
public void BeforeScenario()
{
  ...
}

Этот метод BeforeScenario будет вызываться только для функций, которые используют WatiN.

Ответ 2

В настоящее время (в SpecFlow 1.3) этапы определения являются глобальными и не могут быть привязаны к определенным функциям.

Это по дизайну имеет то же поведение, что и огурец.

Я задал тот же вопрос о группе огурцов:

http://groups.google.com/group/cukes/browse_thread/thread/20cd7e1db0a4bdaf/fd668f7346984df9#fd668f7346984df9

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

Однако ваша проблема с запуском WatiN только для сценариев, которые требуют UI-интеграции, может быть решена двумя разными способами:

  • Теги и помеченные крючки. Вы можете пометить свои сценарии (например, @web) и определить ina BeforeScenario-Hook, который должен запускаться только для сценариев с определенным тегом (т.е. [BeforeScenario ( "web" )]. См. Интеграцию Selenium в нашем примере BookShop: http://github.com/techtalk/SpecFlow-Examples/blob/master/ASP.NET-MVC/BookShop/BookShop.AcceptanceTests.Selenium/Support/SeleniumSupport.cs

  • Мы часто полностью разделяем сценарии, связанные с пользовательским интерфейсом и сценариями, связанными с программным API (например, контроллером, моделью просмотра...) в разных проектах. Мы попытались проиллюстрировать это в нашем примере BookShop: http://github.com/techtalk/SpecFlow-Examples/tree/master/ASP.NET-MVC/BookShop/.

Ответ 4

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

Если вы по-прежнему хотите связать свои файлы шагов с определенным файлом функций, просто укажите им похожие имена. Нет необходимости, чтобы он был вынужден работать только для этой функции, даже если код шага имеет смысл только для этой функции. Это связано с тем, что даже если вам удастся создать повторяющийся шаг для другой функции, он обнаружит это как двусмысленное совпадение. Поведение для двусмысленных совпадений может быть указано в файле App.config. Видеть http://cloud.github.com/downloads/techtalk/SpecFlow/SpecFlow%20Guide.pdf для получения более подробной информации о файле App.config. По умолчанию неоднозначные совпадения обнаруживаются и сообщаются как ошибка.

[править]: На самом деле существует проблема с этим способом (с файлами шагов, связанными с файлами функций только в вашем уме). Проблема возникает, когда вы добавляете или изменяете файл .feature и используете ту же формулировку, которую вы использовали раньше, и вы забыли добавить для нее шаг, но вы этого не заметите, потому что вы уже создали шаг для этой формулировки один раз до, и это было написано в контексте чувствительным образом. Также я больше не убежден в полезности не связывания файлов шагов с файлами функций. Я не думаю, что большинство клиентов были бы очень хороши в написании спецификации в контексте независимо. Это не то, как мы обычно пишем, говорим или думаем.

Ответ 5

Решение для этого - реализовать теги и привязку с привязкой к тестовому сценарию, который связан с Web или связан с логикой контроллера/ядра в коде.

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

BeforeTestRunScenario 
    BeforeFeature
        BeforeScenario
            BeforeScenarioBlock
                BeforeStep
                AfterStep
            AfterScenarioBlock
        AfterScenario
    AfterFeature
AfterTestRunScenario 

Ответ 6

Также рассмотрите использование DSL с внедрением-агностиком наряду с определениями конкретных для реализации определений. Например, используйте

When I search for 'Barbados'

вместо

`Когда я набираю "Барбадос" в поле поиска и нажимаю кнопку "Поиск"

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