如何将另一个测试源文件夹添加到Maven并将其编译到单独的文件夹?

我有src/test/java的默认src/test/java文件夹。 单独的文件夹src/integration/java可用于集成测试。

我配置了maven-surefire-plugin来执行各自阶段的单元/集成测试。 当编译的类位于正确的目录中时,这非常有用。 不幸的是,Maven只支持一个测试源文件夹和一个测试输出文件夹。

使用mavens build-helper插件,我可以添加另一个测试源文件夹,但编译后的类将生成到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/**

对不起,没有办法做到这一点,恕我直言,即使有一些黑客入侵。 这个概念是,编译的类只有一个目标目录,而编译的测试类只有一个目标目录(甚至标签模式暴露了这个)。 说实话,我真的不认为Maven应该可行。 Maven通过使用精心设计的模块,促进您的应用程序的直接,干净和清晰的设计。

如果认为你真正想要做的是实际创建集成测试模块。 事实上,这是常见的做法。 到目前为止,我总是有单独的集成测试模块,从来没有遇到过问题。 您当然应该依赖于运行这些测试所需的所有模块。 您可以使用test-jar和依赖声明来依赖其他模块的测试类,如下所述:

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

但是,我不喜欢这种方法,并且通常更喜欢单独的模块和测试支持的东西,比如JUnit测试用例的基类等。

基于您所编写的内容,听起来您没有正确命名集成测试,并且您没有使用maven-failsafe-plugin进行集成测试。 根据maven-failsafe-plugin的惯例,您应该将您的集成测试命名为*IT.java 。 如果您恰当地命名了集成测试,则可以使用或多或少的配置来处理它,如下所示:

  [...]  [...]  org.codehaus.mojo build-helper-maven-plugin 1.9.1   add-test-source generate-test-sources  add-test-source    src/integration/java      [...]  [...]  

通过上述内容,可以将集成测试保存在同一模块中。 但这并不能解决将已编译的集成测试类放入单独的文件夹的想法。

有时最好有一个单独的集成测试模块,它只包含集成测试(导致多模块构建)。 如果您希望保留Maven的约定,您可以尝试配置maven-compiler-plugin以使用不同的输出路径(例如, target/integration-tests/classes ),这些路径认为不会真正起作用。

如果您只想更改unit testing源文件夹(而不是添加另一个),只需更改testSourceDirectory元素:

  ${project.basedir}/src/test/groovy 

如果所有unit testing都是用groovy编写的,那么这很有用。 (但是你也需要配置maven来编译你的groovy代码 – 参见groovy-eclipse-maven-plugin或build-helper-maven-plugin 。)