TDD: Que se passe-t-il avant le premier test unitaire?

17

Je comprends surtout la théorie du TDD, mais je n'arrive pas à comprendre comment commencer. Je m'assois pour écrire un test unitaire pour un projet personnel et réaliser. . . Je n'ai aucune idée de ce que je teste. Quels objets, quelles fonctionnalités, etc.

Par exemple, disons que je veux écrire une application pour aider notre famille à gérer les tâches de corvée. Voici quelques questions dans mon esprit: comment passer de cette idée à mon premier test? Combien faut-il décider avant de commencer et combien dois-je déterminer après avoir commencé à écrire des tests? Quand dois-je prendre des décisions telles que le stockage des données dans un fichier texte ou une base de données? Dois-je subir des tests d'acceptation des utilisateurs avant de commencer? Dois-je faire concevoir l'interface utilisateur? Dois-je avoir une spécification? (Je me rends compte qu'au moins certaines de ces questions d'exemple sont probablement dans une "zone grise").

En plus de la question du titre sur le premier test unitaire, pourriez-vous également donner un exemple de ce à quoi pourrait ressembler le premier test unitaire d'un projet comme l'exemple de projet?

Ethel Evans
la source
5
Je recommande vivement de lire le livre GOOS de Nat Pryce et Steve Freeman ... il y a de très bonnes informations pour réussir un test de bout en bout avec une `` fine tranche '' de fonctionnalités.
vierge

Réponses:

6

J'aime commencer par une liste de fonctionnalités, et pour chaque fonctionnalité, écrire les histoires d'utilisateurs, puis pour chaque histoire, écrire des descriptions de test.

Réfléchissez un peu à la conception, puis choisissez une description de test et commencez à coder: refactor rouge-vert.

Répétez jusqu'à ce que tous les tests réussissent.

Oui, les tests d'acceptation doivent être considérés comme faisant partie de cela, attachés à l'histoire appropriée.

Steven A. Lowe
la source
J'aime ça. C'est un processus très clair que je peux suivre: lister les fonctionnalités, faire une sous-liste de user stories pour chaque fonctionnalité, faire une sous-liste de tests pour chaque user story. Je vais essayer ce processus.
Ethel Evans
J'accepte cela car cela répond à ce que je voulais personnellement savoir, mais je recommande aux gens de lire également la réponse (plus appréciée) de Carl.
Ethel Evans
18

Vous avez découvert dès le début comment TDD concerne le design . Avant d'écrire votre premier test, vous devez penser à ce que sera votre premier élément de fonctionnalité et à quoi ressemblerait votre programme si cette fonctionnalité fonctionnait.

Les développeurs qui n'utilisent pas TDD doivent également y penser - mais ils peuvent "simplement plonger" et commencer à écrire quelque chose, n'importe quoi. Mais «quelque chose, n'importe quoi» n'est pas toujours sur la voie de la prestation du programme que vous pensiez mettre en place. Quel est? Eh bien, à quoi ressemblerait votre programme s'il fonctionnait? Quels tests réussiraient-ils?

Je veux écrire une application pour aider notre famille à gérer les tâches de corvée.

Cool. Si cette application fonctionnait, que ferait-elle? Eh bien, une corvée pourrait probablement être assignée à une personne, non?

Person fred = new Person("fred")
Chore mow = new Chore("mow the lawn");
mow.assignTo(fred);
assertEquals(fred, mow.whoIsAssigned());

Il y a un début. Pas l'endroit où vous devez commencer, pas nécessairement le meilleur endroit pour commencer - mais c'est un endroit. C'est quelque chose que vous voulez que votre code prenne en charge (même si je suis sûr que vous pouvez trouver de meilleurs noms). Commencez par là, regardez-le échouer. Faites-le passer. Nettoie ça. Faire mousser, rincer, répéter.

Carl Manaster
la source
Je n'aime pas l'exemple, mais je suis d'accord avec la prémisse; Les méthodologies de test d'abord n'ont de sens que si vous êtes capable et disposé à faire au moins une conception initiale. En fait, vous avez vraiment tendance à avoir besoin d'un modèle de domaine squelette, ou au moins d'un gros morceau d'un.
Aaronaught
5
Il n'y a pas de conception à l'avant ici. Aucune des classes du test n'a encore besoin d'exister. La conception se produit dans le test, PUIS ils sont créés pour faire passer le test.
Torbjørn
Pourriez-vous élaborer sur "Avant d'écrire votre premier test, vous devez réfléchir à ce que sera votre premier morceau de fonctionnalité, et à quoi ressemblerait votre programme si cette fonctionnalité fonctionnait."? Combien devrais-je m'entraîner avant de commencer? À quel moment suis-je en train de sur-concevoir et de perdre l'avantage de laisser mes tests unitaires conduire ma conception? Je suppose que je ne veux pas de diagrammes de classes, qui devraient être motivés par une refactorisation, non? Mais cet exemple ressemble à "Ayez une idée, investissez 15 secondes de réflexion, puis écrivez un test." Est-ce vraiment tout ce que je veux faire?
Ethel Evans
2
@Ethel Oui, c'est à peu près autant de réflexion que je recommanderais d'y mettre (à la fois dans l'exemple ici et en général). Déterminez quelque chose qui peut être testé, qui vous mène vers le produit que vous souhaitez, puis rédigez un test pour celui-ci.
Carl Manaster
1
Comment cela fonctionne sur une équipe est une question plus grande et différente. Et TDD lui-même n'a pas grand-chose à dire sur la coordination du travail d'équipe. La programmation en binôme et le jeu de planification peuvent vous y aider; dans le cadre de ce que vous avez prévu, TDD s'applique toujours. jamesshore.com/Agile-Book/the_planning_game.html Scrum a également quelque chose à dire sur la façon de planifier le travail d'une équipe.
Carl Manaster
5

Oui, TDD a ce problème. C'est pourquoi je recommande maintenant le développement axé sur le comportement.

Démarrez manuellement. Écrivez quelque chose de similaire à une histoire d'utilisateur:

  • En tant qu'utilisateur
  • Lorsque je sélectionne Ajouter au panier, je souhaite que le produit soit ajouté de manière transparente en arrière-plan
  • Pour que je puisse continuer mon expérience d'achat sans interruption

Maintenant, quelles sont les fonctionnalités qui soutiennent cet objectif (la partie «Alors ça»)?

  • Lorsqu'un article est ajouté au panier
    • Le panier d'achat pour l'utilisateur contiendra le nouvel article
    • Le nombre total d'articles dans le panier augmentera d'une unité
    • L'utilisateur ne doit pas être redirigé
    • Une option de départ sera disponible
  • Lorsqu'il y a deux articles dans le panier et que l'utilisateur choisit de payer
    • L'utilisateur sera redirigé vers la page de paiement
    • Les deux éléments seront visibles

Ce sont toutes des choses que vous pouvez et devez vérifier manuellement.

Faites cela pendant un petit moment. Ensuite, comme un bon développeur, commencez à chercher des moyens d'automatiser les pièces redondantes. Cela variera en fonction de votre plate-forme, mais la plupart ont des cadres décents disponibles.

.Net a WatiN pour automatiser la page Web ou, si vous voulez tester une API, je recommanderais l'ajout de Subspec à xUnit ou MSpec (vous pouvez également le faire avec n'importe quel framework de test, juste ceux qui facilitent le nom de vos tests d'une manière qui soutient ce style de pensée).

Ruby a du concombre pour les tests d'automatisation et rspec pour les tests d'API de niveau inférieur

Javascript a jasmin et qUnit.

point point point

George Mauer
la source
Il existe également des clones / alternatives de concombre pour .NET: voir cette question
StackOverflow
@ Carson63000 Oui, il y en a, mais personnellement, je ne vois pas grand-chose. Ruby est un langage .Net dans IronRuby. Créez simplement un projet IronRuby et utilisez du vrai concombre.
George Mauer
J'adore BDD et j'utilise StoryQ. N'oubliez pas de mentionner que l'histoire peut être développée en senarios avec Given / When / Then. Étant donné que certaines choses se sont produites quand je fais ceci et cela, alors j'attends ceci et cela. Consultez la présentation de David Starr à ce sujet sur TechEd channel9.msdn.com/Events/TechEd/NorthAmerica/2010/DPR302 et jetez également un œil à StoryQ si vous utilisez .net storyq.codeplex.com
Bronumski
3

Comment passer de cette idée à mon premier test? Combien faut-il décider avant de commencer et combien dois-je déterminer après avoir commencé à écrire des tests?

Décomposez votre application en petites histoires. ("En tant qu'utilisateur, je veux double-cliquer sur une icône et lancer le programme." Ou "En tant qu'utilisateur, je veux ouvrir mon navigateur et accéder au programme." Peu importe.)

Décomposez ensuite l'histoire en quelques tâches. (par exemple, créer un projet dans Eclipse, configurer un référentiel de code) Lorsque vous arrivez à une tâche de codage, écrivez votre premier test.

Quand dois-je prendre des décisions telles que le stockage des données dans un fichier texte ou une base de données?

Si vous n'êtes pas sûr, choisissez celui qui vous semble le plus simple et faites-le. (probablement le fichier texte) Si vous vous rendez compte que vous avez fait une erreur, refactorisez. Si vos tests sont bien structurés, vous devriez être en mesure de modifier le back-end et d'attraper les effets secondaires imprévus qui surviennent.

Christopher Bibbs
la source
3

Je suis surpris qu'aucune des réponses ne mentionne la chose que vous faites avant d'écrire votre premier test, qui consiste à créer une liste de tests . Une liste de tests est informée par les phases de rédaction et de conception de l'histoire mentionnées dans d'autres réponses et est le précurseur direct de la rédaction d'un test que vous semblez rechercher.

Pour plus d'informations sur TDD, je recommanderais le développement piloté par l'exemple par Kent Beck. Il a également un screencast TDD qui suit le développement d'une bibliothèque non triviale dans un pur style TDD avec des explications de Kent à chaque étape du processus. Je pense que c'est un excellent exemple de TDD dans la pratique, même s'il est (par nécessité) fait dans un environnement artificiel.

Rein Henrichs
la source
0

Avant le premier test unitaire, vous pensez à ce que vous voulez faire, puis réfléchissez à la façon dont vous le testeriez. Ensuite, écrivez ce test, voyez-le échouer et implémentez du code pour le faire passer.

Rincer, répéter, etc.

Pour moi, c'est la réflexion sur la façon dont vous le testeriez qui est importante et c'est ce qui peut guider votre conception.

Vide
la source