Как выполнить тестирование модулей и интеграции в стиле 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.