BDD: Pour commencer

9

Je commence par BDD et voici mon histoire:

Feature: Months and days to days
    In order to see months and days as days
    As a date conversion fan
    I need a webpage where users can enter
    days and months and convert them to days.

J'ai quelques doutes ...

Dois-je écrire mes scénarios avant de coder quoi que ce soit ou dois-je d'abord écrire un scénario, puis écrire du code, réécrire un scénario, puis écrire du code, etc. ...?

Si je devais écrire mes scénarios avant, mes étapes peuvent-elles être approuvées et le code de production ne se fait toujours pas?

Quand dois-je refactoriser mon code? Une fois la fonctionnalité terminée ou après la mise en œuvre de chaque scénario?

thom
la source
"mes étapes peuvent-elles être approuvées et le code de production ne fonctionne toujours pas?" Qu'est-ce que ça veut dire? S'il vous plaît, expliquez.
S.Lott

Réponses:

12

De l'histoire, je déduis que vous codez vous-même.

Normalement, le but de BDD est de permettre des conversations, en particulier entre l'entreprise et les développeurs, afin que l'équipe puisse être sûre d'avoir atteint une compréhension commune. Nous aimons également inclure des testeurs, car ils peuvent repérer les scénarios manqués.

Si vous faites cela par vous-même, prenez un canard en caoutchouc et expliquez le comportement de votre application au canard. Donnez quelques exemples de la façon dont cela devrait fonctionner. Ce seront vos scénarios.

Pour commencer, je suggère de ne pas automatiser ces scénarios. Vous pouvez les noter si vous le souhaitez. N'oubliez pas que les résultats commerciaux que vous avez partagés avec le canard sont à peu près au bon niveau pour les exprimer. Vous devriez maintenant avoir une idée du comportement de l'application et vous pouvez exécuter les scénarios manuellement. J'aime traiter tout ce qui ne fonctionne pas encore comme un bug . Je l' ai parfois commencé avec l' automatisation, mais seulement quand je sais très bien comment le système fonctionne, je suis familier avec les outils et l'interface utilisateur est bien comprise. Même alors, je dois souvent le retravailler un peu quand j'ai écrit le code.

À un niveau inférieur, dites à votre canard comment chaque classe va se comporter. Donnez quelques exemples. Les canards en caoutchouc sont parfaitement capables de comprendre le langage technique. Vous avez maintenant votre BDD au niveau unitaire, alias tests unitaires. Le cycle rouge-vert-refactor se produit ici. (Je n'ai plus tellement besoin de refactoriser, car je pense aux responsabilités de mes cours, je les formule dans un langage orienté affaires, et ça a tendance à tomber de façon assez belle de toute façon. Mais je ça fait un moment maintenant. C'est OK si tu le fais.)

Ne le refacturez pas trop. Nous voulons toujours obtenir des commentaires sur notre code, car il y a toujours des choses que nous ne savons pas que nous ne savons pas . La perfection est votre ennemi ici. Rendez-le assez bon, lisez-le, puis passez à autre chose. Si vous devez faire quelque chose de parfait pour apporter d'autres modifications, faites-le lorsque vous effectuez d'autres modifications.

Si vous avez la possibilité d'obtenir des commentaires sur vos scénarios de la part des parties prenantes de l'entreprise, mais qu'ils ne sont pas assis avec vous, vous pouvez leur envoyer des scénarios dès que vous avez écrit, puis avant de les automatiser. Vous pouvez également envoyer une maquette de l'interface utilisateur, afin qu'ils puissent corréler les mots aux actions. Ne soyez pas trop en avance sur le codage avec cela. Travaillez avec l'hypothèse que ce que vous avez déjà fait est mal , et vous devez obtenir des commentaires pour savoir comment.

Comme dernier indice, ne formulez généralement pas d'histoires du point de vue d'un utilisateur (scénarios, oui, mais pas d'histoires). Ce ne sont pas des user stories. Il devrait probablement lire quelque chose comme:

In order to attract people to my website
As @thom
I want users to easily convert months and days to days.

Il y a de toute façon un objectif de niveau supérieur que vous recherchez. Cela vous aidera également à tirer parti des capacités dont vous avez besoin. Bonne chance et excuses pour le message extra-long.

Lunivore
la source
1
La partie «canard en caoutchouc» est géniale. Je pensais que j'étais le seul à penser à ça!
NoChance
3

Dois-je écrire mes scénarios avant de coder quoi que ce soit ou dois-je d'abord écrire un scénario, puis écrire du code, réécrire un scénario, puis écrire du code, etc. ...?

Les deux fonctionneront. Choisissez-en un.

Peu importe.

Plus vous avez de scénarios, plus vous pouvez concevoir à l'avance.

Plus vous avez de scénarios, plus il faut de temps pour faire quelque chose.

Quand dois-je refactoriser mon code? Une fois la fonctionnalité terminée ou après la mise en œuvre de chaque scénario?

Non. Vous refactorisez quand il devient difficile de concevoir le scénario suivant .

S.Lott
la source
J'ai posé une nouvelle question ... "Si je devais écrire mes scénarios avant ...". Pouvez-vous jeter un œil s'il vous plaît? Merci beaucoup.
thom
1
@ S.Lott Bonne réponse mais un petit problème: sur la base de l'utilité du cycle rouge-vert-refactor, je suggérerais une refactorisation en continu pendant le processus BDD, juste après chaque test vert.
Rein Henrichs
@Rein Henrichs: Une alternative serait de noter que le refactoring afin de terminer tous les tests pour une histoire se produit comme une partie inévitable et incontournable du codage. Même un excellent design ne peut pas couvrir toutes les bases. Cette refactorisation ne semblait pas mériter d'être mentionnée. Cependant, vous l'avez bien souligné. Le refactoring entre les histoires, cependant, est une opération plus sérieuse et plus longue, car l'ensemble de fonctionnalités évolue par l'accroissement des histoires.
S.Lott
3

Utilisez des verbes descriptifs

Feature: CONVERT Months and days to days

Ne prenez pas de décisions de conception dans les histoires ["J'ai besoin d'une page Web" est une décision de conception]

As a date conversion fan
I want to convert days and months into days

Utiliser des objectifs de valeur commerciale dans les histoires

So that [some business reason]

Écrivez autant de fonctionnalités et d'histoires que possible avant de commencer à coder; les histoires s'informent mutuellement , influencent les caractéristiques et informent la conception.

Refonte après chaque histoire. Red-Green-Refactor.

Steven A. Lowe
la source
+1, bonne réponse. Mais la «façon BDD» de refactoriser ne fait-elle pas partie du cycle interne de test unitaire plutôt que du cycle externe de test d'acceptation?
pdr
@pdr: c'est ce que je voulais dire, refactoriser après chaque histoire. Les tests BDD / TDD vont de l'unité à l'acceptation, il n'y a qu'un seul cycle (dans mon esprit) ;-)
Steven A. Lowe
Pourquoi "j'ai besoin d'une page Web" est une décision de conception? Merci!
thom
@thom: les user stories doivent exprimer ce que l'utilisateur veut pouvoir faire, pas comment il sera implémenté. En d'autres termes, les fonctionnalités, les histoires et les scénarios sont des exigences et des spécifications fonctionnelles. Ne prenez pas de décisions de conception avant d'avoir une image complète. Dans cet exemple (vraisemblablement artificiel), les besoins commerciaux de l'utilisateur dans son ensemble peuvent indiquer qu'une page Web n'est peut-être pas la solution la plus pratique - un widget de bureau ou une application mobile peut être préférable, selon la façon dont / quand ils doivent l'utiliser. Les détails d'implémentation encombrent les histoires et peuvent vous enfermer trop tôt dans une conception spécifique.
Steven A. Lowe