J'apprends les concepts du développement piloté par les tests en lisant les articles Craftsman (cliquez sur Craftsman sous By Topic ) recommandés dans une réponse à ma question précédente, "Exemple de projet pour apprendre JUnit et le génie logiciel approprié" . Jusqu'à maintenant j'aime ça!
Mais maintenant, je veux m'asseoir et essayer moi-même. J'ai une question qui, je l'espère, n'aura besoin que d'une réponse simple.
Comment organisez-vous vos classes de test JUnit et votre code actuel? Je parle principalement de la structure du package, mais tout autre concept important serait également utile.
Mettez-vous des classes de test dans org.myname.project.test. * Et du code normal dans org.myname.project. *? Mettez-vous les classes de test juste à côté des classes normales? Préférez-vous préfixer les noms de classe avec Test plutôt que de les suffixer?
Je sais que cela semble être le genre de chose dont je ne devrais pas m'inquiéter si tôt, mais je suis une personne très centrée sur l'organisation. Je suis presque le genre de personne qui passe plus de temps à trouver des méthodes pour suivre ce qu'il faut faire, plutôt que de faire avancer les choses.
Et j'ai un projet qui est actuellement soigneusement divisé en packages, mais le projet est devenu un gâchis. Au lieu d'essayer de tout refactoriser et d'écrire des tests, je veux repartir à zéro, les tests avant tout. Mais j'ai d'abord besoin de savoir où vont mes tests.
edit: J'ai totalement oublié Maven, mais il semble que la majorité d'entre vous l'utilise! Dans le passé, j'ai eu un cas d'utilisation spécifique où Maven est complètement tombé en panne sur moi mais Ant m'a donné la flexibilité dont j'avais besoin, alors je me suis retrouvé attaché à Ant, mais je pense que peut-être que je prenais la mauvaise approche. Je pense que je vais donner un autre essai à Maven car il semble que cela ira bien avec un développement piloté par les tests.
la source
Réponses:
Je préfère mettre les classes de test dans le même package que les classes de projet qu'elles testent, mais dans un répertoire physique différent, comme:
Dans un projet Maven, cela ressemblerait à ceci:
Le point principal est que mes classes de test peuvent accéder (et tester!) Aux classes et aux membres de la portée du package.
Comme le montre l'exemple ci-dessus, mes classes de test ont le nom de la classe testée plus
Test
comme suffixe. Cela aide à les trouver rapidement - ce n'est pas très drôle d'essayer de rechercher parmi quelques centaines de classes de test, dont chacune commence parTest
...Mise à jour inspirée du commentaire de @ Ricket: de cette façon, les classes de test apparaissent (généralement) juste après leur copain testé dans une liste alphabétique des noms de classes par projet. (Drôle que je profite de ce jour après jour, sans avoir consciemment réalisé comment ...)
Update2: Beaucoup de développeurs (y compris moi-même) aiment Maven, mais il semble y en avoir au moins autant qui ne le font pas. À mon humble avis, il est très utile pour les projets Java «grand public» (je mettrais environ 90% des projets dans cette catégorie ... mais les 10% restants sont encore une minorité importante). Il est facile à utiliser si l'on peut accepter les conventions Maven; mais sinon, cela fait de la vie une lutte misérable. Maven semble être difficile à comprendre pour de nombreuses personnes socialisées sur Ant, car cela nécessite apparemment une façon de penser très différente. (Moi-même, n'ayant jamais utilisé Ant, je ne peux pas comparer les deux.) Une chose est sûre: cela fait des tests unitaires (et d'intégration) une étape naturelle et de première classe dans le processus, ce qui aide les développeurs à adopter cette pratique essentielle.
la source
public
) .Je place mes classes de test dans le même package que ce qu'elles testent mais dans un dossier ou un projet source différent . Organiser mon code de test de cette manière me permet de le compiler et de le conditionner facilement séparément afin que les fichiers jar de production ne contiennent pas de code de test. Il permet également au code de test d'accéder aux champs et méthodes privés du package.
la source
J'utilise Maven . La structure que Maven promeut est: -
c'est-à-dire qu'une classe de test avec Test ajouté au nom de la classe à tester est dans une structure de répertoires parallèle au test principal.
L'un des avantages d'avoir les classes de test dans le même package (pas nécessairement dans un répertoire) est que vous pouvez tirer parti des méthodes de la portée du package pour inspecter ou injecter des objets de test fictifs.
la source
<class>Test.java
pas le casTest<class>.java
<class>Test.java
schéma de dénomination permet à la classe principale et à la classe de test de s'afficher de près lors de l'utilisation des fonctionnalités de recherche IDE, ce qui le rend un peu meilleur queTest<class>.java
.