web-dev-qa-db-fra.com

Comment ajouter un autre dossier source de test à Maven et le compiler dans un dossier séparé?

J'ai la valeur par défaut src/test/Java dossier pour nos tests unitaires. Un dossier séparé src/integration/Java est disponible pour les tests d'intégration.

J'ai configuré le maven-surefire-plugin pour exécuter les tests unitaires/d'intégration dans leurs phases respectives. Cela fonctionne très bien lorsque les classes compilées sont dans le bon répertoire. Malheureusement, Maven ne prend en charge qu'un dossier source de test et un dossier de sortie de test.

Avec le plugin mavens build-helper, je pourrais ajouter un autre dossier de source de test mais les classes compilées seront générées dans test-classes mais je veux compiler les classes de src/integration/Java en target/integration-test-classes. Est-ce possible?

src/test/Java > target/test-classes
src/integration/Java > target/integration-test-classes

PS: je n'aime pas cette exclusion/inclusion sur la solution de base du package (exclure tout **/it/** fichiers de la phase de test par défaut et exclure tous les **/unit/** de la phase d'intégration.

35
Christopher Klewes

Désolé, il n'y a aucun moyen de le faire, à mon humble avis même avec un certain piratage à l'esprit. Le concept est qu'il n'y a qu'un seul répertoire cible pour les classes compilées et un pour les classes de test compilées (même <build> le schéma des balises expose cela). Pour être honnête, je ne pense pas vraiment que cela devrait être possible avec Maven. Maven favorise une conception droite, propre et lisible de votre application, en utilisant des modules bien conçus.

Si vous pensez que ce que vous voulez vraiment faire, c'est créer un module de tests d'intégration. C'est la pratique courante, en fait. Jusqu'à présent, j'ai toujours eu un module de test d'intégration séparé et je n'ai jamais eu de problème avec ça. Vous devez bien sûr dépendre de tous les modules nécessaires pour exécuter ces tests. Vous pouvez même dépendre des classes de test d'autres modules en utilisant <type>test-jar</type> avec votre déclaration de dépendance comme mentionné ici:

http://maven.Apache.org/guides/mini/guide-attached-tests.html

Je n'aime pas cette méthode, cependant, et préfère généralement avoir un module séparé avec des éléments de support de test, comme des classes de base pour les cas de test JUnit, etc.

9
Michał Kalinowski

D'après ce que vous avez écrit, il semble que vous n'ayez pas nommé correctement vos tests d'intégration et que vous n'ayez pas utilisé le maven-failafe-plugin pour vos tests d'intégration. Sur la base de la convention du maven-fail-safe-plugin vous devez nommer vos tests d'intégration comme *IT.Java. Si vous avez nommé vos tests d'intégration de manière appropriée, vous pouvez gérer cela avec une configuration plus ou moins comme celle-ci:

<project ...>
  [...]
  <build>
    [...]
     <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>build-helper-maven-plugin</artifactId>
        <version>1.9.1</version>
        <executions>
          <execution>
            <id>add-test-source</id>
            <phase>generate-test-sources</phase>
            <goals>
              <goal>add-test-source</goal>
            </goals>
            <configuration>
              <sources>
                <source>src/integration/Java</source>
              </sources>
            </configuration>
          </execution>
        </executions>
      </plugin>
      [...]
  </build>
  [...]
</project>

Avec ce qui précède, il est possible de maintenir les tests d'intégration dans le même module. Mais cela ne résoudra pas l'idée d'avoir les classes de tests d'intégration compilées dans un dossier séparé.

Parfois, il est préférable d'avoir un module de test d'intégration séparé qui ne contient que les tests d'intégration (ce qui se traduit par une construction multi-modules). Si vous souhaitez quitter les conventions de Maven, vous pouvez essayer de configurer le plugin maven-compiler pour utiliser un chemin de sortie différent (par exemple. target/integration-tests/classes) qui ne pense pas fonctionnera vraiment.

37
khmarbaise

Si vous souhaitez uniquement modifier le dossier source du test unitaire (plutôt que d'en ajouter un autre), modifiez simplement l'élément testSourceDirectory:

<build>
    <testSourceDirectory>${project.basedir}/src/test/groovy</testSourceDirectory>

C'est utile si tous vos tests unitaires sont écrits en groovy. (Mais vous devrez également configurer maven pour compiler également votre code groovy - voir groovy-Eclipse-maven-plugin ou build-helper-maven-plugin .)

10
GreenGiant