Ответ 1
Быстрый ответ
Одна важная точка зрения заключается в том, что существуют два варианта разработки, управляемой поведением.. Два варианта: xBehave и xSpec.
xBehave BDD: SpecFlow
SpecFlow (очень похож на огурец из стека Ruby) отлично подходит для облегчения тестов xBehave BDD в качестве критериев приемки. Однако он не обеспечивает хороший способ написания поведенческих тестов на уровне единицы. Есть еще несколько инфраструктур тестирования xBehave, но SpecFlow получил большую тягу.
xSpec BDD: MSpec
Объективно. Учитывая доступные спецификации контекстных спецификаций, MSpec был самым длинным и является наиболее широко используемой средой контекста/спецификации в сообществе .Net.
Другая инфраструктура xSpec BDD: NSpec
Я лично рекомендовал бы NSpec (вдохновленный непосредственно RSpec для Ruby). Полное раскрытие информации, я являюсь одним из авторов NSpec. Вы можете выполнить BDD, просто используя NUnit или MSTest... но они кажутся короткими (очень сложно создавать контексты постепенно). MSpec также является опцией и является самой зрелой структурой контекста/спецификации для .Net. Но в NSpec есть несколько вещей, которые проще.
Длительный ответ
Два варианта BDD в основном существуют из-за ортогональных преимуществ, которые они предоставляют.
Плюсы и минусы xBehave (синтаксис GWT)
Pros
- помогает облегчить разговоры с бизнесом через общий диалект (например, данный...., и учитывая...., когда......, а когда....., тогда...., And Then)
- общий диалект может быть затем сопоставлен с исполняемым кодом, который доказывает бизнесу, что вы на самом деле закончили то, что, как вы сказали, закончили.
- диалект сжимается, поэтому бизнес должен устранить требования и вписаться в предложения.
Против
- В то время как подход xBehave хорош для управления критериями приемлемости высокого уровня, циклы, необходимые для сопоставления английского языка с исполняемым кодом через атрибуты, делают невозможным вытеснение домена на уровне единицы.
- Отображение общего диалекта в тестах PAINFUL (увеличение вашего регулярного выражения). Каждое предложение, созданное бизнесом, должно быть сопоставлено с исполняемым методом через атрибуты.
- Общий диалект должен быть жестко контролирован, так что управление отображением не выходит из-под контроля. Каждый раз, когда вы меняете предложение, вы должны найти метод, который непосредственно относится к этому предложению, и исправить соответствие регулярных выражений.
Плюсы и минусы xSpec (Контекст/Спецификация)
Pros
- Позволяет разработчику постепенно наращивать контекст. Контекст может быть настроен для теста, и некоторые утверждения могут быть выполнены в этом контексте. Затем вы можете указать больше контекста (исходя из контекста, который уже существует), а затем указать больше тестов.
- Отсутствует сжимающий язык. Разработчики могут быть более выразительными в отношении того, как ведет себя определенная часть системы.
- Не требуется сопоставление между английским и общим диалектом (потому что его нет).
Против
- Не подходит для бизнеса. Давайте посмотрим правде в глаза, бизнес не любит, чтобы устранить то, что они хотят. Если бы мы предоставили им подход, основанный на контекстах к BDD, тогда предложение просто прочитало бы "Просто сделайте это".
- Все в коде. Контекстная документация переплетается внутри кода (поэтому нам не нужно беспокоиться о привязке английского к коду)
- Не так читается, учитывая менее строгие формулировки.
Примеры
Bowling Kata - довольно хороший пример.
SampleFlow Sample
Вот что спецификация будет выглядеть в SpecFlow (опять же, это замечательно как тест приемочного испытания, потому что он напрямую связывается с бизнесом):
Функциональный файлФункциональный файл является общим диалектом для теста.
Feature: Score Calculation In order to know my performance As a player I want the system to calculate my total score Scenario: Gutter game Given a new bowling game When all of my balls are landing in the gutter Then my total score should be 0 Scenario: Single Pin Given a new bowling game When I've hit exactly 1 pin Then my total score should be 1Файл определения шага
Файл определения шага - это фактическое выполнение теста, этот файл содержит сопоставления для SpecFlow
[Binding]
public class BowlingSteps
{
private Game _game;
[Given(@"a new bowling game")]
public void GivenANewBowlingGame()
{
_game = new Game();
}
[When(@"all of my balls are landing in the gutter")]
public void WhenAllOfMyBallsAreLandingInTheGutter()
{
_game.Frames = "00000000000000000000";
}
[When(@"I've hit exactly 1 pin")]
public void When1PinIsHit()
{
_game.Frames = "10000000000000000000";
}
[Then(@"my total score should be (\d+)")]
public void ThenMyTotalScoreShouldBe(int score)
{
Assert.AreEqual(score, _game.Score);
}
}
Пример MSpec, xSpec, Контекст/Спецификация
public class describe_BowlingKata
{
public static Game game;
public class when_all_balls_land_in_the_gutter : describe_BowlingKata
{
Establish ctx = () => game = new Game();
Because of = () => game.Frames = "00000000000000000000";
It should_have_a_score_of_0 = () => game.Score.ShouldBe(0);
}
public class when_a_single_pin_is_hit : describe_BowlingKata
{
Establish ctx = () => game = new Game();
Because of = () => game.Frames = "10000000000000000000";
It should_have_a_score_of_1 = () => game.Score.ShouldBe(1);
}
}
Пример NSpec, xSpec, Контекст/Спецификация
Вот пример NSpec одного и того же бота-ката:
class describe_BowlingGame : nspec
{
Game game;
void before_each()
{
game = new Game();
}
void when_all_my_balls_land_in_the_gutter()
{
before = () => game.Frames = "00000000000000000000";
it["should have a score of 0"] = () => game.Score.should_be(0);
}
void when_a_single_pin_is_it()
{
before = () => game.Frames = "10000000000000000000";
it["should have a score of 1"] = () => game.Score.should_be(1);
}
}
Как вы все больше и больше BDD, вы обнаружите, что необходимы как xBehave, так и xSpec-ароматы BDD. xBehave больше подходит для тестов Acceptance, xSpec больше подходит для модульных тестов и разработки, ориентированных на домен.
MSpec vs NSpec
Объективные показатели, такие как возраст и стабильность, должны быть фактором, и я хотел бы призвать всех учитывать это. Но, пожалуйста, также принять во внимание, что более новые рамки могут обеспечить более сжатое api, лучшее использование языковых конструкций и основываться на уроках, извлеченных для прошлых фреймворков. MSpec предоставляет конструкторы Given, Because, It и Cleanup.. но они стоят дорого: статическая инициализация для всех участников, взлом класса и синтаксически жесткая из-за его уникального использования делегатов. Вы обнаружите, что простейшие тесты MSpec проще в NSpec. Вот более сложный набор тестов, написанный как в MSpec, так и в NSpec.
A Сравнение xUnit, MSpec и NSpec: https://gist.github.com/amirrajan/6701522