Séparation des classes JUnit en package de test spécial?

J’apprends les concepts de développement piloté par les tests en lisant les articles de Craftsman (cliquez sur Craftsman sous By Topic ) recommandé dans une réponse à ma question précédente, “Exemple de projet pour apprendre JUnit et une ingénierie logicielle correcte” . Jusqu’à maintenant j’aime ça!

Mais maintenant je veux m’asseoir et l’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 paquet, mais tout autre concept de note serait également utile.

Mettez-vous des classes de test dans org.myname.project.test. * Et du code normal dans org.myname.project. *? Est-ce que vous mettez les classes de test à côté des classes normales? Préférez-vous préfixer les noms de classe avec Test plutôt que 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 qui doit être fait, plutôt que de réellement faire avancer les choses.

Et j’ai un projet qui est actuellement bien divisé en paquets, mais le projet est devenu un gâchis. Au lieu d’essayer de tout refactoriser et d’écrire des tests, je veux tout recommencer, tester tout d’abord. Mais je dois d’abord savoir où vont mes tests.


edit: J’ai complètement oublié Maven, mais il semble qu’une majorité d’entre vous l’utilise! Dans le passé, j’avais un cas d’utilisation spécifique où Maven était complètement tombé en panne, mais Ant m’a donné la flexibilité dont j’avais besoin, alors je me suis retrouvé attaché à Ant, mais je pensais que je prenais une mauvaise approche. Je pense que je vais essayer de nouveau avec Maven, car cela semble aller bien avec le développement piloté par les tests.

Je préfère placer 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, tel que:

myproject/src/com/foo/Bar.java myproject/test/com/foo/BarTest.java 

Dans un projet Maven, cela ressemblerait à ceci:

 myproject/src/main/java/com/foo/Bar.java myproject/src/test/java/com/foo/BarTest.java 

Le point principal est que mes classes de test peuvent accéder (et tester!) Aux classes et aux membres de la scope du paquet.

Comme le montre l’exemple ci-dessus, mes classes de test portent le nom de la classe testée et le Test tant que suffixe. Cela aide à les trouver rapidement – ce n’est pas très amusant d’essayer de chercher parmi quelques centaines de classes de tests, dont chacune commence par Test

Mise à jour inspirée du commentaire de @ Ricket: de cette façon, les classes de test (généralement) apparaissent juste après leur copain testé dans une liste alphabétique des noms de classes par projet. (C’est marrant que j’en profite jour après jour, sans avoir réalisé consciemment comment …)

Mise à jour 2: Beaucoup de développeurs (y compris moi-même) aiment Maven, mais il semble y avoir au moins autant de développeurs. IMHO c’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; sinon, cela rend la vie une lutte misérable. Maven semble être difficile à comprendre pour beaucoup de 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: elle permet aux tests unitaires (et d’intégration) de franchir une étape naturelle du processus, ce qui aide les développeurs à adopter cette pratique essentielle.

Je mets mes classes de test dans le même paquet que ce qu’elles testent, mais dans un dossier ou un projet source différent . L’organisation de mon code de test de cette manière me permet de comstackr et de comstackr facilement le code 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.

J’utilise Maven . La structure promue par Maven est: –

 src/main/java/org/myname/project/MyClass.java src/test/java/org/myname/project/TestMyClass.java 

c’est-à-dire qu’une classe de test avec Test ajouté au nom de la classe testée se trouve dans une structure de répertoire parallèle au test principal.

L’un des avantages de disposer des classes de test dans le même package (mais pas nécessairement dans un répertoire) est que vous pouvez utiliser des méthodes de scope de package pour inspecter ou injecter des objects de test simulés.