2012-05-02 90 views
4

假設我想從我的IDE(Intellij IDEA或eclipse)4000 JUnit測試中手動運行;前1000次測試運行相當順利(比如說1000分鐘需要3分鐘),但測試1001僅需30分鐘。 有沒有一種方法可以跳過測試1001(它仍在運行時)並讓測試1002(和其他人)繼續前進。我不希望@Ignore測試1001並重新運行套件,因爲我已經有了測試1-1000的答案;我也不想選擇測試1001-4000,因爲它需要太多時間。測試運行時,我可以跳過JUnit測試嗎?

我會做某種按鈕 - 跳過當前測試 - 當測試運行時可以按下這個按鈕。

如果這樣的功能不存在,它的增強需要由IDE開發人員或JUnit開發人員完成嗎?

+0

聽起來像這些測試是集成測試,應該由CI解決方案運行,而不是在開發端的IDE上運行。特別是如果單個測試需要那麼長時間。深入研究並檢查爲什麼需要這麼長時間並減少測試的運行時間。單元測試必須快速。 – khmarbaise

+0

就是這樣,但我首先要知道爲什麼所有失敗的測試都失敗(或需要太多),然後繼續調查。我不明白爲什麼test1失敗(或者花費太多)調查test1,然後看看爲什麼test2失敗並進行調查等。 – m3th0dman

回答

4

你要求的是在中間測試時停止執行你的代碼。您無法停止執行當前的測試,因爲您的代碼中沒有掛接以允許它。您最好的解決方案是使用其他人建議的類別。基本上,JUnit執行所有@Before方法(包括@Rules),然後執行@Test方法,然後執行@After方法(再次包括@Rules)。即使假設JUnit有一種停止執行代碼位的機制(大多數情況下,大部分時間都在中,您的代碼爲)。因此,爲了「跳過」已經開始的測試,您需要修改測試代碼(以及可能測試的代碼),以便徹底停止測試。乾淨地停止正在執行的線程本身就是一個問題[*]。

那麼你有什麼選擇?

  1. 並行運行測試,然後您不必等待測試完成。這可能會起作用,但並行測試可能需要很多工作。

  2. 停止執行測試,並修復正在處理的測試。大多數IDE都可以選擇終止運行測試的JVM。這絕對是最簡單的選擇。

  3. 實現您自己的測試運行器,它在單獨的線程中運行測試。然後這個測試運行者等待線程完成執行,或者在某個地方檢查一個標誌,這將是一個停止的信號。這聽起來很複雜,因爲你不需要管理你的線程,也可以在正在運行的jvm中設置標誌。也許在某處創建一個文件?然後這個跑步者將失敗當前正在運行的測試,並且可以繼續進行下一個測試。請注意,中途停止測試可能會使內容處於不一致狀態,或者最終可能會並行執行內容。

有一些平行的JUnit跑步者,我不認爲你會從IDE開發者那裏得到很多幫助(至少在短期內)。另外,看看TestNG,它允許並行運行。

對於使用類別,我使用的一個解決方案是使用maven surefire或類似的,而不是通過IDE單獨運行長時間運行的測試。這涉及到檢查我機器上其他地方的源代碼並在那裏建立。

[*]:Java, how to stop threadsRegarding stopping of a thread

-1

您可以通過修改thest並做類似

public void theTest(){ 
    if (System.getProperty("skipMyTest") == null){ 
     //execute the test 
    } 
} 

,如果你想跳過測試

+0

爲了做到這一點,我必須先停止測試,修改它們然後重新運行它們。我想在運行時停止它。 – m3th0dman

7

沒有通過環境變量,你不能跳過測試,如果他們已經在運行。

我建議你做的是用Categories來分開你的慢測試和其餘的測試。

例如:

public interface SlowTests { 
} 

public class MyTest { 

    @Test 
    public void test1{ 
    } 

    @Category(SlowTests.class) 
    @Test 
    public void test1001{ 
     // this is a slow test 
    } 
} 

創建一個測試套件的快速測試。

@RunWith(Categories.class) 
@ExcludeCategory(SlowTests.class) 
@SuiteClasses(MyTest.class) 
public class FastTestSuite { 

} 

現在執行的FastTestSuite,如果你不想跑慢測試(例如test1001)。如果要運行所有測試,則正常執行MyTest

+0

感謝您的回答。我還想知道你對第二個問題的看法:「如果這種功能不存在,那麼它的增強需要由IDE開發人員或JUnit開發人員完成?」 – m3th0dman

+0

我想這兩個團隊都必須完成。 JUnit庫需要更改測試運行器API以允許跳過測試,並且IDE需要更改以調用此新API。 – dogbane

1

我認爲更常見的解決方案是有兩個測試套件:一個用於快速測試,另一個用於慢速測試。這通常是您將單元測試(快速)和集成測試(慢)分開的方式。

對於這樣的事情,你很難得到對JUnit或IntelliJ的修改。更好地改變你使用它們的方式 - 它會讓你更快地得到答案。

9

這實際上是使用JUnit 4相當簡單使用AssumeAssume是一個幫助類,如Assert。不同的是,Assert將使測試失敗,而Assume將跳過它。

常見用例爲Assume.assumeTrue(isWindows()),適用於僅適用於Windows文件系統的測試。

所以你能做的就是定義一個系統屬性skipSlowTests並在你平時想跳過慢測試的開頭添加

Assume.assumeTrue(Boolean.getBoolean("skipSlowTests")) 

。創建一個Eclipse啓動配置,該配置將屬性定義爲true,並且您可以方便地在兩者之間切換。

如果要運行慢速測試,請在Eclipse(或整個類)中選擇該方法,然後使用上下文菜單中的「作爲JUnit測試運行」。由於默認屬性爲false,因此將運行測試。