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

Как/что насмехаться над BDD

Я знаю, что один из намерений Дэна Норта в разработке BDD заключался в том, чтобы переместить словарь вдалеке от сложности тестового домена. Однако при внедрении внешнего подхода кажется, что нам по-прежнему требуется некоторое понимание насмешливого поведения (или, если хотите, поведение, подвергнутое обструкции). Север предлагает в этом видео, что, если я начну с самых внешних объектов домена и буду работать вовнутрь, я издеваюсь над соавторами, когда я их обнаружу, а затем заменим их правильными реализациями. Поэтому, в конце концов, я заканчиваю набор сквозных тестов.

Маркус Фаулер, похоже, несколько отличался от него в этом сообщении в блоге, когда он определил два лагеря TDD: "классический TDD", где, когда это возможно, используются реальные объекты макет, когда это необходимо, и "mockist TDD", который предпочитает насмешки в большинстве ситуаций. Он видел, как BDD стремится к последнему. I., что в конце разработки функции "макетный" подход оставил бы насмешки в реальных тестах (извините за использование этого слова в обсуждении BDD).

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

Но мой вопрос для сообщества в основном: когда моя история завершена, сколько из сквозного теста должны быть мои сценарии на самом деле? Север объясняет, что BDD требует абстракций. Например, когда я тестирую поведение входа в систему, мои сценарии подробно расскажут о том, что означает процесс входа в систему. Однако, когда я делаю другой сценарий, который требует, но не касается входа в систему, я не хочу повторять эти действия снова и снова. Я хочу, чтобы простая абстракция просто говорила "Учитывая, что я вошел в систему", поэтому я могу выполнить свое другое поведение.

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

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

4b9b3361

Ответ 1

Я думаю, что ключ должен сосредоточиться на B поведения BDD.

В настоящий момент я склонен игнорировать элементы пользовательского интерфейса и отбрасывать уровни персистентности - ведь в эти дни в этих слоях практически нет какой-либо бизнес-логики (мы склонны просто привязывать объектные модели непосредственно к пользовательскому интерфейсу или БД, используя pre - существующие и сильно протестированные рамки).

Как пример, в недавнем (простом) WPF-приложении, которое я создавал: приемочные тесты используют ViewModel в качестве точки входа/внешней точки приложения - и все, что происходит из хранилищ данных, было издевательством. Все правила и логика приложения существовали где-то между ними - и действительно, это поведение приложения, которое необходимо было указать и протестировать.

Ответ 2

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

Теперь, если я подключу свое приложение к хранилищу в памяти, и я говорю с приложением через его уровень API (так что чуть ниже UI). Я буду ожидать, что он будет вести себя точно так же.

Теперь, когда мы это делаем, нам нужно четко понять, что мы подразумеваем под поведением, каково поведение, которое нам интересно, когда мы делаем BDD.

В моем случае, если я начинаю с истории пользователя и записывать сценарии, меня интересует главным образом поведение, которое проходит через API приложения, уровень сервиса, объекты домена, помощник и т.д.... в основном я не так сильно заинтересованы в том, что произойдет в пользовательском интерфейсе или базе данных. Реальное мясо - это весь код, написанный на стороне сервера. Это поведение, которое меня интересует. Если вы так думаете, имеет смысл избавиться от пользовательского интерфейса и БД, потому что нас это не волнует. Ожидаемое поведение пользовательского интерфейса должно отображать данные, которые дает мое приложение. Пользовательский интерфейс - это тупое. Ожидаемое поведение БД заключается в хранении и извлечении объектов, которые мое приложение дает или хочет. Это тоже очень глупое дело. Теперь все остальное, что там вся умность и я несу ответственность.

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

Что касается пользовательского интерфейса и БД, я бы написал блок-тесты javascript для проверки поведения там, сегодня в некоторых пользовательских интерфейсах может быть много логики отображения, чтобы скрыть и показать материал, но такое поведение отличается от поведения в моем истории пользователей сценариев bdd (они не должны говорить о пользовательском интерфейсе).

Для БД я бы написал интеграционные тесты, чтобы проверить, что мои реальные репозитории способны читать и писать вещи в БД.

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

Ответ 3

Что насмехается, зависит от архитектуры. Для MVVM вы можете издеваться над моделью для проверки модели представления. Для MVP вы можете высмеять представление и/или модель для тестирования ведущего. Если вы хотите писать сквозные тесты вместо единичных тестов, то вы тестируете модель представления/презентатора на другом конце приложения (уровень сервиса/базы данных).