maven-surefire-plugin 包含/排除优先级

Posted

技术标签:

【中文标题】maven-surefire-plugin 包含/排除优先级【英文标题】:maven-surefire-plugin include/exclude precedence 【发布时间】:2012-08-11 03:39:44 【问题描述】:

当使用 maven-surefire-plugin 并同时包含和排除时,它们的处理顺序是什么?此外,如果您有 3 组测试,第 1 组是基本组,第 2 组和第 3 组是特殊情况,您可以使用配置文件进一步包含/排除吗?配置文件包含/排除设置将如何合并?例如,我想做这样的事情:

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.12.2</version>
        <configuration>
          <excludes>
            <exclude>/org/mycompany/dataset/test/ExtractProd*.java</exclude> <!-- requires special network connectivity -->
            <exclude>/org/mycompany/dataset/test/LargeDataset*.java</exclude> <!-- requires lengthy processing -->
          </excludes>
        </configuration>
      </plugin>
    </plugins>
  </build>

  <profiles>
    <profile>
      <id>connectedToProdNetwork</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
              <includes>
                <include>/org/mycompany/dataset/test/ExtractProd*.java</include>
              </includes>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>runForAsLongAsYouNeed</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
              <includes>
                <include>/org/mycompany/dataset/test/LargeDataset*.java</include>
              </includes>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>

然后就可以这样运行了:

mvn package -P connectedToProdNetwork

mvn package -P runForAsLongAsYouNeed

mvn package -P connectedToProdNetwork,runForAsLongAsYouNeed

---- 更新 -----

使用mvn help:effective-pom -P [profileA] 我能够确定,如果我指定一个配置文件,则生成的有效 pom 将是:

        <configuration>
          <includes>
            <include>[includeFromProfileA]</include>
          </includes>
          <excludes>
            <exclude>/org/mycompany/dataset/test/ExtractProd*.java</exclude> <!-- requires special network connectivity -->
            <exclude>/org/mycompany/dataset/test/LargeDataset*.java</exclude> <!-- requires lengthy processing -->
          </excludes>
        </configuration>

如果我提供多个配置文件,mvn help:effective-pom -P [profileA],[profileB]:

        <configuration>
          <includes>
            <include>[includeFromProfileAOrBSeeminglyArbitraryChoice]</include>
          </includes>
          <excludes>
            <exclude>/org/mycompany/dataset/test/ExtractProd*.java</exclude> <!-- requires special network connectivity -->
            <exclude>/org/mycompany/dataset/test/LargeDataset*.java</exclude> <!-- requires lengthy processing -->
          </excludes>
        </configuration>

最后,如果我将属性combine.children="append" 添加到配置文件配置的&lt;includes&gt; 元素,并提供两个配置文件mvn help:effective-pom -P [profileA],[profileB]

        <configuration>
          <includes combine.children="append">
            <include>[includeFromProfileA]</include>
            <include>[includeFromProfileB]</include>
          </includes>
          <excludes>
            <exclude>/org/mycompany/dataset/test/ExtractProd*.java</exclude> <!-- requires special network connectivity -->
            <exclude>/org/mycompany/dataset/test/LargeDataset*.java</exclude> <!-- requires lengthy processing -->
          </excludes>
        </configuration>

但是,既然每个文件都被指定为&lt;include&gt;&lt;exclude&gt;,会发生什么?

---- 更新 2 ----

实际使用此配置运行构建:

<configuration>
  <includes>
    <include>**/TestA.java</include>
  </includes>
  <excludes>
    <exclude>**/TestA.java</exclude>
  </excludes>
</configuration>

是否运行 TestA,所以看起来&lt;exclude&gt; 会压倒&lt;include&gt;请注意,为了完整起见,我确实颠倒了顺序并将&lt;excludes&gt; 放在&lt;includes&gt; 之前,但行为没有改变。 如果有人能找到概述此行为的源代码之外的地方,我很乐意给他们答案...

【问题讨论】:

排除覆盖包括,因为通常人们包括比他们需要的更大的集合,只需要取出一些。这通常会缩短列表并减少工作量。 @Steven,是的,这符合我在测试期间的经历。您是否知道这是官方声明的任何地方,以便我知道他们将来不会改变这种行为?无论如何,谢谢伙计。 我认为实验方法通常是最好的方法 :) - 仍然:pom 参考给出了一些关于订单的提示:maven.apache.org/guides/introduction/… - 例如。继承的执行首先运行。插件按 pom 的顺序使用排除/包含通常很常见。因此,您可以在排除所有内容的同时包含一些特殊内容,也可以包含所有内容并排除一些特殊内容。有疑问会遵循 pom 中的顺序(在大多数情况下和插件) 【参考方案1】:

我找不到关于 surefire 插件的官方文档,但确实 exclude-override-include 是一种常见的方法,Maven 也将其应用于其他类似的上下文中,例如资源。

唯一的官方相关信息(我发现)来自官方的 Maven POM 参考文档,here:

includes:一组文件模式,指定要作为资源包含在指定目录下的文件,使用 * 作为通配符。

excludes:与包含的结构相同,但指定要忽略的文件。 在包含和排除之间的冲突中,排除获胜

注意:我在有趣的语句中添加了最后的粗体格式。

因此,在官方 maven 插件中很可能使用相同的方法(通常,所有插件都具有 org.apache.maven.plugins groupId 和 maven- 前缀作为 artifactId)。

【讨论】:

很棒的发现...不确定我应该将其标记为答案,因为它在技术上不是确定的,但绝对是有用的信息。【参考方案2】:

您是否尝试过使用JUnit categories?

使用这种方法,您可以为测试提供许多不同的类别,并使用它而不是类名来排除/包含它们。这将是一种更可扩展的方法。

【讨论】:

以上是关于maven-surefire-plugin 包含/排除优先级的主要内容,如果未能解决你的问题,请参考以下文章

maven-surefire-plugin

maven-surefire-plugin,用于自动化测试和单元测试的

maven-surefire-plugin插件

无法加载 mojo 'test' - org.apache.maven.plugins:maven-surefire-plugin:3.0.0-M1:test

org.apache.maven.plugins:maven-surefire-plugin:2.12.4异常

maven-surefire-plugin使用