如果 Maven Surefire 插件中有参数,则跳过 E2E 测试

If argument in maven Surefire plugin, skip E2E tests

我似乎在这方面找不到任何东西,但我很好奇我是否可以在运行时传递一个参数来跳过我们所有项目的 E2E 测试。

我是否可以在下面的 pom 示例中执行类似隔离排除块的操作?

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-surefire-plugin</artifactId>
   <configuration>
      <argLine>${argLine}</argLine>
      <excludes>

         <exclude unless="${skip.E2E.tests}> **/*E2E*.java</exclude>

         <exclude>**/IT*.java</exclude>
      </excludes>
   </configuration>
</plugin>

那我就可以打电话给mvn clean install -Dskip.E2E.tests=true了。有人见过这样的东西吗?

我想我可以做类似...

<exclude>${name.of.tests.to.exclude}</exclude>

然后 mvn clean install -Dname.of.tests.to.exclude=**/*E2E*.java 但我更愿意设置一个简单的 true 或 false 参数而不是这个,以防我想跳过的一些测试不包括 E2E,我需要将它们添加到一个列表。

很难仅从您正在显示的 pom 片段中判断出来,但看起来您在单元和 e2e 测试中都使用了 surefire。相反,您应该考虑使用 failsafe e2e 插件。

一个好处是 e2e 测试将 运行 在不同的阶段进行,因此您可以获得默认情况下正在寻找的行为。在项目构建的验证阶段,它们是 运行。因此,您只能 运行 mvn test 到 运行 单元测试。

您可以像这样配置项目以使用 fail-safe:

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <version>2.19.1</version>
        <executions>
          <execution>
            <goals>
              <goal>integration-test</goal>
              <goal>verify</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

运行 他们使用:mvn verify

运行ning mvn install -DskipITs 将仅跳过集成测试,同时仍然 运行ning 单元测试。

并且 运行ning mvn install -DskipTests 将跳过集成和单元测试。

如果你想实现这样的条件,你可以使用 Maven profiles 并且有两个配置:

  • 作为正常构建的一部分的默认测试,不跳过 E2E 测试
  • 异形跳过他们

然后可以在 属性 或直接激活时激活配置文件。

例如,您可以:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <argLine>${argLine}</argLine>
                <excludes>
                    <exclude>**/IT*.java</exclude>
                </excludes>
            </configuration>
        </plugin>
    </plugins>
</build>

<profiles>
    <profile>
        <id>skip.E2E.tests</id>
        <activation>
            <property>
                <name>skip.E2E.tests</name>
                <value>true</value>
            </property>
        </activation>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <configuration>
                        <argLine>${argLine}</argLine>
                        <excludes>
                            <exclude>**/*E2E*.java</exclude>
                            <exclude>**/IT*.java</exclude>
                        </excludes>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

注意:默认的 Maven Surefire 插件适用于正常构建,然后是配置文件。

运行:

mvn clean install

不会激活配置文件,您的构建将跳过测试。而 运行:

mvn clean install -Pskip.E2E.tests

mvn clean install -Dskip.E2E.tests=true

将激活配置文件并因此将排除项添加到测试执行中。

我想这正是您正在寻找的场景。


或者,正如@AndrewEisenberg 在另一个答案中所建议的那样,您可以使用 Maven Failsafe Plugin 进行不同类型的测试。主要的两个区别是:它具有不同的相位绑定,并且当它失败时,它以更安全的方式进行。来自官方文档:

If you use the Surefire Plugin for running tests, then when you have a test failure, the build will stop at the integration-test phase and your integration test environment will not have been torn down correctly.

The Failsafe Plugin is used during the integration-test and verify phases of the build lifecycle to execute the integration tests of an application. The Failsafe Plugin will not fail the build during the integration-test phase, thus enabling the post-integration-test phase to execute