Наружный BDD (с Specflow) - PullRequest
41 голосов
/ 01 ноября 2011

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

1. Декларативные или императивные сценарии?

Большинство сценариев «когда-то-то-то», которые я видел, были написаны с точки зрения пользовательского интерфейса (императив).

Scenario: Login
     Given I am on the Login-page
     When I enter 'AUser' in the textbox 'UserName'
       And I enter 'APassword' in the textbox 'Password'
       And I click the 'Login' button
     Then I should see the following text 'You are logged in'

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

Scenario: Login (declarative)
     Given I am not logged in
     When I log in using valid credentials
     Then I should be logged in

Если вы предпочитаете декларативный стиль, как бы вы описали такие вещи, как «Домашняя страница» или «Страница продуктов»?

2. Упражнение UI или нет?

Большинство реализаций шагов, которые я видел, использовали WatiN, White или что-то подобное для реализации сценариев с точки зрения пользователя. Запуск браузера, нажатие кнопок. Я думаю, что это очень медленно и хрупко. Ну, я могу использовать что-то вроде объекта Page, чтобы сделать тесты менее хрупкими. Но это другой объем работы. Специально для настольных приложений со сложным пользовательским интерфейсом.

Как вы реализуете сценарии в реальных проектах - с помощью пользовательского интерфейса или с помощью тестирования контроллеров / докладчиков?

3. Реальная база или нет?

Когда заданная часть сценария реализуется, часто требуется наличие некоторых данных в системе (например, некоторые продукты для применения в магазине). Как вы реализуете эту часть - добавление данных в реальную базу данных (полное сквозное тестирование) или предоставление заглушек репозитория контроллерам?

Жду опытных ответов!

ОБНОВЛЕНИЕ: добавлены полезные ссылки на вопросы.

Ответы [ 3 ]

12 голосов
/ 02 ноября 2011
  1. Упрощенный - правильный путь, ИМО. Если вы говорите об именах файлов .aspx страницы, вы делаете это неправильно. Цель этой истории - облегчить общение между разработчиками и разработчиками. Не разработчики не заботятся о products.aspx, они заботятся о списке товаров. Ваша система делает что-то, в чем не ценят разработчики. Это то, что вы пытаетесь захватить.

  2. Ну, истории рассказывают о высокоуровневых функциях, которые вам нужно реализовать. Это то, что ваша система должна делать. Единственный способ действительно сказать, если вы сделали это, это на самом деле использовать пользовательский интерфейс. Рассказы BDD SpecFlow для меня не заменяют юнит-тесты, они скорее интеграционные тесты. Если вы нарушите это, вы потеряете ценность, которую бизнес получает от вашего программного обеспечения. Модульные тесты - это детали реализации, которые не интересуют ваших пользователей, и они тестируют каждый фрагмент отдельно. Это не может сказать вам, работают ли A и B на самом деле все время вместе (теоретически, на практике это должно происходить интересно [читай: неожиданно], когда две части играют друг с другом). Автоматизированные сквозные тесты также могут помочь с вашим контролем качества. Если нарушается функциональная область, вы знаете об этом, и они могут проводить свое время в других областях приложения, пока вы определяете, что сломало интеграционные тесты.

  3. Это сложный вопрос. Мы сделали гибридный подход. Мы используем базу данных (интегрируем тесты после всех испытаний системы, функционирующей как единое целое, а не как отдельные компоненты), но вместо того, чтобы постоянно сбрасывать конфигурации, мы используем Deleporter для замены наших репозиториев на Moq, когда это необходимо. Кажется, работает нормально, но в любом случае есть плюсы и минусы. Я думаю, что мы все еще в значительной степени выясняем это сами.

7 голосов
/ 04 ноября 2011

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

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

Он также упоминает абсолютную «декларативную» или «императивную» модельбыть мифомОн говорит о когнитивной модели, называемой «чанкинг», говоря, что на любом уровне вашей абстракции вы можете «разбивать» или «разбивать».Это означает, что вы можете получить более явный (как?) Или более мета (что или почему?).Вы отказываетесь от императивной модели, спрашивая "что мы делаем?"Вы говорите "как мы это сделаем?"Так что, думаю, я бы не стал слишком зацикливаться на декларативном и императивном - он никуда не денется, если решит эту проблему.

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

Кстати, он также использует сценарий входа в пользовательский интерфейс, поэтому выполучил конкретное руководство:)

Перед редактированием : (часть этого все еще применяется. Вопросы "БД или нет БД" и "UI или нет пользовательского интерфейса" не связаны)

1 - Декларативные или императивные сценарии?

Декларативные, когда это возможно, хотя императив имеет определенную ценность (в некоторые моменты жизненного цикла проекта).

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

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

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

как бы вы описали такие вещи, как «Домашняя страница» или «Страница продуктов»?

Я не уверен, что буду на базовом уровне функций и требований.Вы можете создать подфункции и под-требования, которые описывают детали реализации, например, определенные рабочие процессы пользовательского интерфейса.Если вы описываете часть пользовательского интерфейса, то вы должны определить функцию / требование пользовательского интерфейса.

2 - Упражнение пользовательского интерфейса или нет?

Оба.

Я думаю, что это чрезвычайно медленно и хрупко

Да, это так.Выполняйте все сценарии / требования высокого уровня с помощью пользовательского интерфейса и полной интеграции с БД, но не используйте каждый отдельный путь кода с полной автоматизацией пользовательского интерфейса, и, конечно же, без крайних случаев.Если вы это сделаете, вы потратите больше времени на то, чтобы заставить их работать, и гораздо меньше времени на тестирование вашего приложения.

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

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

3 - Реальная база данных или нет?

Оба.

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

Чем ниже уровень, тем больше я защищаю ложные объекты.

  • Юнит-тесты должны проверять только отдельные классы
  • Интеграционные тесты среднего уровня должны избегать дорогих, хрупких и значимых зависимостей, таких как файловая система, базы данных, сеть и т. Д. Попробуйте проверить реализацию этих хрупких и результативных зависимостей с помощью модульных тестов и сквозных только тесты.
3 голосов
/ 02 ноября 2011

Вместо того, чтобы упоминать страницу по имени, опишите, что она представляет, например,

Scenario: Customers logs in successfully

  When I log in
  Then I should see an overview of ACME's top selling products

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

...