Как добавить другую исходную папку теста в Maven и скомпилировать ее в отдельную папку?

у меня есть значение по умолчанию src/test/java папка для наших модульных тестов. Отдельная папка src/integration/java доступно для интеграционных тестов.

Я настроил maven-surefire-plugin для выполнения модульных / интеграционных тестов на соответствующих этапах. Это отлично работает, когда скомпилированные классы находятся в правильном каталоге. К сожалению, Maven поддерживает только одну исходную папку теста и одну выходную папку теста.

с плагином mavens build-helper я мог бы добавить еще одну папку test-source, но скомпилированные классы будут сгенерированы в test-classes но я хочу, чтобы скомпилировать классы src/integration/java на target/integration-test-classes. Возможно ли это?

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

PS: мне не нравится это исключение / включение в пакет базового решения (исключить все **/it/** файлы из фазы тестирования по умолчанию, и исключить все **/unit/** от этапа интеграции.

3 ответов


извините, нет никакого способа сделать это, имхо даже с некоторым взломом в виду. Концепция заключается в том, что существует только один целевой каталог для скомпилированных классов и один для скомпилированных тестовых классов (даже <build> схема тегов предоставляет это). Честно говоря, я не думаю, что это возможно с Maven. Maven повышает прямую, чистую и разборчивую конструкцию вашего применения, путем использование хорошо произведенных модулей.

Если думаете, что вы действительно хотите сделать, это создать интеграционные тесты модуль. На самом деле это обычная практика. До сих пор у меня всегда был отдельный модуль тестирования интеграции и никогда не было проблем с этим. Конечно, вы должны зависеть от всех необходимых модулей для выполнения этих тестов. Вы даже можете зависеть от тестовых классов другого модуля, используя <type>test-jar</type> с объявлением зависимости, как указано здесь:

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

мне не нравится этот метод, и, как правило, предпочитают имейте отдельный модуль с поддержкой тестирования, например, базовые классы для тестовых случаев JUnit и т. д.


на основе того, что вы написали, похоже, что вы неправильно назвали свои интеграционные тесты и не использовали maven-отказоустойчивый-плагин для интеграционных тестов. На основе конвенции maven-отказоустойчивый-плагин вы должны назвать свои интеграционные тесты, как *IT.java. Если вы назвали свои интеграционные тесты соответствующим образом, вы можете справиться с этим с более или менее такой конфигурацией:

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

с вышеуказанным возможно держать интеграционные тесты в рамках одного модуля. Но это не решит проблему наличия скомпилированных классов интеграционных тестов в отдельной папке.

иногда лучше иметь отдельный модуль интеграционного теста, который содержит только интеграционные тесты (что приводит к созданию многомодульной сборки). Если вы хотите оставить соглашения Maven, вы можете попробовать настроить maven-compiler-plugin для использования другого выходного пути (например. target/integration-tests/classes), что не думаю, что будет на самом деле работа.


Если вы хотите изменить только исходную папку модульного теста (а не добавить дополнительную), просто измените testSourceDirectory элемент:

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

это полезно, если все ваши модульные тесты написаны в groovy. (Но вам также нужно будет настроить maven для компиляции вашего кода groovy - см. groovy-eclipse-maven-плагин или build-helper-maven-плагин.)