2014-04-04 33 views
0

我有幾個使用我的build.xml運行的Junit測試。我希望那些失敗的測試,下次他們應該被忽略,我建立我的項目。我知道@ignore符號,但如何動態實現它?如何以編程方式忽略多個失敗的junit測試?

例子:我使用Ant 1.9.3,滿分爲100周的測試建立我的項目,4失敗。我的build.xml被配置爲可以運行所有的測試,例如haltonfailure = false。現在我想在下次構建時,所有那些上次失敗的測試都應該被忽略。

+0

這沒有任何意義。如果測試失敗,則表示該程序有問題。該程序需要修復,而不是失敗的測試刪除。如果這些是有效的測試,則應該每次都執行它們。他們將成爲開發者必須穿的那種猩紅色 - 強迫開發者進入社交隔離和羞恥,直到他們脫下他們的屁股,停止玩Candy Crush,並修復該死的程序!另一方面,如果測試不是有效的測試,請將其從測試套件中移除。 –

回答

0

這是一個常見問題("Conditionally ignoring tests in JUnit 4"),JUnit創建了一個Assume類,它類似於Assert,但會導致JUnit將其視爲忽略測試的AssumptionFailedException。但是,對於您的情況,您可能希望有條件地忽略大量測試或測試用例。

你需要某種形式的持久性和設置控制的,首先。在第二次運行中忽略測試是很好的,但是它們會在第三次被重新包含,還是被永久忽略,直到您手動重置它們?你如何重置它們?現在

,作爲直接無視測試:你可以創建一個自定義Rule,其裝飾一Statement也收到Description包含方法的名稱等。(你可以把一個聲明爲一個Runnable,往往代表單一測試方法及其裝飾)。在Rule中觸發一個AssumptionViolatedException可能會幫助您找到需要的地方,但您需要找出其他方法來確定正在運行哪個測試。

您可能希望創建一個自定義的Runner,相反,它給你一個FrameworkMethod包含所有你可能需要確定測試。在這種情況下,BlockJUnit4TestRunner是專爲子類,尤其是在其runChild方法一個很好的起點:

@Override 
protected void runChild(final FrameworkMethod method, RunNotifier notifier) { 
    Description description = describeChild(method); 
    if (isIgnored(method)) { 
     notifier.fireTestIgnored(description); 
    } else { 
     runLeaf(methodBlock(method), description, notifier); 
    } 
} 

...這是重寫,並委託給runLeaf in ParentRunner。將該方法替換爲針對存儲進行檢查以有條件地忽略測試的方法,並且可能已設置。但請記住,runLeaf是最終的,如果您想在測試失敗時更新您的存儲空間,那麼您需要打電話給其他人。

+0

謝謝傑夫。我創建了一個自定義的跑步者和一個聽衆來實現我的目標。我在測試類中使用@runwith來包含我的跑步者。當我通過eclipse運行我的測試 - > junit測試時,我的跑步者和聽衆都包含在內,一切正常。但是當我使用ANT構建我的項目時,只有那個測試運行,而不是像在創建之前那樣運行相關的運行器或監聽器。任何想法如何解決這個問題?我對螞蟻很陌生 – Varun

相關問題