Jaki jest najbardziej dojrzały Framework BDD for.NET? [zamknięte]

Używamy BDD - Behaviour Driven Development (z perspektywy dana Northa) jako mechanizmu rejestrowania testów akceptacji użytkowników i napędzania rozwoju w kilku projektach, z przyzwoitym sukcesem. Do tej pory jednak nie zautomatyzowaliśmy samych testów.

Patrzę teraz na automatyzację testów, ale nie jestem pewien, który framework zachować. Na razie NBehave wydaje się być prekursorem - ale czy są jakieś inne, na które powinienem patrzeć? Czy jest wyraźnym "zwycięzcą" w tej chwili?

Author: Matthias, 2008-11-21

13 answers

Szybka Odpowiedź

Jeden bardzo ważny punkt do poruszenia jest to, że istnieją dwa smaki rozwoju napędzanego zachowaniem. dwa smaki to xBehave i xSpec .

XBehave BDD: SpecFlow

SpecFlow (bardzo podobny do cucumber ze stosu Ruby) jest doskonały w ułatwianiu testów xBehave BDD jako kryteriów akceptacji. Nie zapewnia jednak dobrego sposobu pisania testów behawioralnych na poziomie jednostki. Istnieją kilka innych frameworków testowych xbehave, ale SpecFlow zyskał dużą trakcję.

XSpec BDD: MSpec

Obiektywnie rzecz biorąc. Biorąc pod uwagę dostępne ramy specyfikacji kontekstowych, mspec jest najdłużej używanym i najczęściej używanym frameworkiem kontekstowym/specyfikacyjnym w społeczności. Net.

Inny framework XSPEC BDD: NSpec

Osobiście polecam NSpec (zainspirowany bezpośrednio przez RSpec dla Rubiego). Pełne ujawnienie, I jestem jednym z autorów NSpec. Możesz osiągnąć BDD po prostu używając NUnit lub MSTest...ale trochę ich brakuje (naprawdę trudno budować konteksty przyrostowo). MSpec jest również opcją i jest najbardziej dojrzałym frameworkiem kontekstowym/specyfikacyjnym dla .Net. ale W NSpec są tylko pewne rzeczy, które są prostsze.

Długa Odpowiedź

Dwa smaki BDD istnieją przede wszystkim ze względu na ortogonalne korzyści, jakie zapewniają.

Plusy i minusy of Xbehave (składnia GWT)

Plusy

  • ułatwia rozmowy z biznesem poprzez wspólny dialekt zwany (np. Given .... I Podane ...., Kiedy ...... I Kiedy ..... Więc ...., A Następnie)
  • wspólny dialekt może być następnie zmapowany do kodu wykonywalnego, który udowodni biznesowi, że faktycznie ukończyłeś to, co powiedziałeś, że skończysz
  • dialekt jest uciążliwy, więc firma musi disambiguate wymagania i dopasować go do zdania.

Cons

  • podczas gdy podejście xBehave jest dobre dla kryteriów akceptacji wysokiego poziomu, cykle potrzebne do mapowania języka angielskiego do kodu wykonywalnego za pomocą atrybutów sprawiają, że nie jest to możliwe do wypędzenia domeny na poziomie jednostki.
  • mapowanie wspólnego dialektu do testów jest bolesne(przyspieszanie regex). Każde zdanie tworzone przez firmę musi być odwzorowane do metody wykonywalnej za pomocą atrybutów.
  • wspólny dialekt musi być ściśle kontrolowany żeby zarządzanie mapami nie wymknęło się spod kontroli. Za każdym razem, gdy zmieniasz zdanie, musisz znaleźć metodę, która bezpośrednio odnosi się do tego zdania i naprawić dopasowanie regex.

Plusy i minusy xSpec (kontekst/Specyfikacja)

Plusy

  • pozwala deweloperowi na stopniowe budowanie kontekstu. Kontekst może być ustawiony dla testu i niektóre twierdzenia mogą być wykonywane w tym kontekście. Następnie można określić więcej kontekstu (na podstawie kontekstu które już istnieje), a następnie określić więcej testów.
  • nie krępujący język. Deweloperzy mogą być bardziej wyraziste o tym, jak dana część systemu zachowuje się.
  • nie ma potrzeby mapowania pomiędzy angielskim a wspólnym dialektem (ponieważ nie ma takiego).

Cons

    Nie tak przystępne dla biznesu. Spójrzmy prawdzie w oczy, biznes nie lubi rozróżniać tego, czego chcą. Gdybyśmy dali im podejście kontekstowe do BDD to zdanie po prostu czytałoby "Po prostu zrób to". Wszystko jest w kodzie. Dokumentacja kontekstowa jest spleciona w kodzie (dlatego nie musimy się martwić o odwzorowanie języka angielskiego na kod) {]}
  • nie tak czytelny, biorąc pod uwagę mniej restrykcyjną verbiage.

Próbki

The Bowling Kata jest całkiem dobrym przykładem.

Próbka SpecFlow

Oto jak wyglądałaby specyfikacja w SpecFlow (ponownie, jest to świetne jako test akceptacyjny, ponieważ komunikuje się bezpośrednio z firmą):

Plik Funkcji

Plik funkcji jest powszechnym dialektem testu.

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
Plik Definicji Kroku

Plik definicji kroku jest faktycznym wykonaniem testu, ten plik zawiera mapowania dla 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 Sample, xSpec, Context / Specification


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 Sample, xSpec, Context / Specification

Oto NSpec przykład tego samego Kata bowlingowego:


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);
    }
}

Tak jak ty coraz więcej BDD, przekonasz się, że potrzebne są zarówno smaki xBehave, jak i XSPEC BDD. xBehave jest bardziej odpowiedni do testów akceptacyjnych, xSpec jest bardziej odpowiedni do testów jednostkowych i projektowania opartego na domenie.

MSpec vs NSpec

Obiektywne metryki, takie jak wiek i stabilność powinny być czynnikiem, i zachęcam wszystkich do wzięcia tego pod uwagę. Ale proszę również wziąć pod uwagę, że nowsze frameworki mogą zapewnić bardziej zwięzłe api, lepsze wykorzystanie języka konstruuje i opiera się na doświadczeniach z poprzednich frameworków. MSpec zapewnia konstrukcje Given, Because, It I Cleanup..ale są one kosztowne: statyczna inicjalizacja dla wszystkich członków, wybuch klasy i jest sztywna składniowo ze względu na unikalne użycie delegatów. Przekonasz się, że najprostsze testy MSpec są prostsze w NSpec. Oto bardziej złożony zestaw testów napisany zarówno w mspec, jak i NSpec.

Porównanie xUnit, MSpec i NSpec: https://gist.github.com/amirrajan/6701522

Odpowiednie Linki

RSpec vs ogórek (RSpec stories)

BDD z ogórkiem i rspec - kiedy to zbędne?

 322
Author: Amir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:46:57

Sprawdź SpecFlow.

Jest to narzędzie inspirowane przez Cucumber, które ma na celu zapewnienie pragmatycznego i bezproblemowego podejścia do akceptacji Test Driven Development i Behavior Driven Development dla dzisiejszych projektów. NET.

Integracja VisualStudio wydaje się szczególnie obiecująca.

 47
Author: jbandi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-15 20:23:59

StoryQ wygląda jak fajna alternatywa dla NBehave z płynnym interfejsem. Na pewno bym to sprawdził.

 15
Author: stankovski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-08 13:59:16

Nie wydaje mi się, żeby tak naprawdę był "zwycięzca". Inne frameworki to SpecUnit.NET project i MSpec również pokazują obiecujące początki adaptera Gallio . Technicznie, ponieważ IronRuby jest na horyzoncie, rSpec może być opcją dla tych, którzy są przygotowani do krwawej krawędzi. NBehave + NSpec może być najstarszym frameworkiem z najlepszą automatyzacją, chociaż walczyłem z nadmiernie zwięzłą składnią.

Sprawdziłbym je wybierz ramy, które najlepiej pasują do Twojego stylu projektów. Wszystkie są OSS, więc trudno stracić, prawdziwą korzyścią jest po prostu przeniesienie do BDD.

 12
Author: Jim Burger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-23 14:06:08

Osobiście polecam BDDfy co moim zdaniem jest świetne! Jest open source, obsługuje konwencję i płynny opis scenariusza, obejmuje świetne zarówno testy akceptacyjne, jak i jednostkowe. Znajdziesz go na GitHub .

 7
Author: Alexandr Nikitin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-29 13:40:56

Robot Framework może być również używany z IronPython do wykonywania ATDD lub BDD w .Net. myślę, że możliwości wyrażeń Robot Framework są lepsze niż np. SpecFlow 'S lub NSpec' s. nie wymusza użycia określonej składni, ale zamiast tego używa podejścia opartego na słowach kluczowych. Jeśli testujesz aplikacje webowe, posiada Selenium2Library , która zapewnia powiązania z Selenium WebDriver.

 6
Author: kontulai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-05 07:24:09

Istnieje również Specter , który definiuje DSL w Boo, aby uczynić to wszystko bardziej naturalnym.

 5
Author: Mauricio Scheffer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-23 13:46:51

Ogólnie bym opowiedział się za NBehave, w połączeniu z Mbunitem i dowolnymi frameworkami DI / mocking, których potrzebujesz. To uczciwy komentarz Jima Burger, że NBehave jest bardzo gadatliwy, i znajduję się za pomocą cut-and-paste czasami. Mimo to działa świetnie-używam wtyczki Gallio ReSharper, więc po prostu dostaję dodatkowe okno pokazujące. Nie próbowałem jeszcze z ccnet.

 4
Author: Dmitri Nesteruk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-07 14:42:45

Sprawdź ten wpis na blogu i jego komentarze dla inspirujących pomysłów: http://haacked.com/archive/2008/08/23/introducing-subspec.aspx/

 2
Author: gius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-03 13:39:47

Concordion.NET obsługuje nie tylko BDD, ale także ATDD: http://assertselenium.com/2012/11/05/difference-between-tdd-bdd-atdd/ specyfikacje są napisane w prostym języku angielskim za pomocą HTML. IMHO to jedna z zalet Concordion.NET. dokumenty HTML mogą być zorganizowane w nawigowalną strukturę, aby zbudować żywy system dokumentacji . A ponieważ testy są przeprowadzane przeciwko systemowi, możesz mieć pewność, że dokumentacja jest zawsze aktualna.

 2
Author: user3632158,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-19 04:33:24

Zaczynam swój pierwszy wypad w BDD z małą aplikacją z moim zespołem. Narzędzia, które wybieramy do wykonania zadania to: SpecFlow z Selenium Webdriver dla xbehave stories oraz Mspec z Machine.Podróbki.Moq dla kontenera automatyzacji dla naszych testów jednostkowych XSPEC. Dzięki integracji wspieranej przez Specflow i MSpec, Resharper będzie zarówno naszym biegaczem historii, jak i biegaczem specyfikacji. Posiadanie natywnej integracji z visual studio z R# jest kluczową cechą dla my.

Ponieważ nasz projekt to wszystkie MVC3, będziemy również stosować wzór separacji orkiestratorów do naszych kontrolerów MVC. Pozwoli nam to pisać specyfikacje bezpośrednio przeciwko orkiestratorowi. Następnie możemy pisać historie bezpośrednio przeciwko użyciu naszej aplikacji.

 1
Author: Chris Marisic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-21 13:22:26

Sprawdź także UBADDAS, specyficzne dla UAT znalezione na

Https://github.com/KernowCode/UBADDAS

Z wyjaśnieniem tutaj

Http://kernowcode.wordpress.com/ (w czerwcu 2014)

Możesz napisać taki test

[Test]
public void IWantToRegisterANewUser()
{
  var user = new User();
  ICustomer customer = new Customer();

  SoThat(MyBusinessValue.IncreaseCustomerBase)
    .As(user)
    .Given(customer.Register)
    .When(customer.Confirm_Registration)
    .Then(customer.Login);
}

I produkuje to

I want to register a new user
  so that Increase customer base
       as user
    given Register customer
     when Confirm customer registration
     then Login customer
 0
Author: kernowcode,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-23 15:47:14

Ponieważ mam teraz do czynienia z BDD dla testów systemowych dla aplikacji krytycznych dla bezpieczeństwa, mogę tylko podzielić się moim doświadczeniem, że nie należy lekceważyć mocy "testów napisanych w języku naturalnym "zamiast " kodu".

Zawsze skupialiśmy się na oferowaniu języka funkcji, który każdy może zrozumieć bez żadnego technicznego doświadczenia lub doświadczenia w programowaniu (patrz przykład specflow powyżej) i dobrze nam się to udało. Pomijając fakt, że nigdy nikomu nie wyjaśniłem składni, każdy od razu zrozumiał znaczenie testu, programisty, menedżera, a nawet testera.

W jakikolwiek sposób unikałbym testu napisanego w języku programowania, takim jak przykłady MSpec powyżej. Jeśli pojawię się z takim testem w biurze kierownika, wyrzuci mnie. Interesuje go jednak czytanie testów opartych na składni. Im więcej facetów jest w stanie czytać i modyfikować testy, tym lepiej.

Wreszcie te testy są przenośne do innych programów język, dowolna inna platforma, dowolne inne narzędzie automatyzacji testów bez żadnych zmian.

Odpowiedź jest jeszcze raz:

Nie dbaj o narzędzie i jego funkcje, Wybierz narzędzie, które pozwala łatwo przełączyć się na inne narzędzie w dowolnym momencie bez utraty informacji. Narzędzia przychodzą i odchodzą, moje testy powinny trwać dłużej. :-)

Mogę polecić użycie SpecFlow. Masz pełny dostęp do pełnej biblioteki. Net i wszystkich jej funkcji, twoje testy pozostają przenośne. To może dać ci przewagę nad całkowicie przenośnymi rozwiązaniami, takimi jak Robot Framework, jeśli nie masz nic przeciwko przenośności. Jednak zawsze można poprawić stabilność i przenośność systemu za pomocą różnych narzędzi do rozwoju i testowania. Tak więc testowanie oprogramowania. Net z podejściem BDD opartym na Pythonie może być dobrym (a nawet lepszym) pomysłem w niektórych przypadkach.

Jednak SpecFlow okazał się stabilny i kuloodporny w codziennych testach, w tym nocnych testach budowania itp. w średnim projekty wielkogabarytowe. Ponadto dobrze integruje się ze środowiskiem testowym Microsoft Unit.

 0
Author: realtime,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-07 22:41:00