将带有集成测试的maven模块从测试阶段排除

将带有集成测试的maven模块从测试阶段排除,maven,integration-testing,Maven,Integration Testing,我有一个带结构的多模块maven项目 parent pom.xml module pom.xml core-api pom.xml integ-tests pom.xml 我有maven surefire插件设置,用于执行单元测试“*Test.java”,它位于“核心api”模块中 我们在一个单独的“integ tests”模块中进行了长期运行缓慢的集成测试。我们也使用“*Test.java”进行整数测试 我们需要能够编译所有源代码,但希望排除作为默认maven

我有一个带结构的多模块maven项目

parent
  pom.xml
module
  pom.xml
  core-api
    pom.xml
  integ-tests
    pom.xml
我有maven surefire插件设置,用于执行单元测试“*Test.java”,它位于“核心api”模块中

我们在一个单独的“integ tests”模块中进行了长期运行缓慢的集成测试。我们也使用“*Test.java”进行整数测试


我们需要能够编译所有源代码,但希望排除作为默认maven“测试”阶段的一部分运行的“integ测试”。我们计划使用概要文件来启用“integ test”模块的测试阶段。我不想使用“故障保护”插件

这里有一个矩阵概述了组合

mvn              | core           | integ-test
test             | run unit tests | exclude
test -PintegTest | unit tests     | integ tests 
我已经在我的父pom中定义了surefire插件,它具有一个属性“skip.integ.tests”,该属性将通过一个profile'-PintegTests'控制

<properties>
  <skip.integ.tests>true</skip.integ.tests>
</properties>
..
<build>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
  </plugin>
</build>
..
<profiles>
  <profile>
    <id>integTests</id>
    <properties>
      <skip.integ.tests>false</skip.integ.tests>
    </properties>
  </profile>
</profiles>

真的
..
org.apache.maven.plugins
maven surefire插件
..
完整性测试
假的
在我的'integ test'pom中,我随后重写了'maven surefire plugin'配置,并设置了'skipTests'配置以查看属性的值

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-plugin</artifactId>
      <configuration>
        <skipTests>${skip.integ.tests}</skipTests>
      </configuration>
    </plugin>
  </plugins>
</build>

org.apache.maven.plugins
maven surefire插件
${skip.integ.tests}

我的问题是integ测试模块测试在任何情况下都会运行。关于我的设置哪里出了问题,你有什么想法吗?

首先,你应该根据打算运行集成测试的名称来命名你的集成测试。此外,集成前测试集成测试集成后测试旨在运行这些测试。这意味着在您的情况下,要根据如下文档配置maven failsafe插件。maven故障保护插件进入集成测试生命周期阶段


[...]
org.apache.maven.plugins
maven故障保护插件
2.16
集成测试
验证
[...]
我建议将以下配置文件添加到集成测试模块中,如下所示:


运行
org.apache.maven.plugins
maven故障保护插件
2.16
集成测试
验证
这仅为您提供以下选项:

  • mvn测试

    仅运行单元测试

  • mvn-DskipTests=true测试

    运行编译等,但没有单元测试

  • mvn-删除其验证

    运行封装等单元测试和集成测试

  • mvn安装

    在没有集成测试的情况下运行安装

  • mvn-DskipTests=true安装

    在不运行单元测试或集成测试的情况下运行安装


在Maven构建中,您可以排除:

  • 通过添加
    -Dmaven.skip.test=true
  • 通过
    -DskipTests
  • 通过
    -DskipITs
相反,如果您将集成测试放在单独的Maven模块中(即,在您的案例中是integ测试),则可以通过概要文件直接将其从Maven构建中排除,如下面的示例所示——请参阅aggregator的pom.xml摘录和要启动的Maven命令行:

<modules>
  <!-- remove 'integ-test' from this list -->
</modules>
<profiles>
    <profile><id>build-it</id>
        <activation><activeByDefault>true</activeByDefault></activation>
        <modules><module>integ-test</module></modules>
    </profile>
</profiles>

建造它
真的
积分检验

然后
mvn安装-p!构建它

谢谢,我确实听到了你的声音,但我明确表示,我不能将故障保护作为解决方案的一部分。我所处的情况是,我们有一些脆弱的集成测试,但我们不能允许集成测试无法阻止发布,因此我需要一些变通方法,在这种情况下,集成测试只在我确切地告诉您的特定环境中运行。如果激活了概要文件
,则在运行集成测试的地方运行它的
,否则它们不会运行。(参见mod it中的完整示例)。“我不想使用‘故障保护’插件。”。为什么不呢?它以一种更简单的方式做你想做的事情。只需将集成测试命名为FooITs,然后就可以使用-DskipITs来禁用它们。(或者,如果您坚持使用配置文件,请使用设置等效属性的配置文件)相关: