Вы можете описать тесты в стилях Given / When / Then или Arrange / Act / Assert.

ользовал расширение BDD Spec, созданное в домашних условиях, для написания тестов в стиле BDD в NUnit, и я хотел узнать, что все думают. Это добавляет ценность? Это сосать? Если так, то почему? Есть ли что-нибудь лучше там?

Вот источник:https://github.com/mjezzi/NSpec

Есть две причины, по которым я создал это

Чтобы мои тесты легко читались.Чтобы получить простой английский вывод для просмотра спецификации.

Вот пример того, как будет выглядеть тест:

- так как зомби, кажется, популярны в эти дни ..

Учитывая Зомби, Песон и IWeapon:

namespace Project.Tests.PersonVsZombie
{
    public class Zombie
    {

    }

    public interface IWeapon
    {
        void UseAgainst( Zombie zombie );
    }

    public class Person
    {
        private IWeapon _weapon;

        public bool IsStillAlive { get; set; }

        public Person( IWeapon weapon )
        {
            IsStillAlive = true;
            _weapon = weapon;
        }

        public void Attack( Zombie zombie )
        {
            if( _weapon != null )
                _weapon.UseAgainst( zombie );
            else
                IsStillAlive = false;
        }
    }
}

И тесты в стиле NSpec:

public class PersonAttacksZombieTests
{
    [Test]
    public void When_a_person_with_a_weapon_attacks_a_zombie()
    {
        var zombie = new Zombie();
        var weaponMock = new Mock<IWeapon>();
        var person = new Person( weaponMock.Object );

        person.Attack( zombie );

        "It should use the weapon against the zombie".ProveBy( spec =>
            weaponMock.Verify( x => x.UseAgainst( zombie ), spec ) );

        "It should keep the person alive".ProveBy( spec =>
            Assert.That( person.IsStillAlive, Is.True, spec ) );
    }

    [Test]
    public void When_a_person_without_a_weapon_attacks_a_zombie()
    {
        var zombie = new Zombie();
        var person = new Person( null );

        person.Attack( zombie );

        "It should cause the person to die".ProveBy( spec =>
            Assert.That( person.IsStillAlive, Is.False, spec ) );
    }
}

Вы получите выход Spec в окне вывода:

[PersonVsZombie]

- PersonAttacksZombieTests

    When a person with a weapon attacks a zombie
        It should use the weapon against the zombie
        It should keep the person alive

    When a person without a weapon attacks a zombie
        It should cause the person to die

2 passed, 0 failed, 0 skipped, took 0.39 seconds (NUnit 2.5.5).
 Brook16 янв. 2011 г., 19:06
Вы смотрели на SpecFlow? Единственное, что он делает, - это сопоставляет текст между «ProveBy» и модульными тестами.specflow.org
 Matt Florence31 мар. 2011 г., 20:40
Как энтузиаст BDD и инициатор еще одного фреймворка BDD.NET (nspec.orgупомянутый Амиром выше). Я не мог не вмешиваться. Мне нравится, как вы можете объявить несколько спецификаций в одном методе. Я полагаю (надеюсь), что если первый из них потерпит неудачу, он продолжит работать с другими? Мне, однако, не нравится ProveBy. Я думаю, что это возвращает менталитет тестирования и отклоняется от определения поведения.
 mjezzi09 февр. 2011 г., 19:48
Да, я посмотрел на поток спецификаций, и мы фактически используем огурец и селен для проведения наших тестов высокого уровня в пользовательском интерфейсе. SpecFlow хорош для данных / когда / затем, но не для модульных тестов.
 Amir31 мар. 2011 г., 20:26
На самом деле недавно был выпущен еще один NSpec (www.nspec.org), который хорошо справляется со спецификацией на основе контекста, а не с синтаксисом Given When Then.

Ответы на вопрос(5)

https://www.nuget.org/packages/Heleonix.Testing.NUnit/ Вы можете описать тесты в стилях Given / When / Then или Arrange / Act / Assert.

а не просто фреймворк, так как я думаю, что действительно хорошее понимание BDD на уровне единиц может повлиять на некоторые вещи, которые вы создаете. В целом мне это нравится. Поехали:

Вместо того, чтобы звонить имPersonAttacksZombieTestsЯ бы просто позвонил имPersonTests или дажеPersonBehaviour, Это значительно упрощает поиск примеров, связанных с определенным классом, позволяя использовать их в качестве документации.

Это не похожеIsStillAlive это то, что вы хотели бы установить на человека; скорее внутренняя собственность. Тщательно делайте подобные вещи публичными. Вы добавляете поведение, которое вам не нужно.

призваниеnew Person(null) не кажется особенно интуитивным. Если бы я хотел создать человека без оружия, я бы обычно искал конструктораnew Person(), Хороший трюк с BDD - это написать API, который вы хотите, а затем заставить его выполнять тяжелую работу - сделать код простым в использовании, а не простым в написании.

Поведение и обязанности также кажутся мне немного странными. Почему человек, а не зомби, отвечает за определение того, живет или умирает человек? Я предпочел бы видеть поведение как это:

Человек может быть оснащен оружием (черезperson.Equip(IWeapon weapon)).Человек начинает с кулака, если у него нет оружия.Когда человек нападает на зомби, он использует оружие против зомби.Оружие определяет, живёт ли зомби или умирает.Если зомби еще жив, он атакует в ответ. Зомби убьет человека (черезperson.Kill).

Мне кажется, что у него есть поведение и обязанности в лучшем месте. Использование другого вида оружия для бесполезных атак, а не проверка на ноль, также позволяет избежать этогоif заявление. Вам понадобятся разные тесты:

Кулак не должен убивать зомби при использовании против негоБензопила должна убить зомби при использовании против негоЧеловек должен использовать свое экипированное оружие при атаке зомбиЧеловек должен быть вооружен кулаком, если у него нет другого оружияЗомби должен атаковать, когда он еще жив.Зомби не должен атаковать в ответ, если он мертв.Зомби должен умереть, если его убьют.Человек должен умереть, если его убьют.

Кроме того, это выглядит великолепно. Мне нравится, как вы использовали макеты, последовательность строк и формулировку самих тестовых методов. Мне тоже очень нравитсяProveBy; он делает именно то, что говорит на жестяной банке, и прекрасно связывает разницу между предоставлением примеров поведения и выполнением их в качестве тестов.

 mjezzi09 февр. 2011 г., 19:55
Хах! Я абсолютно согласен. Мой пример ужасен, но он проясняет суть о ProveBy. Я определенно должен найти время, чтобы обновить его.

хотя в последнее время. Есть много разумных вариантов, и вы можете легко создать свой собственный, как показано в некоторых ответах в этом посте. Я работал над средой тестирования BDD с целью облегчить ее распространение на любую среду модульного тестирования. В настоящее время я поддерживаю MSTest и NUnit. Это называетсяДанои это с открытым исходным кодом. Основная идея довольно проста, поскольку Given предоставляет оболочки для общих наборов функций, которые затем можно реализовать для каждого участника теста.

Ниже приведен пример теста NUnit Given:

[Story(AsA = "car manufacturer",
       IWant = "a factory that makes the right cars",
       SoThat = "I can make money")]
public class when_building_a_toyota : Specification
{
    static CarFactory _factory;
    static Car _car;

    given a_car_factory = () =>
                              {
                                  _factory = new CarFactory();
                              };

    when building_a_toyota = () => _car = _factory.Make(CarType.Toyota);

    [then]
    public void it_should_create_a_car()
    {
        _car.ShouldNotBeNull();
    }

    [then]
    public void it_should_be_the_right_type_of_car()
    {
        _car.Type.ShouldEqual(CarType.Toyota);
    }
}

Я старался изо всех сил, чтобы оставаться верным концепциямДэн Норт представляет BDD блог, и, как таковой, все делается с использованием заданного, когда, а затем стиль спецификации. То, как это реализовано, позволяет вам иметь несколько данных и даже несколько, когда они, и онидолжен быть выполненным в порядке (все еще проверяющий это).

Кроме того, имеется полный набор расширений «Должен», включенных непосредственно в «Given». Это позволяет такие вещи, какShouldEqual() Вызов выше, но он полон хороших методов для сравнения коллекций и сравнения типов и т. д. Для тех из вас, кто знаком с MSpec, я в основном разорвал их и сделал некоторые модификации, чтобы они работали вне MSpec.

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

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

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

Вот и все. Я использую его в нескольких проектах, над которыми я работаю, поэтому он все еще активно разрабатывается, но я бы назвал ядро ​​довольно стабильным. Я ищу способ разделять контексты по составу, а не по наследству, так что это, вероятно, будет одним из следующих изменений, которые появятся в будущем. Ввести на критику. :)

 Emil G05 дек. 2014 г., 11:29
Здравствуй! Я также нахожусь на охоте за структурой тестирования стиля BDD. То, что я хочу, это то, что позволит мне более четко выражать свои модульные тесты, чтобы другие разработчики действительно понимали, что тест должен проверять. Простой текст - это хорошо, но регулярные выражения - нет. Пока думаюxbehave.github.io выглядит многообещающе, но мне не нравится тот факт, что мне нужно расширение для запуска тестов в Visual Studio с Resharper. Если бы что-то подобное существовало для NUnit, я думаю, у нас был бы победитель. Я дам ваше предложение "Дано" попробовать. Спасибо за чаевые.
 nathan gonzalez05 дек. 2014 г., 21:07
@ EmilG, круто, дайте мне знать, если у вас возникнут какие-либо проблемы. Я знаю, что на данный момент его используют несколько крупных компаний.

"something".ProveBy() не соответствует тексту, отображаемому позже («Когда ... это должно ...»). Я думаю, что концепция BDD заключается в том, чтобы формулировка теста и протокол теста были максимально похожими.

 mjezzi09 февр. 2011 г., 19:59
Если бы я мог найти способ опустить ProveBy, я бы. Это действительно просто потому, что я должен дать какое-то имя методу расширения.
 Dio F10 апр. 2013 г., 15:01
Лично я предпочитаю решения, где тестовый исходный код читаем и понятен даже для непрограммистов (но для технических специалистов). Таким образом, можно легко опустить все описательные тексты. ИМХО, в любом случае это не добавляет никакой ценности к тесту.

UBADDAS - Поведение пользователей и доменные истории

нашел здесь -http://kernowcode.github.io/UBADDAS/

Это производит консольный вывод как это

I want to register a new user 
  So that Increase customer base
       As user
    Given Register customer
     When Confirm customer registration
     Then Login customer

Ваш ответ на вопрос