2012-07-24 29 views
2

我有一个模块项目,它有一些需要外部硬件设备的单元测试。除非我指出设备可用,否则我不希望这些测试执行。通过传递命令行开关来启用某些Maven测试

我觉得这是可以解决的使用Maven属性和SureFire排除/包含配置,但我不知道该怎么做。 A similar question显示了如何根据Maven属性禁用/启用项目中的所有测试,但并未完全回答我的问题。总之,我想确定一个描述我不想运行的测试的模式(例如**/*ResourceTest.java),除非我通过一个Maven属性来启用它们。

E.g.

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

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

在此先感谢。

修改为删除“资源”一词的误导性用法,替换为“硬件设备”)。

回答

1

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

正确的方法

使用配置文件管理和神火配置包容的混合/ exlcusion才是正道。

你应该问自己为什么你想激活一些测试依赖资源。资源应该始终在你的类路径中。

如果不是,您可能只是想手动激活一些测试,出于一些棘手的原因。在这种情况下,认为这是一个坏的使用Maven的(你会怎样自动执行,例如远程服务器上?)

你问什么

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

这个例子将会触发配置文件,当生成的文件目标/ 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

希望这将有助于。 不要犹豫与你自己的理由(甚至遗留代码;)来挑战我的观点)或经验

+0

我对“资源”一词的使用非常不幸。我将编辑我原来的问题,希望能解释我的意思。我仍然可以使用你的答案来解决我的问题(尽管你的具体例子现在将是多余的 - 对不起)。 – 2012-07-24 11:08:48

+0

是的,配置文件显然是我的问题的答案。我会将您的答案标记为已接受,但我也会发布一个完整的答案,显示它在我的POM中的工作原理。 (仅供参考 - 背景是我为一家生产硬件产品的公司工作,每个与我们合作的项目都需要我们的产品,因此许多单元测试假设存在硬件)。 – 2012-07-24 11:21:41

+0

@DuncanJones好了,现在已经很清楚了,你的理由听起来不错,可以触发这样的测试。谢谢 :)。我在等你,这个主题很有意思! – 2012-07-24 13:07:48

2

您也可以只使用JUnit的Assume方法来决定(测试中)如果一个测试应该被执行或跳过。

恕我直言,最好的选择是'声明'设备依赖测试是“集成测试”,并让他们执行Maven Failsafe Plugin。我认为这将是“内置”的Maven解决方案,没有任何配置文件“魔术”。

+0

这对知道有用。我将等待看看是否可以使用纯粹的Maven配置来实现我的目标。但如果没有这个,很明显这也会奏效,谢谢。 – 2012-07-24 11:13:52

+0

如果给出了运行测试的个人先决条件,那么您可以在每次测试中确定好处。尽管如此,它只能在特殊情况下跳过测试。 – FrVaBe 2012-07-24 11:21:55

+2

@Duncan Jones刚刚有想法,您的设备相关测试是集成测试,应该由故障安全插件运行并更新我的答案。 – FrVaBe 2012-07-24 12:19:25

0

为了扩大对@让 - 雷米的回答,我已经做了我的项目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> 

这将创建两个配置文件,默认配置文件将排除的设备测试,而“设备配置文件”将执行所有测试。可以执行mvn -Ddevice=true test

相关问题