2013-10-11 23 views
3

我有一個Ant構建文件,它使用junit的batchtest來測試所有測試類。使用Ant中的JUnit在單獨的VM中運行<batchtest>的每個測試

假設我有一類

class MyTest{ 
    @BeforeClass 
    public static void setUpBeforeClass(){ 
     //some stuff 
    } 

    @Test 
    public void test1(){ 
    } 

    @Test 
    public void test2(){ 
    } 
} 

我知道JUnit的創建MyTest類每個測試方法的新實例,但我想要的是一個新的虛擬機應該爲每個測試方法創建。我希望每個測試方法在單獨的虛擬機中朗姆酒,並希望類加載程序爲每種測試方法再次加載MyTest。那可能嗎?

我曾嘗試閱讀文檔,並試圖此解決方案:

<junit fork="yes" reloading="true" forkmode="perTest"> 
    <batchtest> 
    </batchtest> 
</junit> 

但是,即使使用這些選項的每一個我的測試方法setUpBeforeClass方法被調用一次後。難道我做錯了什麼?

編輯:

爲什麼我要這麼做?

我的測試方法正在使用一些使用static東西的合作者,我希望static東西能夠在每種方法上清除。實際上,我面臨的一個問題是測試在本地環境中通過並且在生產中失敗

+0

有什麼特別的原因嗎?只是想,如果可以有一個解決方案,取決於你需要什麼樣的新虛擬機需求... – anishthecoder

+1

@anishthecoder我的測試方法是使用一些合作者使用靜態的東西,我希望在每種方法上清除靜態的東西。實際上,我面臨的一個問題是,測試在當地環境中通過並且在生產中失敗。 –

+0

看看這是否有幫助[Java:如何「重新啓動」一個靜態類?](http://stackoverflow.com/questions/4631565/java-how-to-restart-a-static-class) – anishthecoder

回答

0

我看到工作的唯一可能的方式是有多個<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將會讓你的測試套件運行非常慢!

相關問題