Как выполнить тестирование модулей и интеграции в стиле BDD в ASP.NET MVC?

Я изучаю Driven Driven Development с помощью ASP.NET MVC и, основываясь на сообщении от Стива Сандерсона, понимаем, что BDD может означать, наименее, следующие типы тестов: отдельные единицы кода и взаимодействия с пользовательским интерфейсом. Что-то подобное упоминается в этом сообщении. Нужно ли мне два разных тестовых фреймворка, если я хочу как тестирование модулей, так и интеграцию?

  • Модули тестирования репозиториев, контроллеров и служб с использованием среды контекста/спецификации, например MSpec. Результаты тестирования с этим будут полезны команде разработчиков.

  • Тестирование полного поведения (интеграции) с использованием данной/if/then-структуры, например SpecFlow с Watin. Результаты этого тестирования будут полезны для моего клиента.

Видео, которые я видел до сих пор при использовании BDD, ограничивалось только тестированием поведения объектов без проверки поведения репозиториев, контроллеров и т.д. Есть ли пример проекта, где я могу видеть как автоматическое подразделение, так и интеграцию тестирование с использованием подхода BDD?

Ответ 1

Лично я использую SpecFlow для создания специальных тестов (т.е. "Пользователь создает новую запись компании" ), где я иногда (но не всегда) использую Watin. Для тестирования моих репозиториев или классов обслуживания я буду использовать тесты unit/integration с NUnit. Тесты интеграции предназначены для того, когда мне нужно поговорить с базой данных во время теста, для этого я просто запускаю код в тестируемом объекте без внешних взаимодействий.

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

MyProject.Tests.Features < - для BDD Тесты SpecFlow.

MyProject.Tests.Integration < - для тесты, которые база внешних ресурсов, то есть база данных.

MyProject.Tests.Unit

Если вы не хотите использовать две рамки BDD, вы все равно можете использовать MSTest/NUnit в режиме BDD. Например, эта статья в блоге описывает хорошее соглашение об именах, которое близко к BDD, но нацелено на модульные тесты MSTest/NUnit. Вы можете использовать это для тестов, отличных от SpecFlow, при тестировании таких вещей, как репозитории.

В заключение - вам не нужно использовать SpecFlow и MSpec в своем тестировании, но если вы это сделаете, я рекомендую отдельные тестовые проекты.

Ответ 2

Я вообще согласен с тем, что опубликовал Джейсон.

Возможно, вы захотите разделить свои спецификации на две категории: систему/интеграцию и тесты уровня подразделения. Вы можете описать обе категории с любой структурой, но имейте в виду, что подходы, основанные только на коде (NUnit, MSpec и т.д.), Требуют, чтобы бизнес-аналитик мог писать С#. SpecFlow/Gherkin может быть лучшим подходом, если вы хотите привлечь аналитиков и пользователей к написанию спецификаций. Поскольку синтаксис и правила (Given, When, Then) легко понятны, и записи спецификаций с точки зрения пользователя легко записываются после небольшого обучения. Все это касается преодоления разрыва в коммуникации и предоставления пользователям помощи вашей команде в создании вездесущего языка вашего домена.

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

Здесь репозиторий, который использует MSpec для тестов как единичных, так и интеграционных: https://github.com/agross/duplicatefinder.