通过命令行开关启用某些Maven测试

时间:2012-07-24 09:45:24

标签: maven surefire

我有一个单个模块项目,它有一些需要外部硬件设备的单元测试。除非我指出设备可用,否则我不希望执行这些测试。

我觉得这可以使用Maven属性和SureFire排除/包含配置来解决,但我不太清楚如何做到这一点。 similar question显示如何基于Maven属性禁用/启用项目中的所有测试,但不能完全回答我的问题。

总之,我希望确定一个描述我不想运行的测试的模式(例如**/*ResourceTest.java),除非我传递一个Maven属性来启用它们。

E.g。

mvn clean install运行标准测试,但跳过与设备相关的测试

mvn -Drun.device.tests=true clean install运行所有测试

提前致谢。

编辑删除“资源”一词的误导用法>替换为“硬件设备”)。

3 个答案:

答案 0 :(得分:2)

您也可以使用JUnit Assume方法来决定(在测试中)是否应该执行或跳过测试。

然而,最好的选择是IMHO将“声明”设备依赖测试为“集成测试”并让它们由Maven Failsafe Plugin执行。我认为这将是“内置”maven解决方案,没有任何简介'魔术'。

答案 1 :(得分:1)

您提供的链接给出了良好的答案。

正确的方式

使用Profile Management和Surefire配置混合包含/ exlcusion是正确的方法。

您应该问自己为什么要根据资源激活某些测试。资源应始终位于类路径中。

如果没有,您可能只是想手动激活一些测试,原因有些棘手。在这种情况下,请考虑这是Maven的一个坏用途(例如,如何在远程服务器上自动执行该操作?)

您提出的问题

如果你真的想这样做,因为你有一些我们不知道的好理由,只需使用它:

当生成的文件target / generated-sources / axistools / wsdl2java / org / apache / maven缺失时,此示例将触发配置文件。

来自Maven官方文档的示例:http://maven.apache.org/guides/introduction/introduction-to-profiles.html

<profiles>
  <profile>
    <activation>
      <file>
        <missing>target/generated-sources/axistools/wsdl2java/org/apache/maven</missing>
      </file>
    </activation>
    ...
  </profile>
</profiles>
  

从Maven 2.0.9开始,标签可以进行插值。支持的变量是系统属性,如$ {user.home}和环境变量,如$ {env.HOME}。请注意,POM本身定义的属性和值不能用于插值,例如上面的示例激活器不能使用$ {project.build.directory},但需要对路径目标进行硬编码。

您可以在此处找到更多信息:http://www.sonatype.com/books/mvnref-book/reference/profiles-sect-activation.html

希望这会有所帮助。 不要犹豫,用你自己的理由(甚至遗留代码;)或体验来挑战我的观点

答案 2 :(得分:0)

要扩展@ Jean-Rémy答案,我在项目POM文件中完成了以下操作:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-plugin</artifactId>
      <version>2.12</version>
      <configuration>
        <excludes>
          <exclude>${tests.to.skip}</exclude>
        </excludes>
      </configuration>
    </plugin>
  </plugins>
</build>

<profiles>
  <profile>
    <!-- This profile will be used when running tests without a device -->
    <id>default-profile</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
      <tests.to.skip>**/*DeviceTest.java</tests.to.skip>
    </properties>
  </profile>

  <profile>
    <id>device-profile</id>
    <activation>
      <property>
        <name>device</name>
        <value>true</value>
      </property>
    </activation>
    <properties>
      <!-- Unsure how to match nothing -->
      <tests.to.skip>NOTHING</tests.to.skip>
    </properties>
  </profile>

这会创建两个配置文件,默认配置文件将排除设备测试,而“device-profile”将执行所有测试。

要执行设备配置文件,可以执行mvn -Ddevice=true test