73 votes

TDD - Comment faire pour vraiment commencer à penser TDD?

J'ai lu sur Agile, XP méthodologies et les Ats.

J'ai été dans des projets qui stipule qu'il doit faire TDD, mais la plupart des tests sont en quelque sorte des tests d'intégration ou au cours du projet TDD est oublié dans son effort pour finir codes plus rapide.

Donc, tant que mon cas va, j'ai écrit des tests unitaires, mais je suis aller pour commencer à écrire le premier code au lieu d'écrire un test. J'ai le sentiment qu'il est une pensée que l' / design / changement de paradigme qui est en fait énorme. Donc, si l'on croit vraiment en mode TDD, vous finissent par revenir, de style ancien, en raison de la pression du temps / les livrables du projet.

J'ai quelques classes où j'ai unité pure testé le code, mais je n'arrive pas à continuer avec le processus, quand on se moque de venir en image. Aussi, je vois à la fois : "n'est-il pas trop trivial pour écrire un test pour" syndrome.

Comment avez-vous les gars pense que je devrais faire?

48voto

Deltics Points 9213

Je trouve intéressant le fait qu'aucune des réponses jusqu'à présent ont touché sur ce que je considère être une intuition fondamentale dans le développement moderne des pratiques, et qui est que "l'ancienne" façon d'écrire des logiciels par la collecte des exigences, faire l'analyse et la modélisation du système désiré avant d'écrire n'importe quel code avait en fait beaucoup de choses pour elle.

TDD incarne réellement ce dans une mesure.

Écrire un test, vous devez d'abord savoir - pour mettre les choses en des termes très simples - ce que vos entrées sont et ce que vos résultats seront.

Une fois que vous avez cette connaissance, vous pouvez écrire un test pour l'exercice de certaines morceau mythique de code et aussi, dans une certaine mesure, ce que d'autres objets qui code va interagir avec, avant de vous écrire ce code ou de créer ces artefacts.

C'est ce que nous avons déjà appellerais "ingénierie des exigences" et "l'analyse des systèmes" à l'ancienne "cascade", méthode(s).

Plus loin, vous verrez que une fois que vous maîtrisez les exigences à ce niveau, l'écriture de tests viendront naturellement (c'est, après tout, simplement l'expression dans le code de l'état de la fonctionnalité mise en œuvre de ces exigences).

Et dans l'écriture du code qui exprime le besoin sous la forme de tests, vous permettront d'identifier les lacunes et les malentendus dans les conditions avant que vous avez commis ces lacunes et de malentendus à ce projet sous la forme de code exécutable.

Pour les praticiens modernes de méthodes "Agiles" pour admettre qu'ils sont engagés dans une série de "chutes d'eau" est, je pense, trop embarrassant, de sorte à ce besoin pour l'ingénierie des exigences et de la compréhension est dissimulé derrière la langue que les discussions autour de la nécessité d'aborder ces choses tout en essayant désespérément d'éviter d'admettre que "Agile" (comme on l'entend couramment, ou peut-être mal compris) jeté le bébé avec l'eau du bain.

24voto

Carl Manaster Points 23696

Donc, tant que mon cas va, j'ai écrit des tests unitaires, mais je me retrouve va commencer à écrire le premier code au lieu d'écrire un test. Je me sens il y a une pensée, de conception et de paradigme le changement qui est en fait énorme. Donc, si l'on croit vraiment en mode TDD, vous en réalité finissent par revenir, de style ancien en raison de la pression du temps / projet livrables.

Vous pouvez essayer absolument disciplinée environ TDD pour une période déterminée - dire un couple de semaines ou un mois. Lorsque vous vous surprenez à l'écriture de code avant les essais, supprimer et recommencer, avec un test en échec. Faites cela jusqu'à ce que vous savez que vous pouvez, jusqu'à ce que vous savez à quoi cela ressemble - et puis vous avez la possibilité de le faire, et la liberté de faire un choix éclairé et de comprendre que c'est OK si ce choix est parfois pour le premier code. Mais ne laissez pas l'habitude de vous éloigner de bonnes pratiques. De la première à obtenir les bonnes pratiques vers le bas et ensuite choisir de les appliquer (et bien sûr, vous pouvez trouver la réponse à cette question est "toujours").

J'ai quelques classes où j'ai pur unité testé le code, mais je n'arrive pas à continuer avec le processus, quand on se moque de viennent en image. Aussi, je vois à fois : "n'est-il pas trop trivial pour écrire un test pour" syndrome.

On se moque de sont une chose - êtes-vous bien à eux? Si vous n'êtes pas à l'aise avec les objets fantaisie, et vous êtes dans une situation où on se moque de sont appropriés, puis la pratique jusqu'à ce que - comme TDD - vous êtes bon avec eux.

À l'égard du "trop trivial" question - non pas pour le premier couple de semaines. Juste TDD tout le temps. Et quand vous trouvez que le DRT est de vous conduire à une meilleure conception - même de "trop trivial" code - note. Pensez à ce que votre code devrait ressembler sans elle. Et vous découvrirez peut-être qu'aucun code n'est trop banal à l'ATS. Ou, non. Mais mon point est, de le tenter, sérieusement, pour une période importante, et puis vous pouvez faire de meilleurs choix. Soyez à l'aise avec elle, puis de l'évaluer.

15voto

ShaChris23 Points 7713

C'est simple:

By learning to think about the "What" __before__ you think about the "How"

En d'autres termes, penser exactement ce que vous voulez faire (interface), plutôt que de vous comment vous allez le faire (mise en œuvre)

TDD, comme un outil de conception, basé sur mon expérience, vous aide vraiment à voir les choses du point de vue utilisateur que le codeur point de vue. En outre, je pense que TDD permet à votre esprit vraiment pense exactement ce que vous êtes en train de faire, ce qui est le résultat attendu, etc.

Alors la prochaine fois quand vous êtes à essayer de "TDD", demandez-vous ce que c'est que vous essayez de faire, et de commencer à écrire le code qui exprime votre intention.

Exemple:

Dites, quelqu'un veut vous écrire un entier additionneur.

La personne qui ne possède pas de TDD mindest va simplement faire:

int add(int a, int b)
{
  return a + b;
}

Est le code ci-dessus est correcte? Assurez-vous qu'il est. Mais cette approche, basée sur mon expérience, échoue lorsque vous avez un complexe de composants à écrire. (C'est pourquoi vous avez posé cette question en premier lieu; je sais, j'avais été là avant de (peut-être encore? lol))

La grande chose au sujet d'ATS est qu'il vous oblige à donner de l'attention d'abord et avant tout de l'interface (ce) du système, tout en ne vous demande pas immédiatement pour la mise en œuvre (le comment).

En d'autres termes, si quelqu'un m'a demandé d'écrire un additionneur, j'aurais quelque chose comme:

void assertOnePlusTwoEqualThree()
{
  assert( add(1,2) == 3 );
}

Avis, comment, même avant même de penser à comment l'ajouter() est censé fonctionner, j'ai déjà repassé un peu les choses. C'est, je l'ai déjà trouvé:

  • l'interface de mon additionneur à la fois des entrées et des sorties
  • la première trivial de cas de test (test unitaire pour libre!!)

ensuite vous mettre en œuvre la méthode add().

Voir, il n'a pas d'importance si la logique discuté ici est si simple à mettre en œuvre. Pour avoir un TDD état d'esprit, est de l'appliquer tout le temps , sans exception. Vous devez le faire autant de fois que vous ne pensez même pas à ce sujet plus. C'est juste une partie de la façon dont vous concevez. Je peux dire cela parce que j'ai vu, il m'est arrivé un professionnel (il a fallu environ un an de persévérance).

De la même manière que si vous le faites toujours un bon travail sur la programmation, quelle que soit la complexité à la main, vous vous approchez de votre travail de la même façon.

Enfin, je pense que le DRT est comparable à un "code d'esquisse." Qui est, vous commencer à essayer pour voir si l'interface fonctionne bien pour chaque scénario (scénario de test). Ainsi il est bon si vous finissez par la modification de l'interface, et les noms, etc. Voir, ce que j'ai appris, c'est que beaucoup de fois, le design est tout simplement de comprendre le problème de fond. ATS est un outil qui vous permet de le faire.

Esprit humain, de l'OMI, des œuvres plus facile avec des exemples concrets (cas de test/scénarios) plutôt que de la pensée abstraite (comment mettre en place quelque chose). En ayant des cas de test, il permet à votre esprit peu à peu apprendre sur le problème que vous essayez de résoudre à la main.

Il est normal de ne pas savoir (pour revenir à la manière "traditionnelle"...détendez-vous, laissez votre esprit d'ajuster). C'est pas grave si c'est pas parfait (l'écriture de certains de la mise en œuvre du code est tout à fait correct...votre cerveau juste essayer de comprendre les choses). Essayez juste de garder, garder la lecture, garder le codage, mais ne jamais abandonner! =)

7voto

S.Lott Points 207588

"Donc, si l'on croit vraiment TDD, vous finissent par revenir de style ancien, en raison de la pression du temps / les livrables du projet."

En fait, je ne pense pas que cela peut éventuellement être vrai.

Si vous êtes "retour de l'ancien style", la seule raison peut-être parce que vous ne croyez pas que TDD va produire un code de meilleure qualité plus rapidement.

Je pense que quelqu'un s'arrête à l'aide de TDD parce qu'ils se sentent que c'est mieux de produire des pauvres code plus rapidement.

4voto

Fraser Graham Points 2181

De la Discipline.

Prendre la décision d'utiliser TDD et s'y tenir, c'est entièrement une question de votre propre capacité à s'engager dans un processus et d'en tirer une conclusion.

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