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

通过传递命令行开关来启用某些Maven测试,maven,surefire,Maven,Surefire,我有一个单模块项目,其中包含一些需要外部硬件设备的单元测试。我不希望执行这些测试,除非我指示设备可用 我觉得使用Maven属性和SureFire排除/包含配置可以解决这个问题,但我不太明白如何做到这一点。A展示了如何基于Maven属性禁用/启用项目中的所有测试,但没有完全回答我的问题 总之,我希望确定一个模式(例如,***ResourceTest.java),该模式描述我不想运行的测试,除非我传递Maven属性以启用它们 例如 mvn clean install(运行标准测试,但跳过与设备相关的

我有一个单模块项目,其中包含一些需要外部硬件设备的单元测试。我不希望执行这些测试,除非我指示设备可用

我觉得使用Maven属性和SureFire排除/包含配置可以解决这个问题,但我不太明白如何做到这一点。A展示了如何基于Maven属性禁用/启用项目中的所有测试,但没有完全回答我的问题

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

例如

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

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

提前谢谢


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

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

正确的方法

混合使用概要文件管理和Surefire配置包含/扩展是正确的方法

您应该问问自己,为什么要激活一些依赖于资源的测试。资源应该始终位于类路径中

如果不是,您可能只是想手动激活一些测试,因为有些棘手的原因。在这种情况下,认为这是一个糟糕的使用Maven(您将如何自动在远程服务器上)?< /P> 你问的问题

如果您真的想这样做,因为您有一些我们不知道的好理由,请使用以下方法:

当生成的文件target/generated sources/axistools/wsdl2java/org/apache/maven丢失时,此示例将触发概要文件

Maven官方文件中的示例:


希望这会有所帮助。
请毫不犹豫地用您自己的理由(甚至是遗留代码)或经验来质疑我的观点

您也可以使用JUnit方法来决定(在测试内部)是执行测试还是跳过测试


然而,IMHO的最佳选择是将依赖于设备的测试“声明”为“集成测试”,并让用户执行这些测试。我认为这将是一个“内置”maven解决方案,没有任何配置文件“魔力”。

为了扩展@Jean-Ré我的答案,我在我的项目POM文件中做了以下工作:


org.apache.maven.plugins
maven surefire插件
2.12
${tests.to.skip}
默认配置文件
真的
**/*DeviceTest.java
设备配置文件
装置
真的
没有什么

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


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

我使用“资源”这个词是非常不幸的。我将编辑我的原始问题,希望能解释我的意思。我可能仍然能够使用你的答案来解决我的问题(尽管你的具体例子现在是多余的-对不起)。是的,配置文件显然是我问题的答案。我会将你的答案标记为已接受,但我也会发布一个完整的答案,说明它在我的POM中是如何工作的。(仅供参考-背景是我在一家生产硬件产品的公司工作。我们所从事的每个项目都需要我们的产品,因此许多单元测试都假设硬件的存在)。@DuncanJones好的,现在很清楚了,你的理由听起来很好,可以触发这样的测试。谢谢:)。我在等你,这个主题很有趣!!了解这一点很有用。我将等待,看看我是否可以使用纯Maven配置来实现我的目标。但是如果做不到这一点,很明显这也会起作用,谢谢。它的好处是,如果给定了运行测试的单个先决条件,您可以在每个测试中决定。不过,只有在例外情况下才应该跳过测试。@Duncan Jones刚刚想到,您的设备相关测试是集成测试,应该由故障保护插件运行,并更新我的答案。这是一个很好的建议,我认为我们将在下一个项目中使用它。至于现在,我将把公认的答案留给Jean-Rémy,因为它最直接地回应了我的要求。