2012-02-16 27 views
0

我在Eclipse中編寫JUnit 3測試套件,我希望套件可以實現擴展行爲,如果它正在運行一堆附加套件,但是如果它正在單獨運行,則省略某些測試。 (明顯的例子:被測試的方法有一個註釋,其狀態字段在開發過程中將爲In_Progress,但Complete後綴。當方法被標記爲In_Progress時拋出紅色標誌的測試將會是一種麻煩,當開發人員僅測試一個類,但在測試所有類時會非常方便,可以捕獲開發人員忘記改變已完成方法狀態的情況。另一個例子:有些測試套件可用於將相關測試收集到一個簡單易用的但是如果我們在整個軟件包中運行所有測試,那麼Eclipse套件中的測試將在Eclipse訪問他們的類時運行,並且不需要在這個相關測試套件中再次運行。所以當這個套件與其他套件一起運行時,它應該是空的。)JUnit 3套件如何知道它是單獨運行還是與其他套件一起運行?

因爲這些測試全部從一個公共基類繼承,我可以設置一個static boolean,以便在初始化第二個和後續套件時知道。然而,第一個測試套件不知道其他套件是否會遵循它。

在Eclipse環境中是否有可以幫助檢測這種情況的東西?我已經嘗試將boolean初始化置於我打算首先運行的空測試套件中,但在Eclipse中,套件不一定按字母順序運行。 (我們一起運行這些測試,方法是選擇包含它們的軟件包並選擇Run -> Run As -> JUnit Test(或擊鍵或鼠標點擊以達到相同的效果)。)

回顧:第二個和後續套件可以檢測到它們處於一個多套房運行,但有一些方法的第一套房也可以弄清楚這一點嗎?或者,我可以以某種方式讓Eclipse始終按字母順序運行測試,即在所有其他測試之前選擇配置套件?

+0

我認爲可能會有一些獨立運行的套件和套件作爲整個套件的一部分運行之間的區別。但是,堆棧跟蹤是無法區分的。 – 2012-02-16 19:06:19

+0

我在Eclipse中查找JUnit測試運行器的源代碼,希望能夠在某些靜態變量中提示一些靜態變量,這些靜態變量可以使用Reflection進行挖掘和讀取。但是,它們寫得太乾淨了,關於有多少測試套件正在運行的每個提示都隱藏在實例中。 AFAIK,沒有辦法獲得我的調用堆棧中出現的實例。這個虛擬機應該只有一個'RemoteTestRunner'實例:我如何訪問它? – 2012-02-16 21:59:43

回答

0

我希望擴展JUnit規範以便爲這個問題提供一個簡單的答案。但是,現在我可以使用下面的黑客技術:當Eclipse(3.4時代,RSA/RAD 7.5.5)運行包中的所有測試時,它將傳遞給測試運行器一個文本文件列表,每行一個,要測試的類。該文本文件位於系統臨時目錄中,名爲testNamesXXXX.txt,其中XXXX似乎是一個隨機生成的大數字。

如果當我的測試套件開始運行時,這樣的文件存在並且不到2秒鐘,我可以得出結論,我們是作爲多套件運行的一部分運行的。如果所有這些文件大於兩秒鐘,我可以得出結論,我們只運行即時套件。

下面是執行校驗碼:

import static java.lang.System.getProperty; 

private static boolean   multiSuite = false; 
private static final long  START_TIME = new Date().getTime(); 
private static final FileFilter TEST_NAMES = new FileFilter() { 
    @Override 
    public boolean accept(File f) { 
    final String n = f.getName(); 
    return START_TIME - f.lastModified() < 2000 && // two seconds, tweak to suit 
      n.endsWith(".txt")     && 
      n.startsWith("testNames"); 
    } 
}; 
private static final String  TMP_DIR = getProperty("java.io.tmpdir"); 

private static boolean isMultiSuite() { 
    if (multiSuite) 
    return true; 

    if (0 < new File(TMP_DIR).listFiles(TEST_NAMES)) 
    return multiSuite = true; // single-equals save value and return 

    return false; 
} 

如果我需要更多的確定性,我還可以打開該文件,驗證它)具有多行(類)中列出的和b)的此測試套件類的名稱是文件中的其中一行。

+0

通過讓accept()方法緩存它的答案並在知道已經找到匹配文件時立即返回,可以消除幾個CPU週期。但是,我們希望文件存在於或接近列表末尾的合理機會。嗯。 。 。 – 2012-02-17 19:48:08

相關問題