我該如何使用JUnit不會終止斷言失敗,而只是記錄它們?JUnit只是登錄失敗?
我的目標是失敗,如果存在的日誌信息,並打印出來。因爲我想遍歷一個大列表,並想知道哪些元素失敗。
我怎麼能強迫的JUnit不上的故障打破?
TY
我該如何使用JUnit不會終止斷言失敗,而只是記錄它們?JUnit只是登錄失敗?
我的目標是失敗,如果存在的日誌信息,並打印出來。因爲我想遍歷一個大列表,並想知道哪些元素失敗。
我怎麼能強迫的JUnit不上的故障打破?
TY
你不能做你想要與標準的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 []都被傳遞給測試類的構造函數。因此,測試類的新實例將用於列表中的每個條目。
條目的對象的數目[]必須對應於參數給構造的數目,和類型具有對應爲好。
這聲音promissing。但是如果我有6個參數呢? 3爲輸入測試方法,3爲驗證結果? – membersound 2012-04-14 19:28:12
構造函數根據需要獲取儘可能多的參數。您只需在上面示例中註釋爲@Parameters,data()的方法中定義適當數量的對象。 – 2012-04-14 19:43:05
如果你想看到一個試驗可能失敗的所有原因,而不是隻是第一個,你需要創建的原因列表測試失敗,並拋出一個錯誤,如果該列表不最後是空的。
我也是這麼做的。 – 2012-04-13 14:37:38
如果您使用像junit任務一樣的構建工具,則有haltonfailure
屬性,您可以將其放到no
,以便在測試失敗時不會停止構建過程。
這是一個壞主意。一旦出現故障,您可能會處於不良狀態,而進一步的故障可能更多是由於初始狀態不佳所致,而不是由於任何實際問題,這意味着您記錄的大部分內容將毫無用處。具有小的測試方法並讓它們在故障時退出的觀點是,啓動狀態是衆所周知的。考慮重新進行測試,以便進行更多的小型獨立測試。 – 2012-04-13 13:15:24
我寧願做@NathanHughes建議的任何其他伎倆來做你想做的事情。 – 2012-04-13 13:31:02
完全同意@Nathan這裏。當不符合斷言時,測試必須失敗。 – 2012-04-13 13:31:42