【问题标题】:Howto add another test source folder to Maven and compile it to a separate folder?如何将另一个测试源文件夹添加到 Maven 并将其编译到单独的文件夹中?
【发布时间】:2012-04-25 16:24:19
【问题描述】:

我有默认的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 模块中。

标签: java maven maven-surefire-plugin


【解决方案1】:

抱歉,即使考虑进行一些黑客攻击,也无法做到这一点。这里的概念是编译类只有一个目标目录,编译测试类只有一个目标目录(即使是单个<build> 标签也暴露了这一点)。老实说,我真的不认为 Maven 应该有可能。 Maven 通过使用精心设计的模块来促进应用程序的直接、干净和易读的设计。

我认为您真正想做的实际上是创建集成测试模块。顺便说一句,这是常见的做法。到目前为止,我一直有单独的集成测试模块,从来没有遇到过任何问题。您应该依赖于运行这些测试所需的所有模块。您甚至可以通过在依赖声明中使用<type>test-jar</type> 来依赖其他模块的测试类,如下所述:

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

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

【讨论】:

【解决方案2】:

根据您编写的内容,您似乎没有正确命名集成测试,也没有使用 maven-failsafe-plugin 进行集成测试。根据maven-failsafe-plugin 的约定,您应该将集成测试命名为*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),这认为它不会真正起作用。

【讨论】:

  • 这对我有用,但前提是我将其设置为 &lt;phase&gt;validate&lt;/phase&gt;
【解决方案3】:

如果您只想更改单元测试源文件夹(而不是添加一个额外的),只需更改testSourceDirectory 元素:

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

如果您的所有单元测试都是用 groovy 编写的,这很有用。 (但您还需要配置 maven 来编译您的 groovy 代码 - 请参阅 groovy-eclipse-maven-pluginbuild-helper-maven-plugin。)

【讨论】:

    【解决方案4】:

    我无法创建多个测试源文件并让代码在 Eclipse 中运行。我确实理解为什么需要多个测试源文件夹的原因有很多,包括以下内容

    • 测试应该与正在测试的代码在同一个包中
    • 在任何重要的应用程序中都应包含多种类型的自动化测试,包括单元测试、集成测试、外部资源测试、服务、库等。
    • 我们经常继承运行时间很长的代码库,其中混合了需要清理的好测试和坏测试/危险测试。如果我们可以保留这些测试,同时我们可以剔除它们并建立我们新的自动化测试基础,同时仍然能够单独运行旧测试或新测试(作为单独的测试和运行所有测试的能力),那就太好了每个类别的测试一次)
    • 不同类型的测试需要在不同的时间运行(例如代码签入、夜间构建、长时间运行的测试等),具体取决于运行测试所需的资源。在大型项目中,通过命名约定进行管理会变得非常混乱
    • 测试需要与生产代码分开(即我们不希望将测试类部署为生产版本的一部分)。
    • 测试通常需要额外的代码来自动化那些不应该部署到生产环境的过程(例如,实现非平凡过程以获取资源的类,例如从服务或数据库中的数据构建复杂的数据结构)

    对此我的解决方案是创建一个新项目,然后根据此处编写的内容在新项目中创建多个源文件夹(不是测试源文件夹):https://www.baeldung.com/maven-project-multiple-src-directories

    这满足上面列出的所有要求。

    我热切地等待您的叮当,但请务必让我们知道这方面的不利之处。证明我错了;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-21
      • 1970-01-01
      • 1970-01-01
      • 2020-02-19
      • 1970-01-01
      • 1970-01-01
      • 2011-09-26
      相关资源
      最近更新 更多