2011-02-06 69 views
10

我想知道,按照慣例,當一個測試失敗,是適當的:JUnit的失敗()約定

  • 說爲什麼會失敗(業務邏輯)
  • 說爲什麼看到這個消息(例外應該被拋出,它不是)

例如,

fail("Accessed the element which does not exist"); 

fail("ArrayIndexOutOfBoundException was expected but something bad happened"); 

哪一個通常被首選/接受?

回答

9

鑑於這是測試代碼,不應該進入最終版本,我會說越冗長越好。因此,我會選擇第一個 - 問題的根本原因是什麼更清晰,這使得更容易糾正。

在任何情況下,我都會避免使用第二個,因爲它對測試人員來說並不是很有幫助,而且如果它以某種方式使其進入最終構建,那麼它比第一個到最終用戶更加神祕 - 它根本就不是幫助測試人員或用戶。

我會考慮的另一個選擇是,而不是指示發生異常,而是提供實際異常的詳細信息 - 這就是棧跡線被髮明的原因。這將傳達比列出的任何方法更多的細節。

+1

我喜歡你的用戶名:) – JAM 2011-02-06 03:21:53

4

如果有關於這個約定我會忽略它。你應該說任何能夠最好地傳達給看到這個信息的人的問題的本質,以便儘可能容易地解決問題。在這方面往往遵守一項公約就失敗了。

+0

但是如果有一個約定有人期望被忽略,它可能會導致混淆。當你寫一個測試時,你不知道誰可能會在10年內看到它。然後呢......再過10年,也許這個慣例已經改變了。 – dantiston 2015-01-07 00:11:12

11

首先,如果你希望你測試API拋出一個異常,而不是做一個try-catchfail() ...

@Test 
public void testMe() { 
    try { 
     api.testThis(); 
     fail("should not reach here"); 
    } 
    catch(MyException e) {} 
} 

...你應該這樣做: -

@Test(expected=MyException.class) 
public void testMe() { 
    api.testThis(); 
} 

這就是說,我很少使用fail()。如果我需要執行某些驗證和條件失敗,我將最有可能使用斷言比使用fail() ...例如: -

...而不是...

@Test 
public void testMe() { 
    boolean bool = api.testThis(); 
    if (!bool) { 
     fail("should be true because bla bla bla"); 
    } 
} 

...做到這一點: -

@Test 
public void testMe() { 
    boolean bool = api.testThis(); 
    assertTrue("bla bla bla",bool); 
} 

然而,如果你確實需要使用fail(),要詳細解釋失敗的原因,而不是「不應該來到這裏」或「失敗了這裏」,因爲這並不能幫助人們誰閱讀測試用例。當然,這些只是一些簡單的例子......但我想我可以得到我的觀點。 :)

+0

以前在註解語法中沒有看到預期的異常。整齊。 – dantiston 2015-01-31 22:56:19