214 votes

Quel est le cadre BDD le plus abouti pour .NET ?

Nous avons utilisé BDD - Développement guidé par le comportement (du point de vue de Dan North) comme mécanisme d'enregistrement des tests d'acceptation par les utilisateurs et de pilotage du développement sur quelques projets, avec un succès convenable. À ce jour, cependant, nous n'avons pas réellement automatisé les tests eux-mêmes.

Je cherche maintenant à automatiser les tests, mais je ne suis pas sûr du cadre comportemental à utiliser. Jusqu'à présent, NBehave semble être le précurseur, mais y a-t-il d'autres cadres que je devrais examiner ? Y a-t-il un "gagnant" incontestable à l'heure actuelle ?

338voto

Amir Points 5816

La réponse rapide

Un très important point à soulever est qu'il y a deux variantes du développement guidé par le comportement. Les deux saveurs sont xBehave y xSpec .

xBehave BDD : SpecFlow

SpecFlow (très similaire à concombre de la pile Ruby) est excellent pour faciliter les tests xBehave BDD en tant que critères d'acceptation. Il ne fournit cependant pas un bon moyen d'écrire des tests comportementaux au niveau de l'unité. Il existe quelques autres cadres de test xBehave, mais SpecFlow a reçu beaucoup d'attention.

xSpec BDD : MSpec

Objectivement parlant. Parmi les cadres de spécifications de contexte disponibles, MSpec est celui qui existe depuis le plus longtemps et qui est le cadre de spécification de contexte le plus largement utilisé dans la communauté .Net.

L'autre cadre xSpec BDD : NSpec

Je recommande personnellement NSpec (inspiré directement par RSpec pour Ruby). Pour tout vous dire, je suis l'un des auteurs de NSpec. Vous pouvez accomplir BDD en utilisant simplement NUnit ou MSTest... mais ils ne sont pas à la hauteur (il est vraiment difficile de construire des contextes de manière incrémentale). MSpec est également une option et constitue le cadre de contexte/spécification le plus mature pour .Net. Mais mais il y a des choses qui sont plus simples dans NSpec.

La longue réponse

Les deux variantes de BDD existent principalement en raison des avantages orthogonaux qu'elles procurent.

Avantages et inconvénients de xBehave (syntaxe GWT)

Pour

  • permet de faciliter les conversations avec l'entreprise par le biais d'un dialecte commun appelé (par exemple, Given ...., And Given ...., When ......, And When ..... , Then ...., And Then)
  • le dialecte commun peut ensuite être transposé en code exécutable, ce qui prouve à l'entreprise que vous avez réellement terminé ce que vous aviez promis de faire.
  • le dialecte est contraignant, l'entreprise doit donc désambiguïser les exigences et les faire entrer dans les phrases.

Cons

  • Bien que l'approche xBehave permette de définir des critères d'acceptation de haut niveau, les cycles nécessaires pour faire correspondre l'anglais au code exécutable par le biais d'attributs ne permettent pas de définir un domaine au niveau de l'unité.
  • La mise en correspondance du dialecte commun avec les tests est PÉNible (augmentez votre regex). Chaque phrase créée par le métier doit être mappée à une méthode exécutable via des attributs.
  • Le dialecte commun doit être étroitement contrôlé afin que la gestion de la cartographie ne devienne pas incontrôlable. Chaque fois que vous modifiez une phrase, vous devez trouver la méthode qui se rapporte directement à cette phrase et corriger la correspondance regex.

Avantages et inconvénients de xSpec (contexte/spécification)

Pour

  • Permet au développeur d'établir le contexte de manière incrémentielle. Un contexte peut être mis en place pour un test et certaines assertions peuvent être exécutées contre ce contexte. Vous pouvez ensuite spécifier plus de contexte (en vous appuyant sur le contexte qui existe déjà), puis spécifier plus de tests.
  • Pas de langage contraignant. Les développeurs peuvent être plus expressifs sur la façon dont une certaine partie d'un système se comporte.
  • Aucune correspondance n'est nécessaire entre l'anglais et un dialecte commun (parce qu'il n'y en a pas).

Cons

  • Pas aussi accessible par l'entreprise. Regardons les choses en face, les entreprises n'aiment pas désambiguïser ce qu'elles veulent. Si nous leur donnions une approche contextuelle de la BDD, la phrase se résumerait à "Faites que ça marche".
  • Tout est dans le code. La documentation contextuelle est imbriquée dans le code (c'est pourquoi nous n'avons pas à nous soucier de la correspondance entre l'anglais et le code).
  • Pas aussi lisible compte tenu d'un verbiage moins restrictif.

Échantillons

Le site Kata du bowling est un très bon exemple.

Exemple de SpecFlow

Voici à quoi ressemblerait la spécification dans SpecFlow (là encore, c'est un excellent test d'acceptation, car il communique directement avec l'entreprise) :

Dossier de présentation

Le fichier de caractéristiques est le dialecte commun pour le test.

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
Fichier de définition des étapes

Le fichier de définition d'étape est l'exécution réelle du test, ce fichier inclut les mappings pour 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, Contexte/Spécification

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

Echantillon NSpec, xSpec, Contexte/Spécification

Voici un NSpec exemple du même kata de bowling :

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

Au fur et à mesure que vous ferez du BDD, vous constaterez que les versions xBehave et xSpec du BDD sont toutes deux nécessaires. xBehave est plus adapté aux tests d'acceptation, xSpec est plus adapté aux tests unitaires et à la conception axée sur le domaine.

MSpec vs NSpec

Des paramètres objectifs comme l'âge et la stabilité devraient être pris en compte, et j'encourage tout le monde à en tenir compte. Mais s'il vous plaît aussi prendre en considération le fait que les nouveaux cadres peuvent fournir une API plus succincte, une meilleure utilisation des constructions linguistiques et s'appuyer sur les leçons apprises pour les cadres passés . MSpec fournit des constructions de Given, Because, It et Cleanup mais elles ont un coût : initialisation statique pour tous les membres, explosion de la classe, et elle est syntaxiquement rigide en raison de son utilisation unique des délégués. Vous constaterez que les tests MSpec les plus simples sont plus simples dans NSpec. Voici une suite de tests plus complexe écrite à la fois en MSpec et en NSpec.

Une comparaison de xUnit, MSpec et NSpec : https://gist.github.com/amirrajan/6701522

Liens pertinents

rspec vs cucumber (histoires de rspec)

BDD avec Cucumber et rspec - quand est-ce que c'est redondant ?

48voto

jbandi Points 4896

Vérifiez SpecFlow .

Il s'agit d'un outil inspiré de Cucumber qui vise à fournir une approche pragmatique et sans friction du développement piloté par les tests d'acceptation et du développement piloté par le comportement pour les projets .NET actuels.

L'intégration de VisualStudio semble particulièrement prometteuse.

15voto

stankovski Points 1294

StoryQ semble être une bonne alternative à NBehave avec son interface Fluent. Je suis prêt à l'essayer.

12voto

Jim Burger Points 3166

Je ne pense pas qu'il y ait vraiment un "gagnant". Les autres cadres comprennent SpecUnit.NET et MSpec est également prometteur, avec les prémices d'une Gallio adaptateur. Techniquement, puisque IronRuby est à l'horizon, rSpec puede être une option pour ceux qui sont prêts à aller à la pointe de la technologie. NBehave + NSpec est peut-être le framework le plus ancien avec la meilleure automatisation, bien que je me sois retrouvé à lutter contre la syntaxe trop verbeuse.

Je les vérifierais tous et choisirais le framework qui convient le mieux au style de votre projet. Ils sont tous OSS, il est donc difficile de les perdre, le véritable avantage est simplement de passer au BDD.

7voto

Alexandr Nikitin Points 2079

Je recommanderais personnellement BDDfy qui est génial à mon avis ! Il est open source, prend en charge la description de scénarios basés sur la convention et la fluidité, et couvre parfaitement les tests d'acceptation et les tests unitaires. Vous pouvez le trouver sur GitHub .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X