45 votes

Appliquer le TDD lorsque l'application est 100% CRUD

Je me heurte régulièrement à ce problème, et je ne sais pas comment surmonter cet obstacle. J'ai vraiment envie de commencer à apprendre et à appliquer le développement piloté par les tests (ou BDD, ou autre), mais il semble que chaque application que je fais et que je veux appliquer se limite à des trucs standard de CRUD de base de données, et je ne sais pas comment m'y prendre. Les objets ne font pratiquement rien, à part être persistés dans une base de données ; il n'y a pas de logique complexe à tester. Il y a une passerelle que je devrai éventuellement tester pour un service tiers, mais je veux d'abord terminer le cœur de l'application.

Chaque fois que j'essaie d'écrire des tests, je ne teste que des éléments de base que je ne devrais probablement pas tester en premier lieu (par exemple, les getters/setters), mais il ne semble pas que les objets aient autre chose. Je suppose que je pourrais tester la persistance mais cela ne me semble jamais correct parce que vous n'êtes pas supposé toucher une base de données, mais si vous la simulez alors vous ne testez vraiment rien parce que vous contrôlez les données qui sont renvoyées ; comme j'ai vu beaucoup d'exemples où il y a un référentiel simulé qui simule une base de données en bouclant et en créant une liste de valeurs connues, et le test vérifie que le "référentiel" peut récupérer une certaine valeur... Je ne vois pas l'intérêt d'un tel test car bien sûr le "repository" va retourner cette valeur ; c'est codé en dur dans la classe ! Eh bien, je le vois d'un point de vue purement TDD (c'est-à-dire que vous devez avoir un test disant que votre référentiel a besoin d'une méthode GetCustomerByName ou autre avant que vous puissiez écrire la méthode elle-même), mais cela ressemble à suivre un dogme sans autre raison que sa "façon de faire" - le test ne semble pas faire quelque chose d'utile en dehors de justifier une méthode.

Est-ce que je pense à ça de la mauvaise façon ?

Prenons l'exemple d'une application courante de gestion des contacts. Nous avons des contacts, et disons que nous pouvons envoyer des messages aux contacts. Nous avons donc deux entités : Contact y Message chacun avec des propriétés communes (par exemple, Prénom, Nom, Courriel pour le contact, et Objet, Corps et Date pour le message). Si aucun de ces objets n'a de comportement réel ou n'a besoin d'exécuter une quelconque logique, comment appliquer le TDD lors de la conception d'une application comme celle-ci ? Le seul but de l'application est essentiellement de récupérer une liste de contacts et de les afficher sur une page, d'afficher un formulaire pour envoyer un message, et ainsi de suite. Je ne vois aucune sorte de tests utiles ici - je pourrais penser à quelques tests mais ils seraient plutôt des tests pour le plaisir de dire "Vous voyez, j'ai des tests !" au lieu de tester réellement une sorte de logique (Bien que Ruby on Rails en fasse bon usage, je ne considère pas vraiment le test de validation comme un test "utile" parce que cela devrait être quelque chose dont le framework s'occupe pour vous).

14voto

S.Lott Points 207588

"Le seul but de l'application est de tirer une liste de contacts."

Ok. Teste ça. Que veut dire "tirer" ? Ça ressemble à "logique".

" les afficher sur une page "

Ok. Teste ça. Les bons sont affichés ? Tout est là ?

" afficher un formulaire pour envoyer un message,"

Ok. Teste ça. Les bons champs ? Les validations des entrées fonctionnent toutes ?

" et autres."

Ok. Testez ça. Est-ce que les requêtes fonctionnent ? Trouvent-elles les bonnes données ? Affichent les bonnes données ? Valident les entrées ? Produisent les bons messages d'erreur pour les entrées non valides ?

6voto

RN. Points 559

Je travaille actuellement sur une application purement CRUD. Mais je vois beaucoup d'avantages aux tests unitaires (note : je n'ai pas dit TDD).

J'écris d'abord le code et puis les cas d'essai, mais jamais trop éloignés les uns des autres, mais assez tôt cependant

Et je teste les opérations CRUD - la persistance dans la base de données également.

Lorsque j'en aurai fini avec la persistance - et que je passerai à la couche d'interface utilisateur - je serai assez confiant que mon service \persistence La couche est bonne - et je peux alors me concentrer sur l'interface utilisateur seule à ce moment-là.

Donc, à mon avis, il y a toujours un avantage à utiliser le TDD. \Unit les tests (quel que soit le nom que vous leur donnez, selon votre degré d'extrémisme), même pour les applications CRUD. Vous devez juste trouver la bonne stratégie pour votre application.

Faites preuve de bon sens.... et tout ira bien.

5voto

David Yancey Points 1510

J'ai l'impression que nous confondons TDD et Unit Testing.

Les tests unitaires sont des tests spécifiques qui testent des unités de comportements. Ces tests sont souvent inclus dans le build d'intégration. S.Lott a décrit quelques excellents candidats pour ce type de tests.

TDD est pour la conception. Je constate le plus souvent que les tests que j'écris lorsque j'utilise la méthode TDD seront soit rejetés, soit transformés en tests unitaires. La raison en est que lorsque je fais du TDD, je teste ma conception pendant que je conçois mon application, ma classe, ma méthode, mon domaine, etc...

En réponse à votre scénario, je suis d'accord avec ce que S.Lott a laissé entendre, à savoir que ce dont vous avez besoin est une suite de tests unitaires pour tester des comportements spécifiques dans votre application.

4voto

Piotr Kaluza Points 368

Le TDD d'une simple application CRUD est à mon avis un peu comme la pratique des gammes à la guitare - vous pouvez penser que c'est ennuyeux et fastidieux, mais vous découvrez à quel point votre jeu s'améliore. En termes de développement, il est probable que vous écrirez un code moins couplé et plus facile à tester. En outre, vous êtes plus susceptible de voir les choses du point de vue de l'utilisateur du code - vous l'utiliserez réellement. Cela peut avoir de nombreux effets secondaires intéressants, comme des API plus intuitives, une meilleure séparation des préoccupations, etc. Il est vrai qu'il existe des générateurs d'échafaudages qui peuvent faire du CRUD de base pour vous et ils ont leur place, notamment pour le prototypage, mais ils sont généralement liés à une sorte de framework. Pourquoi ne pas se concentrer d'abord sur le domaine de base, en reportant les décisions relatives au cadre, à l'interface utilisateur et à la base de données jusqu'à ce que vous ayez une meilleure idée de la fonctionnalité de base nécessaire - TDD peut également vous aider à le faire. Dans votre exemple : Voulez-vous que les messages soient une file d'attente ou un arbre hiérarchique, etc. Voulez-vous qu'ils soient chargés en temps réel ? Qu'en est-il du tri/de la recherche ? Avez-vous besoin de supporter JSON ou seulement html ? Il est beaucoup plus facile de voir ce genre de questions avec BDD / TDD. Si vous faites du TDD, vous pouvez tester votre logique de base sans même utiliser un framework (et attendre une minute pour qu'il se charge / s'exécute).

2voto

zeroin23 Points 643

Juste une idée...

Prenez les exigences pour le CRUD, utilisez des outils comme watij o watir o AutoIt pour créer des cas de test. Commencez à créer l'interface utilisateur pour passer les tests. Une fois que vous avez créé l'interface utilisateur et que vous avez réussi un seul test, commencez à écrire la couche logique pour ce test, puis la couche BD.

Pour la plupart des utilisateurs, l'interface utilisateur est le système. N'oubliez pas d'écrire des scénarios de test pour chaque nouvelle couche que vous construisez. Ainsi, au lieu de partir de la couche db vers app vers ui, commencez dans le sens inverse.

À la fin de la journée, vous aurez probablement accumulé un ensemble puissant de tests de régression, qui vous donnera une certaine confiance pour effectuer des remaniements en toute sécurité.

c'est juste une idée...

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