maven-surefire-plugin include/exclude precedence

当使用 maven-surefire-plugin 并且包含和排除时,它们的处理顺序是什么?此外,如果您有 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

----更新-----

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

        <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” 添加到配置文件配置的元素中,并提供两个配置文件,则:<includes>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>

但是,现在每个文件都同时指定为 an 和 an ,会发生什么情况?<include><exclude>

----更新 2 ----

实际运行具有以下配置的生成:

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

运行 TestA,因此它似乎是一个意志压倒了 .请注意,为了完整起见,我确实颠倒了顺序,并在<包括>之前放置了<排除>但行为没有改变。如果有人能找到源代码以外的某个地方来概述这种行为,我很乐意给他们答案......<exclude><include>


答案 1

我找不到关于surefire插件的官方文档,但实际上,排除-覆盖-包含是一种常见的方法,Maven也将其应用于其他类似的上下文中,例如资源。

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

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

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

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

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


答案 2

您是否尝试过使用 JUnit 类别

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


推荐