2009-09-10 19 views
1

我引用本帖來自exubero's的條目。我認爲這個入門將有利於所有正在進行單元測試的人:JUnit - 使用錯誤Assert

在Junit的Assert類中定義了大量以assert開頭的不同方法。這些方法中的每一個都有關於他們聲明的參數和語義略有不同。

下面顯示了assertTrue一些不規則的用途:

assertTrue("Objects must be the same", expected == actual); 
assertTrue("Objects must be equal", expected.equals(actual)); 
assertTrue("Object must be null", actual == null); 
assertTrue("Object must not be null", actual != null); 

一些單元測試的專家指出,上面的代碼可以更好地寫爲:

assertSame("Objects must be the same", expected, actual); 
assertEquals("Objects must be equal", expected, actual); 
assertNull("Object must be null", actual); 
assertNotNull("Object must not be null", actual); 

一個使用的優點適當'assertXXX()'將增加單元測試的可讀性。任何人都可以指出使用適當的'assertXXX()'有什麼其他好處嗎?

+0

這不是博客。請不要在這裏發表咆哮,然後在最後提出一個小問題。 – JoshJordan 2009-09-10 01:40:39

+0

注意到這一點。很公平。我在帖子中編輯了字詞。我從來沒有把這個問題稱爲「咆哮」。我的觀察提出了一個有趣的辯論,可以幫助每個人更好地編寫單元測試。所以我只想看看其他人在想什麼。 – zfranciscus 2009-09-10 01:51:09

+0

這不是一場真正的辯論,是嗎?對於測試布爾方法的特定情況,您應該只使用'assertTrue'。有什麼問題?你遇到了一個被assertTrue困惑的人嗎? – 2009-09-10 02:27:33

回答

8

我不是Java開發人員,我不知道當斷言失敗時JUnit輸出了什麼。 我使用過的許多單元測試框架在使用類似assertEquals時會輸出更好的錯誤信息。

讓我來告訴你什麼是我說的一個例子:

assertTrue("Objects must be equal", "One" == "Two"); 
assertEquals("Objects must be equal", "One", "Two"); 

在第一種情況下,你可以有一個這樣的錯誤輸出:

錯誤:預期真正實際是假的。

輸出對於第二種情況:

錯誤:Exected 「一」 實際是 「二」。

正如你所看到的第二種情況提供更好的更有意義的信息。

+0

嘿vadim謝謝你指出這一點。你完全正確。與assertTrue()相比,使用assertEquals()將提供更好的輸出。 – zfranciscus 2009-09-10 01:56:08

0

除了@Vadim在上面提到的內容之外,使用正確的assert可以防止通過剪貼複製粘貼測試創建的錯誤。

作爲示例

assertTrue("Objects must not be the same", expected != actual); 

被複制和修改,以

assertTrue("Objects must not be the same", newobject == actual); 

當代碼的變化和本次測試失敗,並且評論牯下顯影劑「修理」的代碼引入新bug的方式。

如果剪切 - 複製 - 粘貼代碼是這樣的:

assertFalse("Objects must be the same", newobject == actual); 

註釋的DIS-一致性,斷言和測試情況可能會更明顯。

是的,我見過這種情況。