我有一个单个模块项目,它有一些需要外部硬件设备的单元测试。除非我指出设备可用,否则我不希望执行这些测试。
我觉得这可以使用Maven属性和SureFire排除/包含配置来解决,但我不太清楚如何做到这一点。 similar question显示如何基于Maven属性禁用/启用项目中的所有测试,但不能完全回答我的问题。
总之,我希望确定一个描述我不想运行的测试的模式(例如**/*ResourceTest.java
),除非我传递一个Maven属性来启用它们。
E.g。
mvn clean install
(运行标准测试,但跳过与设备相关的测试)
mvn -Drun.device.tests=true clean install
(运行所有测试)
提前致谢。
(编辑删除“资源”一词的误导用法>替换为“硬件设备”)。
答案 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
。