2012-04-13 68 views
2

我該如何使用JUnit不會終止斷言失敗,而只是記錄它們?JUnit只是登錄失敗?

我的目標是失敗,如果存在的日誌信息,並打印出來。因爲我想遍歷一個大列表,並想知道哪些元素失敗。

我怎麼能強迫的JUnit不上的故障打破?

TY

+1

這是一個壞主意。一旦出現故障,您可能會處於不良狀態,而進一步的故障可能更多是由於初始狀態不佳所致,而不是由於任何實際問題,這意味着您記錄的大部分內容將毫無用處。具有小的測試方法並讓它們在故障時退出的觀點是,啓動狀態是衆所周知的。考慮重新進行測試,以便進行更多的小型獨立測試。 – 2012-04-13 13:15:24

+0

我寧願做@NathanHughes建議的任何其他伎倆來做你想做的事情。 – 2012-04-13 13:31:02

+0

完全同意@Nathan這裏。當不符合斷言時,測試必須失敗。 – 2012-04-13 13:31:42

回答

1

你不能做你想要與標準的JUnit什麼,與你的測試,因爲它們。問題是,assertXXX方法實際上會拋出Exceptions(AssertionError),所以你不能使用普通的斷言,並在拋出異常後從這個點繼續。 JUnit捕獲這些AssertIonErrors並做正確的事情。

一種選擇是使用,因爲路德維希建議的,ErrorCollector規則,但是這將意味着重寫我會想象你的測試的相當一部分。

如果你的目標是要遍歷一個大名單,看看Parameterized。這允許您迭代單個測試方法,每次使用不同的數據:

@RunWith(Parameterized.class) 
public class FibonacciTest { 
    @Parameters 
    public static List<Object[]> data() { 
    return Arrays.asList(new Object[][] { 
     { 0, 0 }, { 1, 1 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 } 
    }); 
    } 

    private int fInput; 

    private int fExpected; 

    public FibonacciTest(int input, int expected) { 
    fInput= input; 
    fExpected= expected; 
    } 

    @Test 
    public void test() { 
    assertEquals(fExpected, Fibonacci.compute(fInput)); 
    } 
} 

data()返回Object []的列表。列表中的每個Object []都被傳遞給測試類的構造函數。因此,測試類的新實例將用於列表中的每個條目。

條目的對象的數目[]必須對應於參數給構造的數目,和類型具有對應爲好。

+0

這聲音promissing。但是如果我有6個參數呢? 3爲輸入測試方法,3爲驗證結果? – membersound 2012-04-14 19:28:12

+0

構造函數根據需要獲取儘可能多的參數。您只需在上面示例中註釋爲@Parameters,data()的方法中定義適當數量的對象。 – 2012-04-14 19:43:05

1

如果你想看到一個試驗可能失敗的所有原因,而不是隻是第一個,你需要創建的原因列表測試失敗,並拋出一個錯誤,如果該列表不最後是空的。

+0

我也是這麼做的。 – 2012-04-13 14:37:38

0

如果您使用像junit任務一樣的構建工具,則有haltonfailure屬性,您可以將其放到no,以便在測試失敗時不會停止構建過程。

3

也許ErrorCollector規則會幫助你

+0

+1是的,這是正確的答案。 – Gangnus 2013-04-04 20:28:33