我看到工作的唯一可能的方式是有多個<test>
元素的實例。
問題在於,您必須爲每個<test>
元素指定要運行的方法。我創建了一個測試類,它有一個靜態初始化器和兩個測試。用下面的<junit>
任務我可以做你想做的:
<junit fork="yes">
<classpath>
<path refid="classpath" />
</classpath>
<formatter type="xml"/>
<test name="TestSimple" methods="testOne" toDir="firstRun" />
<test name="TestSimple" methods="testTwo" toDir="secondRun" />
</junit>
從我從構建日誌中獲取的,很明顯,他們在兩個不同的JVM運行:
test:
...
[junit] Executing 'C:\Program Files\Java\jdk1.7.0_25\jre\bin\java.exe' with arguments:
[junit] '-classpath'
...
[junit] 'org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner'
[junit] 'TestSimple'
[junit] 'methods=testOne'
...
[junit] Executing 'C:\Program Files\Java\jdk1.7.0_25\jre\bin\java.exe' with arguments:
[junit] '-classpath'
...
[junit] 'org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner'
[junit] 'TestSimple'
[junit] 'methods=testTwo'
...
[junit] Test TestSimple FAILED
我還看到我在每個測試報告中放入靜態初始化程序的System.out
聲明。
這裏重要的細節是,你必須讓每個<test>
標籤重定向他們的報告到不同的目錄,使用屬性toDir
或更改使用屬性outfile
輸出文件的名稱。這是因爲報告文件名稱使用類的名稱而不是您正在運行的方法。這意味着第二次運行將覆蓋第一次運行的報告。
在您的具體情況中,您可以使用<batchtest>
來測試可以在同一個JVM中正常運行的測試,並添加<exclude>
標記以避免運行有問題的測試。然後爲每個有問題的測試添加一個特定的<test>
標籤。
他們這樣做是因爲methods
屬性專門設計用於重新運行特定方法或單獨運行速度太慢的測試。從documentation:
的方法可以歸因於以下情況下是有用的:
- 的測試方法已經失敗,要重新運行測試方法 測試修復或再在沒有 的情況下運行Java調試器下的測試,以等待其他(可能是長時間運行的)測試方法完成,以完成 。
- 一個或多個測試方法是運行速度低於預期 和你想要一個Java剖析下重新運行它們(不 開銷運行探查,而其他測試方法正在 執行的)。
不過個人,並從遇到同樣的問題,因爲你之前,靜態初始化吸一個人來了!我會竭盡全力儘快擺脫它們。並且引用@PeterNiederwieser,爲每組測試設置一個新的JVM將會讓你的測試套件運行非常慢!
有什麼特別的原因嗎?只是想,如果可以有一個解決方案,取決於你需要什麼樣的新虛擬機需求... – anishthecoder
@anishthecoder我的測試方法是使用一些合作者使用靜態的東西,我希望在每種方法上清除靜態的東西。實際上,我面臨的一個問題是,測試在當地環境中通過並且在生產中失敗。 –
看看這是否有幫助[Java:如何「重新啓動」一個靜態類?](http://stackoverflow.com/questions/4631565/java-how-to-restart-a-static-class) – anishthecoder