C'est une question relativement ouverte. Si j'ai créé une application dans un projet dans Eclipse et que je souhaite ensuite tester ce projet, dois-je créer le code JUnit dans le même projet ou créer un projet distinct. Par exemple...
ShopSystem
peut-être le nom de mon projet principal - dois-je créer un projet appelé disons, ShopSystemTest
?
En général - jusqu'où "loin" le code de test doit-il être stocké depuis le dossier principal du projet? Si je stocke le code de test dans le projet principal, puis que j'exporte le projet principal sous forme de fichier exécutable, il emportera le code de test avec lui, ce qui n'est pas idéal ...
Suggestions?
Bien qu'il n'y ait pas que la bonne façon, l'approche habituelle consiste à conserver les tests unitaires dans le même projet.
Vous pouvez créer un deuxième dossier source (comme test
), où vous placez vos classes de test dans les mêmes packages que les classes sous test. Cela vous permet également de tester des classes privées de package sans inonder vos principaux packages source de classes de test.
La structure de votre dossier/package source ressemblerait alors à ceci:
-sources
-main
-my.package
-MyClass.Java
-test
-my.package
-MyClassTest.Java
Vous pouvez ensuite configurer votre build pour ne pas inclure le dossier source test
lors de la compression du JAR.
J'aime beaucoup la convention maven: il y a une arborescence source distincte pour main et test dans le même projet, le code principal est déployé, le code de test ne l'est pas. Les structures de package peuvent être (mais ne doivent pas être) identiques.
project
src
main
Java // source files
resources // xml, properties etc
test
Java // source files
resources // xml, properties etc
Et dans Eclipse, lorsque vous choisissez new -> JUnit test case
, vous changez simplement le dossier source en src/test/Java et laissez le paquet suggéré tel quel.
(L'un des avantages de rester dans le même package est d'avoir accès aux membres protégés et au package, bien que ce ne soit pas un comportement de test unitaire "correct")
pdate: Voici du code pour illustrer mon dernier point:
Classe principale (dans src/main/Java):
package com.test;
public class Foo{
static class Phleem{
public Phleem(final String stupidParameter){
}
}
String bar;
protected String baz;
protected Object thingy;
}
Classe de test (en src/test/Java):
package com.test;
import org.junit.Test;
public class FooTest{
@Test
public void testFoo(){
final Foo foo = new Foo();
foo.bar = "I can access default-scoped members";
foo.baz = "And protected members, too";
foo.thingy = new Foo.Phleem("And I can access default-scoped classes");
}
}
En général, vous avez -
/src/main/Java (for codes)
/src/test/Java (for tests)
Considérez la méthode maven: dans un projet maven, les soruces sont organisées de cette façon
src
|--main
| |--Java
|--test
|--Java
Votre code source va dans src/main/Java, votre code de test junit va dans src/test/Java, ils sont tous les deux le dossier source (et en conséquence, vous pouvez mettre votre code jUnit dans le même paquet que votre Java code, mais dans un dossier source différent).
L'intérêt est que pour le codage habituel, vos classes jUnit sont dans des packages de code, mais lors de la création de jar, vous pouvez prendre des classes provenant uniquement de src/main/Java et ne pas publier vos tests.