2008-09-30 5 views
23

Je fais TDD, et j'ai été assez lâche dans l'organisation de mes tests unitaires. J'ai tendance à commencer avec un fichier représentant l'histoire ou le morceau de fonctionnalité suivant et à écrire tous les tests unitaires pour que cela fonctionne.Comment organisez-vous vos tests unitaires en TDD?

Bien sûr, si j'introduis une nouvelle classe, je crée généralement un module ou un module de test unitaire distinct pour cette classe, mais je n'organise pas les tests eux-mêmes dans une structure de niveau supérieur. Le résultat est que j'écris du code rapidement et je crois que mon programme actuel est raisonnablement bien structuré, mais les tests unitaires eux-mêmes sont «désordonnés». Surtout, leur structure tend à récapituler la phylogénie du processus de développement. Parfois, je me vois comme la paresse commerciale dans le code de la paresse dans les tests.

Quelle est la taille du problème? Qui ici refaçonne continuellement et réorganise leurs tests unitaires pour essayer d'améliorer leur structure globale? Des conseils pour cela? À quoi devrait ressembler la structure générale des tests?

(Notez que je ne suis pas tellement demander au « combien d'affirmations par fonction » question posée ici:. How many unit tests should I write per function/method? Je parle de la plus grande image)

+4

"récapituler la phylogénie"? Sensationnel. –

+7

@OAB: "Wow" n'est pas le mot que j'utiliserais. Je suis aussi fan du mot sesquipedalian que le gars suivant, mais c'est juste magniloquent. – raven

Répondre

12

Divisez vos tests en 2 sets:

  • tests fonctionnels
  • unités teste

fonctionnelle les tests sont une histoire par utilisateur. Les tests unitaires sont par classe. Le premier vérifie que vous soutenez réellement l'histoire, le dernier exercice et documente votre fonctionnalité.

Il existe un répertoire (package) pour les tests fonctionnels. Les tests unitaires doivent être étroitement liés aux fonctionnalités qu'ils exercent (ils sont donc dispersés). Vous les déplacez et les refactorisez lorsque vous vous déplacez & refactorisez votre code.

3

J'écris une classe de test unitaire pour chaque classer dans l'application et conserver les classes de test organisées dans la même structure de package que les classes testées.

À l'intérieur de chaque classe de test, je n'ai pas vraiment de structure organisationnelle. Chacun n'a qu'une poignée de méthodes pour chaque méthode publique dans la classe à tester, donc je n'ai jamais eu de problème à trouver ce que je cherchais.

+0

Comment conservez-vous les tests organisés dans la même structure de paquets que les classes testées? Je trouve que je ne peux pas suivre le refactoring des cours à l'essai si j'essaye de le faire. –

+2

@PeterAjtai Mon IDE (Eclipse) s'occupe en partie de ça pour moi. J'ai un dossier source racine et un dossier de test racine séparé. Chacun de ceux-ci a les mêmes dossiers de paquetage à l'intérieur. Lorsque je clique avec le bouton droit sur une classe dans Eclipse et que je sélectionne l'option de menu pour créer une nouvelle classe de test JUnit, je sélectionne simplement le dossier de test en tant qu'emplacement racine et le reste de la structure du répertoire du package est automatiquement copié. Si les méthodes sont scindées en une nouvelle classe lors du refactoring, je crée une nouvelle classe de test de la même manière, mais déplacez et modifiez manuellement les anciennes méthodes de test. –

0

J'essaie de considérer les tests unitaires comme un projet à part. Comme pour tout projet, l'organisation doit suivre une logique interne. Il ne doit cependant pas être spécifique ou formellement défini - tout ce que vous êtes à l'aise est OK tant qu'il maintient votre projet bien organisé et propre. Donc, pour les tests unitaires, soit je suis la structure du code de projet principal, soit je me concentre sur les domaines fonctionnels (parfois quand la situation l'exige).

les laisser dans un tas est comme vous pouvez l'imaginer désordre et difficile à maintenir

2

Pour chaque classe du logiciel, je maintiens une classe de test unitaire. Les classes de test unitaires suivent la même hiérarchie de paquetages que les classes testées. Je conserve mon code de test unitaire dans un projet distinct. Certaines personnes préfèrent également conserver leur code de test dans le même projet sous un répertoire source distinct appelé «test». Vous pourriez suivre tout ce qui vous semble confortable.

3

La partie la moins importante est l'organisation des tests.

Je commence par placer les tests dans une classe qui se rapporte à la classe testée, donc com.jeffreyfredrick.Foo a un test com.jeffreyfredrick.FooTest. Mais si certains sous-ensembles de ces classes ont besoin d'une configuration différente, je les déplace dans leur propre classe de test. Je place mes tests dans un répertoire source séparé mais je les garde dans le même projet.

La partie la plus importante est la refactorisation des tests.

Oui J'essaie de refactoriser mes tests au fur et à mesure. L'objectif est d'éliminer les doublons tout en restant déclaratif et facile à lire. Cela est vrai à la fois dans les classes de test et entre les classes de test. Au sein d'une classe de test, je pourrais avoir une méthode paramétrée pour créer un faux test (faux ou stub). Mes fakes de test sont généralement des classes internes dans une classe de test, mais si je trouve qu'il y en a besoin, je les retirerai pour les réutiliser à travers les tests. Je vais aussi créer une classe TestUtil avec des méthodes communes quand cela me semble approprié. Je pense que le refactoring de vos tests est important pour le succès à long terme des tests unitaires sur les grands projets. Avez-vous déjà entendu des gens se plaindre que leurs tests sont trop fragiles ou les empêchent de changer? Vous ne voulez pas être dans une position où changer le comportement d'une classe signifie faire des dizaines, voire des centaines de changements à vos tests. Et tout comme avec le code, vous y parvenez en refacturant et en gardant les tests propres.

Les tests sont.