我想知道,按照慣例,當一個測試失敗,是適當的:JUnit的失敗()約定
- 說爲什麼會失敗(業務邏輯)
- 說爲什麼看到這個消息(例外應該被拋出,它不是)
例如,
fail("Accessed the element which does not exist");
或
fail("ArrayIndexOutOfBoundException was expected but something bad happened");
哪一個通常被首選/接受?
我想知道,按照慣例,當一個測試失敗,是適當的:JUnit的失敗()約定
例如,
fail("Accessed the element which does not exist");
或
fail("ArrayIndexOutOfBoundException was expected but something bad happened");
哪一個通常被首選/接受?
鑑於這是測試代碼,不應該進入最終版本,我會說越冗長越好。因此,我會選擇第一個 - 問題的根本原因是什麼更清晰,這使得更容易糾正。
在任何情況下,我都會避免使用第二個,因爲它對測試人員來說並不是很有幫助,而且如果它以某種方式使其進入最終構建,那麼它比第一個到最終用戶更加神祕 - 它根本就不是幫助測試人員或用戶。
我會考慮的另一個選擇是,而不是指示發生異常,而是提供實際異常的詳細信息 - 這就是棧跡線被髮明的原因。這將傳達比列出的任何方法更多的細節。
如果有是關於這個約定我會忽略它。你應該說任何能夠最好地傳達給看到這個信息的人的問題的本質,以便儘可能容易地解決問題。在這方面往往遵守一項公約就失敗了。
但是如果有一個約定有人期望被忽略,它可能會導致混淆。當你寫一個測試時,你不知道誰可能會在10年內看到它。然後呢......再過10年,也許這個慣例已經改變了。 – dantiston 2015-01-07 00:11:12
首先,如果你希望你測試API拋出一個異常,而不是做一個try-catch
與fail()
...
@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()
,要詳細解釋失敗的原因,而不是「不應該來到這裏」或「失敗了這裏」,因爲這並不能幫助人們誰閱讀測試用例。當然,這些只是一些簡單的例子......但我想我可以得到我的觀點。 :)
以前在註解語法中沒有看到預期的異常。整齊。 – dantiston 2015-01-31 22:56:19
我喜歡你的用戶名:) – JAM 2011-02-06 03:21:53