2012-04-13 4 views
23

Ich habe den Standardordner src/test/java für unsere Komponententests. Für die Integrationstests steht ein separater Ordner src/integration/java zur Verfügung.Wie fügt man Maven einen weiteren Testquellordner hinzu und kompiliert ihn in einen separaten Ordner?

Ich konfigurierte die maven-surefire-plugin, um die Einheit/Integration Tests in ihren jeweiligen Phasen auszuführen. Dies funktioniert sehr gut, wenn sich die kompilierten Klassen im richtigen Verzeichnis befinden. Leider unterstützt Maven nur einen Testquellordner und einen Testausgabeordner.

Mit mavens build-Helfer-Plugin ich einen weiteren Test-Quellordner hinzufügen könnte, aber die kompilierten Klassen werden in test-classes erzeugt werden, aber ich möchte die Klassen aus src/integration/java in target/integration-test-classes kompilieren. Ist das möglich?

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

PS: Ich mag das auf Paketbasis Lösung nicht ausschließen/include (schließt alle **/it/** Dateien aus der Standard-Testphase, und all **/unit/** aus der Integrationsphase ausschließen

+1

Verschieben Sie Ihre Integrationstests in ein separates Maven-Modul. –

Antwort

10

Sorry, es gibt keine. Das Konzept ist, dass es nur ein Zielverzeichnis für kompilierte Klassen und eins für kompilierte Testklassen gibt (selbst das <build> Tag-Schema deckt das auf.) Um ehrlich zu sein, denke ich nicht wirklich Es sollte mit Maven möglich sein.Maven fördert geradliniges, sauberes und lesbares Design Ihrer Anwendung, indem Sie gut gefertigte Module verwenden.

Wenn Sie denken, was Sie wirklich tun möchten, ist tatsächlich Integrationstestmodule zu erstellen. Das ist in der Tat die übliche Praxis. Bisher hatte ich immer ein separates Integrationstestmodul und hatte nie Probleme damit. Sie sollten natürlich auf alle benötigten Module angewiesen sein, um diese Tests durchzuführen. Sie können auch auf anderen Modultestklassen abhängig von <type>test-jar</type> mit Abhängigkeitserklärung mit, wie hier erwähnt:

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

Ich mag diese Methode jedoch nicht, und in der Regel bevorzugen separates Modul mit Testunterstützung Sachen haben, , wie Basisklassen für JUnit-Testfälle usw.

30

Basierend auf dem, was Sie geschrieben haben, klingt es so, als hätten Sie Ihre Integrationstests nicht korrekt benannt und Sie haben die maven-failsafe-plugin nicht für Ihre Integrationstests verwendet. Basierend auf der Konvention der maven-failsafe-plugin sollten Sie Ihre Integration Tests wie *IT.java benennen. Wenn Sie Ihre Integrationstests namens entsprechend können Sie das mit einer mehr oder weniger Konfiguration wie folgt behandeln:

<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> 

Mit der oben ist es möglich, die Integrationstests innerhalb des gleichen Moduls zu halten. Dies löst jedoch nicht die Idee, die kompilierten Integrationstestklassen in einem separaten Ordner zu haben.

Manchmal ist es besser, ein separates Integrationstestmodul zu haben, das nur die Integrationstests enthält (was zu einem Multi-Modul-Build führt). Wenn Sie die Konventionen von Maven verlassen möchten, können Sie versuchen, das maven-compiler-plugin so zu konfigurieren, dass es einen anderen Ausgabepfad verwendet (zB target/integration-tests/classes), die nicht wirklich funktionieren.

+1

Basierend auf dieser Antwort https://github.com/alimate/maven-source-sets –

5

Wenn Sie nur die Unit-Test-Quellordner (und nicht fügen Sie eine zusätzliche eins) ändern möchten, nur das testSourceDirectory Element ändern:

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

Dies ist nützlich, wenn Sie alle Ihre Unit-Tests in groovy geschrieben . (Sie müssen aber auch maven konfigurieren, um Ihren groovigen Code zu kompilieren - siehe groovy-eclipse-maven-plugin oder build-helper-maven-plugin.)