décembre
2009
Un lecteur m’ayant indiqué qu’une nouvelle version de NBehave (0.4.5) était disponible depuis une semaine, j’ai repris l’exemple du jeu du pendu pour voir comment on écrivait maintenant les tests et le code de « pontage » (la façon dont j’ai procédé jusqu’à présent étant obsolète). L’expérience est assez satisfaisante, on procède comme avec Cucumber. J’ai donc écrit mes scenarios (purement textuels) puis écrit une classe C# pour faire le pont avec le code de « production », ma classe Game. Ici j’ai réutilisé la classe résultant de mes essais précédents pour aller vite, il aurait été préférable de se laisser guider par les tests pour découvrir petit à petit cette classe – c’est ce que vous conseille si vous voulez tenter l’expérience. Ci-dessous je présente les scénarios, puis la classe de pontage.
Tout d’abord les scénarios, tous écrits dans un fichier texte appelé pendu.scenario :
Story: handle one letter Scenario: scenario1 (one wrong letter) Given the secret word SANGLIER and the remaining count 6 When the user proposes the letter Z Then the game displays ******** and the remaing count is 5 Scenario: scenario2 (one good letter) Given the secret word SANGLIER and the remaining count 6 When the user proposes the letter A Then the game displays *A****** and the remaing count is 6 Story: handle two successive letters Scenario: scenario3 (a good letter followed by a good letter) Given the secret word SANGLIER and the remaining count 6 Given the user has already proposed the letters A When the user proposes the letter S Then the game displays SA****** and the remaing count is 6 Scenario: scenario4 (a wrong letter followed by a good letter) Given the secret word SANGLIER and the remaining count 6 Given the user has already proposed the letters Z When the user proposes the letter S Then the game displays S******* and the remaing count is 5 Story: handle the end of the game Scenario: scenario5 (lost game) Given the secret word SANGLIER and the remaining count 6 Given the user has already proposed the letters ZZZZZZ Then the game displays ******** and the remaing count is 0 Scenario: scenario6 (winning game) Given the secret word SANGLIER and the remaining count 6 Given the user has already proposed the letters XYZSANGLIER Then the game displays SANGLIER and the remaing count is 3
A ce stage de votre lecture, il serait intéressant de voir ce que vous pensez de cette information. En tant que développeur, avez-vous assez d’informations pour programmer un jeu qui fonctionne ? En tant que testeur, avez-vous des idées sur d’autres scénarios que vous pourriez ajouter ? Est-ce que tout le monde comprend bien de quel jeu on parle ?
Au fait, testeur, notez bien que vous n’avez pas besoin d’un autre outil que Notepad si vous voulez modifier ou compléter ces scénarios.
Maintenant, un peu de cuisine informatique, il faut bien interpréter ce fichier texte. Pour cela, dans NBehave il faut programmer une classe portant l’attribut ActionSteps, comme ci-dessous :
[ActionSteps] public class Scenarios { private Game game; [Given("the secret word $secret and the remaining count $remaining")] public void InitializeGame(string secret, int remaining) { game = new Game(secret, remaining); } [Given("the user has already proposed the letters $letters")] public void ProposeLetters(string letters) { foreach (char c in letters) { game.ProposedLetter = c; } } [When("the user proposes the letter $letter")] public void ProposeLetter(char letter) { game.ProposedLetter = letter; } [Then("the game displays $display and the remaing count is $remaining")] public void DisplayResult(string display, int remaining) { game.DisplayedWord.ShouldEqual(display); game.Remaining.ShouldEqual(remaining); } }
Oups, il y a un peu de duplication dans ma classe (violation du principe DRY) – il faudra factoriser le code entre ProposedLetters et ProposeLetter par exemple.
Sinon vous constatez sans doute que le principe de cette classe est facile à comprendre, et découle assez naturellement des tests. Avec NBehave, je n’ai pas vu de moyen de générer partiellement ce code comme le fait Cucumber, mais je suppose que ce sera résolu ultérieurement.
Voici la sortie de NBehave:
Cette sortie illustre le seul problème que j’ai rencontré, les titres de stories ne sont pas affichés correctement par rapport à leurs scénarios, il y a un décalage.
En conclusion, une expérience très positive, et je suis content de voir que NBehave est toujours bien vivant !
4 Commentaires + Ajouter un commentaire
Commentaires récents
- Des tableaux pour l’intégration d’un équipier dans une équipe Scrum dans
- Rétrospectives, la directive première dans
- Des tableaux pour l’intégration d’un équipier dans une équipe Scrum dans
- Des tableaux pour l’intégration d’un équipier dans une équipe Scrum dans
- Des tableaux pour l’intégration d’un équipier dans une équipe Scrum dans
@tulipebleu, en effet ca fonctionne comme tu le décris. Et l’idée est bien d’avoir une sorte de langage « naturel ».
Si la fonction à tester nécessite un objet beaucoup plus « informatique », alors peut-être que le test n’est pas au bon niveau. Les outils du TDD sont peut-être plus pertinents (voir tous les xUnit) que le BDD, ce dernier vise à manipuler des concepts compréhensibles par l’utilisateur. En TDD tu peux manipuler n’importe quel objet ou structure de données. Mais peut-être pas en BDD (mais je n’ai pas assez d’expérience). En tout cas il faut trouver comment TDD et BDD sont complémentaires.
Pour les modifications de paramètres, peut-être qu’un avec un peu de ruse on peut y arriver. Avec un langage compilé, le compilateur détectera déjà pas mal de choses. Et on peut toujours mettre temporairement une assertion dans la fonction pour trouver tous les endroits qui plantent. Sinon il y a quand même des outils, par exemple en .NET, ReSharper trouve facilement tous les endroits où une fonction est utilisée.
Bruno
Bonjour,
Pour être franc, je ne suis pas sur d’avoir compris comment fonctionne cet outils.
Est-ce qu’ils procède par unification ? Je veut dire par la que cet outils transforme la ligne de texte
Given the secret word SANGLIER and the remaining count 6
en appel de fonction
InitializeGame(« SANGLIER », »6″);
puis les autres phrases, et il vérifie si ces phrases plantes ou génère une exception. C’est une sorte de langage de scripte naturel. De plus, le développeur n’a pas a creer un nouveau langage pour le test. C’est intéressante.
Personnellement, je suis toujours a la recherche d’un outils simple pour faire des tests facilement. Cet outils a l’avantage de permettre au client qui ne connais pas le code de faire les tests lui même avec un langage naturel. L’inconvénient, c’est si la fonction à tester nécessite une liste, une map, ou un objet. C’est pas facile a traduire en anglais/français. Je plus, si tu ajoute un paramètre a une fonctionne a tester c’est pas simple de trouver les tests a modifier. Ces deux problème malheureusement, je ne connais aucun outils qui arrive à les éviter.
Salut Emmnanuel, effectivement Grégory m’a également signalé cette possibilité, que je n’ai pas encore explorée, c’est dans ma liste. Je souhaitais surtout voir si on pouvait avoir une approche Cucumber sur .NET, à ce stade je suis convaincu que c’est possible et viable, donc je veux passer plus de temps sur le BDD lui-même : à quoi ça sert, quelle est la différence avec le TDD, comment ca impacte la découverte du modèle métier, etc.
Bruno
Salut Bruno,
As tu essayé cuke4nuke : le portage de cucumber en .net ?
Il se trouve sur github.
Emmanuel