La simple création d'un projet de test et l'écriture de certaines méthodes de test est une sorte de TDD, mais d'après mon expérience, cela n'aide pas beaucoup sauf si vous travaillez sur une bibliothèque où il existe une API connue et les appels de méthode correspondent directement à quelque chose attendu par l'utilisateur . Vous devez trouver la bonne liste de tests, et pour une application non triviale, cela peut être très difficile à faire.
Je recommande d'essayer SpecFlow - il continue de définir des tests bien séparés de l'implémentation et la structure des fichiers de fonctionnalités vous oblige à réfléchir à ce que vous testez réellement.
Lorsque vous définissez une fonctionnalité, vous écrivez simplement quelque chose comme
When a user is saved
Then the user should exist
Comme vous n'êtes pas dans un fichier de code à ce stade, vous n'êtes pas tenté de penser aux détails de l'implémentation, comme la méthode qui est appelée pour créer un utilisateur ou même la classe dans laquelle il est implémenté. Vous pouvez utiliser des balises pour choisir différentes implémentations, à ce niveau, peu importe que "l'utilisateur soit enregistré" signifie un appel à CreateUser ou l'ouverture d'un navigateur et l'envoi d'un formulaire.
Une fois que vous avez défini les fonctionnalités, tous les tests sont générés et commenceront à passer à mesure que vous implémentez les définitions d'étape et le code d'application réel testé.
Pour une application simple, vous pouvez simplement créer les fichiers de fonctionnalités, mais pour tout ce qui est plus complexe, il est utile de rassembler au préalable une spécification plus complète. J'utilise une application de mindmapping iPad pour cela, mais vous pouvez utiliser l'outil avec lequel vous êtes le plus à l'aise.
Commencez avec une liste de fonctionnalités de haut niveau telles que "Enregistrement d'utilisateur". Celles-ci ont tendance à être trop larges pour écrire des tests directement, alors décomposez-les en sous-fonctionnalités qui peuvent être clairement définies et généralement mappées à une action utilisateur spécifique comme "Enregistrer l'utilisateur" ou "Afficher l'utilisateur existant".
Chacune de ces sous-fonctionnalités aura besoin d'une liste de scénarios qui, ensemble, définissent complètement si la fonctionnalité fonctionne ou non, des choses comme "Peut enregistrer un utilisateur valide" et "Ne peut pas enregistrer un utilisateur avec un nom d'utilisateur en double".
Au fur et à mesure que vous construisez cette liste, il deviendra généralement clair où la structure doit être ajustée - si vous ne pouvez pas proposer de tests de scénario pour une fonctionnalité, ou si vous vous retrouvez avec trop de fonctionnalités dans une fonctionnalité, cette fonctionnalité est probablement définie à le mauvais niveau et doit être divisé ou modifié.