2008-10-07 52 views
20

每當一個assert語句成功時,我都希望它會大喊大叫,或者至少讓它顯示遇到的成功聲明語句的數量。我可以讓JUnit更詳細嗎?

我正在使用JUnit4。

有什麼建議嗎?

+0

你爲什麼要這樣做?我總是試圖遵循沉默的規則(http://www.catb.org/~esr/writings/taoup/html/ch01s06.html#id2878450),這就是爲什麼我要求 – 2008-10-07 21:08:40

+0

這可能是一種有用的方法看看是否有人「調整」測試用例,通過消除不適當的斷言來通過測試用例... – 2008-10-07 22:07:06

回答

13

如果你想看到每個成功斷言的輸出,另一個不需要外部依賴或源代碼的簡單方法就是定義你自己的Assert類,它將所有方法委託給標準的JUnit Assert類以及日誌成功的斷言(失敗的斷言將像往常一樣由JUnit類報告)。

然後,您將從「org.junit.Assert」=>「com.myco.test.Assert」對您的測試類運行全局搜索和替換,這應該修復所有常規和靜態導入語句。

你也很容易再你的方法遷移到更安靜的就是更好陣營,改變包裝類只報告每個測試或每類傳入斷言的總#等

0

我敢肯定,你可以創建一個自定義的TestRunner是這樣做的。我們在我們自制的單元測試框架(NUnit的一個克隆)中得到了類似的結果。

哦,等等 - 現在我再次讀你的問題,如果你真的想要輸出每個成功的斷言,你將不得不深入探討管道。 TestRunner只會爲每個測試用例的開始/結束調用一次,所以它會計數通過並且失敗測試,而不是斷言。

這對我來說並不是什麼大問題,因爲我一般傾向於每個測試一個斷言。

2

很難做到。所有的assert方法都是類Assert的靜態成員,這意味着RunNotifier(計數成功和失敗的測試)不可及。

如果您不想避免不恰當的破解:從JUnit獲取源代碼,在運行測試時將它們修補以將當前通知程序存儲在Assert的靜態字段中,以便靜態方法可以將成功的斷言報告給此通知程序。

-1

你能考慮嗎?

1)下載JUnit的源
2)修改類org.junit.Assert做你正在尋找

4

您可以使用AOP(與Spring還是AspectJ)上的所有斷言定義切入點任何修改方法在junit.framework.Assert類中。使用spring可以在返回通知後實現自己的類(http://static.springframework.org/spring/docs/2.5.x/reference/aop.html#aop-advice-after-returning)僅在assert方法通過時纔會調用它(否則會引發異常:junit.framework.AssertionFailedError )。在您自己的類中,您可以實現一個簡單的計數器,在最後打印。

3

你在獲得成功嗎?通常情況下,唯一有趣的說法是那些失敗的斷言很感興趣。

作爲一個狂熱的JUnit奉獻自己,我嘗試做的輸出儘可能安靜地進行測試,因爲它在不通過任何事情的情況下提高了信噪比。最好的測試運行是所有事情都經過並且沒有從標準輸出中窺視的一個測試。

您可以隨時在單元測試中工作,直到成功並運行「grep Assert test.java | wc -l「。:-)

0

我不我認爲,JUnit的目標是計算匹配的斷言或打印出更詳細的信息。 如果測試是原子性的,那麼您會在那裏獲得大部分信息。所以我會檢查我的測試。

你也可以在JUnit中建立一個LogFile。這是可能的,但它會降低測試執行性能...

7

添加一些信息,當我想讓JUnit在這個問題上變得更加冗長和迷迷糊糊時,對我會有所幫助。也許它將在未來幫助其他測試人員。

如果從螞蟻運行JUnit,並希望看到什麼樣試驗進行的同時,您可以添加以下到您的任務:

<junit showoutput="true" printsummary="on" enabletestlistenerevents="true" fork="@{fork}" forkmode="once" haltonfailure="no" timeout="1800000"> 

注意showoutput,printsummary和enabletestlistenerevents是什麼幫助,不是其他任務屬性。如果設置了這些,你會得到輸出如下:

Running com.foo.bar.MyTest 
junit.framework.TestListener: tests to run: 2 
junit.framework.TestListener: startTest(myTestOne) 
junit.framework.TestListener: endTest(myTestOne) 
junit.framework.TestListener: startTest(myTestTwo) 
junit.framework.TestListener: endTest(myTestTwo) 
Tests run: 2, Failures: 0, Errors: 0, Time elapsed: 0.495 sec 

這是對我有用的,當我測試超時,我不知道哪個測試實際花費的時間太長,並且測試得到,因爲取消時間到了,他們不幸運行。

相關問題