ATDD против BDD и правильное использование фреймворка

Я только что вникаю в концепцию BDD и слушал разговор Скотта Беллвэра с парнями из Herding Code. Я немного поигрался со SpecFlow, и он мне очень понравился.

Я понимаю разницу между ATDD и TDD, как описано в сообщении блога Классификация инструментов BDD (на основе модульного тестирования и на основе приемочного тестирования) и немного истории BDD, но это приводит меня к вопросу.

Как описано, не является ли использование инструмента BDD (например, MSpec) просто еще одной платформой для модульного тестирования? Мне кажется, что это так.

Кроме того, это, кажется, предполагает, что использование SpecFlow для определения компонентов нижнего уровня (таких как ваши репозитории и службы) было бы неправильным. Если я могу использовать один и тот же инструмент как для ATDD, так и для TDD компонентов нижнего уровня, почему бы и нет? Кажется, здесь все еще есть некоторые размытые линии, которые, как мне кажется, я не совсем понимаю.


person Brian McCord    schedule 29.07.2010    source источник


Ответы (5)


Быстрый ответ

Один очень важный момент, о котором следует упомянуть, заключается в том, что существует два варианта разработки, основанной на поведении. Это два варианта: xBehave и xSpec < / сильный>.

xBehave BDD: SpecFlow

SpecFlow (очень похож на огурец из стека Ruby) отлично подходит для облегчения тестов xBehave BDD в качестве приемлемости. Критерии. Однако он не обеспечивает хороший способ написания поведенческих тестов на уровне модулей. Есть еще несколько фреймворков для тестирования xBehave, но SpecFlow получил большую популярность.

xSpec BDD: NSpec

Для разработки, основанной на поведении на уровне подразделения, я бы порекомендовал NSpec (вдохновленный непосредственно RSpec для Ruby). Вы можете выполнить BDD на уровне единицы, просто используя NUnit или MSTest ... но они отчасти не оправдывают ожиданий (действительно сложно создавать контексты постепенно). MSpec также можно использовать, в это, но есть кое-что, что просто проще в NSpec (вы можете постепенно наращивать контекст в MSpec, но для этого требуется наследование, которое может стать сложным).

Длинный ответ

Две разновидности BDD в основном существуют из-за ортогональных преимуществ, которые они предоставляют.

Плюсы и минусы xBehave (синтаксис GWT)

Плюсы

  • помогает облегчить общение с представителями бизнеса через общий диалект, который называется (например, Дано ...., И Дано ...., Когда ......, И Когда ....., Затем ...., А потом)
  • затем общий диалект может быть сопоставлен с исполняемым кодом, который доказывает бизнесу, что вы действительно закончили то, что обещали закончить
  • диалект ограничен, поэтому бизнесу приходится устранять двусмысленность требований и умещать их в предложениях.

Минусы

  • Хотя подход xBehave хорош для управления критериями приемлемости высокого уровня, циклы, необходимые для сопоставления английского языка с исполняемым кодом с помощью атрибутов, делают невозможным вытеснение домена на уровне единицы.
  • Сопоставление общего диалекта с тестами БОЛЬНО (увеличивайте количество регулярных выражений). Каждое предложение, создаваемое бизнесом, должно быть сопоставлено исполняемому методу с помощью атрибутов.
  • Общий диалект необходимо строго контролировать, чтобы управление отображением не вышло из-под контроля. Каждый раз, когда вы меняете предложение, вам нужно найти метод, который напрямую связан с этим предложением, и исправить соответствие регулярному выражению.

Плюсы и минусы xSpec (контекст / спецификация)

Плюсы

  • Позволяет разработчику постепенно наращивать контекст. Контекст может быть настроен для теста, и некоторые утверждения могут быть выполнены в отношении этого контекста. Затем вы можете указать дополнительный контекст (основанный на уже существующем контексте), а затем указать дополнительные тесты.
  • Никаких ограничений. Разработчики могут более выразительно описывать поведение определенной части системы.
  • Сопоставление английского языка с общим диалектом не требуется (потому что его нет).

Минусы

  • Не так доступно для бизнеса. Посмотрим правде в глаза, бизнес не любит однозначно определять, чего они хотят. Если бы мы дали им подход к BDD, основанный на контексте, тогда предложение было бы просто «Просто заставь это работать».
  • Все в коде. Контекстная документация вплетена в код (поэтому нам не нужно беспокоиться о сопоставлении английского языка с кодом)
  • Не так удобочитаемо, учитывая менее ограничительное словоблудие.

Образцы

Хороший пример - Bowling Kata.

Образец SpecFlow

Вот как будет выглядеть спецификация в SpecFlow (опять же, это отличный приемочный тест, потому что он напрямую взаимодействует с бизнесом):

Feature File

Файл функций - это общий диалект теста.

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
Step Definition File

Файл определения шага - это фактическое выполнение теста, этот файл включает сопоставления для 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";
    }

    [Then(@"my total score should be (\d+)")]
    public void ThenMyTotalScoreShouldBe(int score)
    {
        Assert.AreEqual(0, _game.Score);
    }
}

Образец 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);
    }
}

Так что да ... SpecFlow - это круто, NSpec - круто

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

Соответствующие ссылки

person Amir    schedule 11.04.2011

Инструмент, ориентированный на истинное поведение, был бы чем-то вроде Cucumber. Мы используем его в моей работе против кода .NET. Это позволяет нам писать функции, которые определяют поведение системы в целом, а затем мы можем выполнять функции и проверять, выполняет ли система то, что мы ожидаем. У нас весь процесс работает очень хорошо.

http://cukes.info/

Существует реализация .net под названием NStep, которая подключается к огурцу по проводному протоколу, она позволяет вам писать определения шагов на C # с использованием лямбда-выражений ... это довольно круто.

Определения шагов выглядят так:

When("^I go to the \"([^\"]*)\" (?:[Ss]creen|[Pp]age)$", (string pageName) =>
{
    var screen = ParseScreen(pageName);
    GoToScreen(screen);
    World.Browser.Wait(1000);
});

http://github.com/clearwavebuild/nStep

person Chris Kooken    schedule 29.07.2010
comment
SpecFlow - это реализация Cucumber в .NET. - person Brian McCord; 29.07.2010
comment
За исключением того, что это клон со своим собственным парсером, который компилирует шаги в модульные тесты. Как бы ни был хорош клон, он никогда не будет так хорош, как оригинал. Cucumber постоянно добавляет функции, которые делают подход BDD отличным способом написания программного обеспечения. Вам стоит попробовать настоящий огурец ... он очень мощный. - person Chris Kooken; 29.07.2010
comment
Инструменты BDD действительно созданы для проверки поведения. Таким образом, он должен охватывать систему в целом. Для основных бизнес-процессов, таких как репозитории, я бы использовал NUnit, а для тестирования поведения - SpecFlow или Cucumber. - person Chris Kooken; 29.07.2010
comment
Вот почему я люблю ТАК, узнавать что-то новое каждый день. SpecFlow и огурец смотрятся довольно круто. - person Nathan W; 29.07.2010
comment
+1 за nstep и не изобретать велосипед. NStep реализует протокол огурца, так что вы можете реализовать шаги в .NET при использовании бегуна огурца ruby. SpecFlow прекрасен и изящен, но вы упускаете все инструменты для огурца. Вам также не хватает возможности смешивать простой и динамический код Ruby (отлично подходит для работы с API, такими как Selenium) и код .NET (отлично подходит для работы с базами данных и сервисными фасадами). - person Joseph Daigle; 29.07.2010
comment
Текущие версии SpecFlow используют официальный парсер Gherkin, который также используется в Cucumber. Что касается инструментария, SpecFlow предлагает удобные возможности для стандартных установок разработки .NET. Интеграция VisualStudio постоянно совершенствуется, и использование существующих фреймворков автоматизации тестирования (NUnit, MSTest ...) для выполнения является явным решением сделать интеграцию в существующую инфраструктуру безболезненной. Мы очень стараемся не изобретать велосипед ... - person jbandi; 07.04.2011

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

Given I am an authorised user
When I go to the front page
Then there should be a link to my profile with my username as the link text.

Нет причин не проводить модульное тестирование ваших репозиториев на более детальном уровне. Думаю, и то, и другое полезно и уместно.

person Igor Zevaka    schedule 29.07.2010
comment
Я все еще тестирую свои репозитории, службы и т. Д. (В настоящее время с помощью NUnit), но мне действительно интересно, считается ли неправильным использовать SpecFlow и для этой цели. - person Brian McCord; 29.07.2010
comment
Я так думаю, SpecFlow больше подходит для тестирования больших кусков кода как есть, без насмешек или изоляции. - person Igor Zevaka; 29.07.2010
comment
Я согласен с Игорем, потому что реальное преимущество использования инструментов BDD заключается в том, что он позволяет бизнес-пользователям писать тесты (или, альтернативно, он позволяет бизнес-пользователям понимать тесты). Поскольку бизнес действительно заботится только о системе в целом, инструменты BDD подходят для тестирования системы в целом. Бизнесу все равно, работает ли репозиторий, если он не может интегрироваться с системой в целом. Таким образом, для большего количества тестов на уровне модулей BDD скорее будет мешать, чем помогать. - person Sir Rippov the Maple; 13.04.2011

Разве я не могу просто использовать обычные инструменты модульного тестирования? BDD - это процесс и менталитет, поэтому, да, вы можете делать это с любыми инструментами (или нет, вы можете написать свой собственный без инструмента, если вы хотеть). Однако у инструментов TDD были определенные допущения, которые вызывают некоторое трение при попытке сделать что-то в стиле BDD. Например, TDD предполагает, что вы тестируете архитектурную единицу программного обеспечения; класс, модуль, услуга. В то время как BDD предполагает, что вы указываете некоторую функциональную часть системы.

Следует ли мне использовать SpecFlow / Cucumber для описания компонентов нижнего уровня? Прежде всего, я думаю, что вопрос немного ошибочен. Вы не склонны описывать компоненты , если эти компоненты непосредственно не представляют поведение. Я все равно отвечу в том, в чем, по моему мнению, заключается суть вопроса.

Инструменты, ориентированные на рассказ, такие как Cucumber, отлично подходят для обсуждения поведения с точки зрения клиента / пользователя. Это может позволить вам делать спецификации, которые легко доступны неспециалистам. Однако может быть утомительно описывать большие объемы или сложное состояние с помощью этих инструментов.

Модульное тестирование или более ориентированные на код инструменты спецификации, такие как rSpec и Machine.Specification, могут быть намного удобнее при работе со сложными или большими настройками состояния. Вы можете использовать различные инструменты, доступные для языков, для управления состоянием. Такие вещи, как наследование и фейки / моки. В Machine.Specification есть несколько хороших подходов к этому для ориентированных на .NET.

Итак, следует ли использовать Cucumber для определения поведения более низкого уровня? Я бы сказал, только если важно иметь высокий уровень видимости для этого конкретного поведения. В моем текущем проекте мы разработали архитектурный компонент для представления определенных частей системы, интенсивно использующих бизнес-правила. Эти компоненты указаны с помощью Cucumber, но большая часть системы покрыта NUnit.


Кстати, SpecFlow действительно хорош и доступен для .NET-людей, которые только начинают знакомиться с BDD, но в конечном итоге вы захотите перейти на полноценный Cucumber + nStep. Экосистема Cucumber ОГРОМНА и полезна. SpecFlow намного меньше.

Кроме того, лямбда-синтаксис, предлагаемый nStep, немного лучше, чем необходимость украшать методы а-ля SpecFlow или Cuke4Nuke.

Заявление об ограничении ответственности / предыстория: часть исходной разработки я выполнял на nStep, но я использую SpecFlow в своем текущем проекте. Я работаю над тем, чтобы представить здесь BDD, и мне нужно было что-то простое и доступное.

person brendanjerwin    schedule 02.08.2010

Интересно, что в этом блоге о классификации инструментов BDD рассказывается о TDD и ATDD. Как отмечает Лиз Кеог: BDD - это разговор и исследование. Чем проще для всех вовлеченных людей внести свой вклад, выразить намерения, поделиться идеями, понять других и т. Д., Тем быстрее мы придем к адекватному решению и тем более качественное программное обеспечение мы создадим. Когда мы, наконец, пойдем по пути инструмента, какие инструменты лучше всего поддерживают сотрудничество между участниками программных проектов?

На основании этого блога о различиях между TDD и BDD, и ATDD. Я бы сказал, что существует как минимум три различных варианта инструмента BDD:

  1. Фреймворки для модульного тестирования

JUnit изменил наш взгляд на разработку и тестирование. Одна из его сильных сторон заключается в том, что тесты могут быть написаны на том же языке программирования, что и само приложение. Таким образом, мы можем опираться на знания, которые у нас уже есть в команде доставки. Когда тесты используются даже для стимулирования разработки, мы попадаем в рай TDD.

Языки программирования были оптимизированы для уменьшения избыточности, что, по словам Рона Джеффриса, является одним из худших грехов разработчиков. Поэтому мы часто полагаемся на эти инструменты при техническом тестировании, чтобы создать правильный продукт, поскольку они помогают нам работать максимально эффективно.

Несколько парней пытались сделать автоматические тесты более понятными, поскольку модульные тесты на самом деле не читаются. Одной из первых попыток было проанализировать модульные тесты и предоставить краткое резюме, доступное для чтения не разработчикам. Например, TestDox / AgileDox создает простую документацию из имен методов тестовых классов JUnit или Pickels создает документацию на основе файлов функций, написанных на Gherkin.

Такие платформы, как MSpec, помогают писать тесты, которые лучше читаются и дополнительно обеспечивают читаемый вывод. Этот вид инструментов BDD ориентирован на удобочитаемый вывод, что позволяет привлекать не разработчиков после того, как разработчики выполнили свою работу.

  1. Системы тестирования сценариев

Чтобы вовлечь заинтересованные стороны на более раннем этапе цикла разработки, были созданы новые инструменты, которые больше ориентированы на читаемый ввод. Cucumber использует простые текстовые файлы для предоставления удобочитаемых данных для автоматизированных тестов. Текстовые файлы содержат сценарии, написанные на особым образом структурированном языке, основанном на структуре «дано когда-то». Эти фреймворки - отличные инструменты, которые поддерживают совместное определение критериев приемлемости.

  1. Рамки приемочного тестирования

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

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

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

BDD должен помочь создать правильный продукт

Вы можете реализовать BDD со всеми тремя видами инструментов, но у каждого из них есть свои сильные и слабые стороны. Фреймворки для модульного тестирования и инструменты, подобные xSpec, отлично используют сильные стороны программирования. Поскольку они являются инструментами от разработчиков для разработчиков, они являются идеальным выбором, если вы попытаетесь разобраться в технической части.

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

введите описание изображения здесь введите описание изображения здесь

Да, SpecFlow - это круто, NSpec - круто ...

FitNesse и Concordion тоже классные

person user3632158    schedule 23.10.2014