2012-07-24 38 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

相關問題