Использование сценариев Specflow для интеграционных и юнит-тестов - PullRequest
5 голосов
/ 15 июля 2010

Я только что столкнулся с BBD и specflow, и это выглядит очень интересно.При написании пользовательских историй они обычно находятся на высоком уровне, а актер использует графический интерфейс.Таким образом, при написании сценариев они обычно будут тестами GUI или интеграционными тестами высокого уровня системы.Но как насчет модульного тестирования ниже в решении?Например, конечные точки службы, бизнес-объекты и т. Д. Должен ли я написать новые сценарии для них или есть способ повторно использовать те же сценарии для низкоуровневого тестирования (модульных тестов), или я должен скопировать и завершить сценарии?

Пожалуйстадайте мне знать, если я все понял неправильно.

1 Ответ

9 голосов
/ 16 июля 2010

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

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

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

// Given I have $100 in my account
var account = new Mock<Account>();
account.SetupGet(a => a.Balance).Returns(100);

var accountProvider = new Mock<AccountProvider>();
accountProvider.Setup(ap => ap.AccountFor("lunivore")).Returns(account);

// When I ask for $20
var atm = new ATM(accountProvider);
atm.PutInCardFor("lunivore");
int money = atm.RequestMoney(20);

// Then I should get $20
Assert.AreEqual(20, money);

// And my account should have paid out $20
account.verify(a => a.PayOut(20));

Iрекомендуем вам скопировать язык, на котором написаны сценарии (например: PayOut).Это согласуется с «вездесущим языком» Domain Driven Design.Перенос этого языка в модульные тесты и код также помогает команде общаться с заинтересованными сторонами, потому что вам не придется переводить снова и снова.

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

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...