将maven-surefire-plugin限制为特定测试源根目录

iezvtpos  于 2022-12-29  发布在  Maven
关注(0)|答案(2)|浏览(202)

给定一个具有多个测试源根的Maven模块,我们如何限制maven-surefire-plugin仅从一个特定根运行测试?
用例如下所示:我希望有多个测试目录,并根据maven配置文件选择它们,例如-P only-tests-in-directory-A-P only-tests-in-directory-B
我知道includeexclude配置选项,但是它们只对包/类名起作用,这不是很好,因为在所有的测试根中,测试可能被类似地命名。
还有一个testSourceDirectory配置选项,但根据文档,它仅与testNG报告相关。

ippsafx7

ippsafx71#

在Maven中最重要的事情是在配置上遵循约定。这意味着将集成测试命名为*IT.java,而不是其他名称。如果您有一个单一的模块设置,它们属于同一个模块,如果您有多个模块设置,有时为集成测试提供一个单独的模块是有意义的。
此外,这意味着集成测试必须由maven-failsafe-plugin执行,maven-failsafe-plugin必须通过如下方式激活:

<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <executions>
      <execution>
        <goals>
          <goal>integration-test</goal>
          <goal>verify</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
</plugins>

当然,有必要通过pom文件或公共父文件中的适当pluginManagement部分定义插件版本。
插件管理配置可能如下所示:

<plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-plugin</artifactId>
      <version>3.0.0-M7</version>
      <configuration>
        <skipTests>${skipUTs}</skipTests>
      </configuration>
    </plugin>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-failsafe-plugin</artifactId>
      <version>3.0.0-M7</version>
      <configuration>
        <skipTests>${skipITs}</skipTests>
      </configuration>
    </plugin>

通过以下方式组合给予运行单元测试的机会:

mvn test

如果您还想运行集成测试(包括单元测试):

mvn verify

有时候在发布期间运行集成测试是有意义的而不是,这可以简单地通过使用来实现(有时候人们使用概要文件来做这样的事情):

mvn verfiy -DskipITs

为了能够运行补充测试(不管我们怎么称呼它们),你可以通过测试套件来完成,这需要JUnit Jupiter中的如下依赖项:

<dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.junit</groupId>
        <artifactId>junit-bom</artifactId>
        <version>5.9.1</version>
        <scope>import</scope>
        <type>pom</type>
      </dependency>
    ....
    </dependencies>
  </dependencyManagement>

实际上使用了以下依赖项(是的,您需要这两个依赖项):

<dependencies>
    <dependency>
      <groupId>org.junit.platform</groupId>
      <artifactId>junit-platform-suite-engine</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-engine</artifactId>
      <scope>test</scope>
    </dependency>

您可以定义如下所示的测试套件:

import org.junit.platform.suite.api.IncludeClassNamePatterns;
import org.junit.platform.suite.api.SelectPackages;
import org.junit.platform.suite.api.Suite;
import org.junit.platform.suite.api.SuiteDisplayName;

@Suite
@SuiteDisplayName("Suite Demo - First Suite")
@SelectPackages("packageName.suite1")
@IncludeClassNamePatterns(".*SD")
class FirstSuite {

}

通过使用一个特定的软件包,比如你的系统集成测试第一部分等,这些测试将被包括在那里...这里的命名模式是由注解*.*SD定义的,或者是你喜欢的任何命名模式(但是要小心不要干扰到surefire/failsafe插件的常用模式)
特定套件类可能如下所示:

class SuiteOneSD {

  @Test
  void first_add() {
    Fraction sum1 = new Fraction(5);
    Fraction sum2 = new Fraction(2);

    assertThat(sum1.add(sum2)).isEqualTo(new Fraction(7));
  }

您可以通过以下命令行激活套件:

mvn test -Dtest=FirstSuite

这将仅限于那些由FirstSuite定义的测试。如果您想将这些套件与您的单元测试组合在一起,您可以简单地通过以下方式进行(注意引用是必要的):

mvn test -Dtest='FirstSuite,*Test'

您也可以在不同的阶段执行套件(在集成测试时)。这将执行包括套件的单元测试。

mvn verify -Dit.test='FirstSuite'

如果要将套件与常规集成测试组合在一起:

mvn verify -Dit.test='FirstSuite,*IT'

给定的属性使您有机会控制是否运行单元测试和/或集成测试:

mvn verify -DskipUTs

将仅运行集成测试,而不运行单元测试。

mvn verify -DskipITs

将仅运行单元测试,而不运行集成测试。
所有这些都没有任何配置文件,也没有单独的测试源目录等。

v1uwarro

v1uwarro2#

我认为@khmarbaise的问题是非常相关的。OP,你应该考虑你的项目结构的复杂性。为什么你有多个测试源根而不仅仅是多个包?你是想把IT和其他测试分开还是什么?
无论如何,您可以使用Build Helper插件的add-test-source目标:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>build-helper-maven-plugin</artifactId>
  <version>3.3.0</version>
  <executions>
    <execution>
      <goals>
        <goal>add-test-source</goal>
      </goals>
      <configuration>
        <sources>
          <source>src/it/java</source>
        </sources>
      </configuration>
    </execution>
  </executions>
</plugin>

您还可以使用add-test-resource目标来添加资源。
更多关于插件的信息:https://www.mojohaus.org/build-helper-maven-plugin/
希望这有帮助!

相关问题