2013-02-12 56 views
1

我有一個創建錯誤條件的單元測試。通常,被測試的類將這個錯誤寫入日誌(在這種情況下使用log4j,但我認爲不重要)。我可以臨時更改日誌級別,使用如果應該產生錯誤,我應該更改單元測試的日誌級別嗎?

Logger targetLogger = Logger.getLogger(ClassUnderTest.class); 
Level oldLvl = targetLogger.getLevel(); 
targetLogger.setLevel(Level.FATAL); 

theTestObject.doABadThing(); 

assertTrue(theTestObject.hadAnError()); 

targetLogger.setLevel(oldLvl); 

但是這也意味着,如果測試過程中出現不相關的/無意的錯誤,我不會看到在日誌中的信息無論是。

我在這裏應該使用最佳做法還是常用模式?如果我可以提供幫助,我不喜歡刺激日誌級別,但我也不喜歡在測試輸出中產生一堆噪聲,這可能會嚇到未來的開發人員。

回答

1

如果您的日誌記錄層允許,最好對錯誤消息進行斷言。你可以通過實現你自己的記錄器來實現,只需在消息上聲明(沒有輸出),或者使用內存緩衝記錄器,然後檢查日誌緩衝區的內容。

任何情況下都不應該在單元測試執行日誌中出現錯誤消息。這會使人們習慣日誌中的錯誤並掩蓋其他錯誤。總之,您的選擇是:

  1. 最優選:抓住線束中的消息並在其上聲明。
  2. 有點好:提高級別並忽略消息。
  3. 不好:不要做任何事情,讓日誌消息到達stderr/syslog。
+0

好的,我想我以前見過有人做過#1,但是我將不得不爲了一些示例代碼進行挖掘。就像我說的,我使用的是Log4J,所以如果你發生*有一個方便的鏈接到一個例子,它將非常感激! – Coderer 2013-02-12 11:23:45

+0

嗯,我剛剛發現[這](http://stackoverflow.com/questions/1827677/how-to-do-a-junit-assert-on-a-message-in-a-logger)看起來喜歡它應該做的伎倆。謝謝! – Coderer 2013-02-12 11:28:10

0

我處理這個假設單元測試的的xUnit風格的方式(JUnit中,PyUnit中,等)

@Test(expected = MyException) 
foo_1() throws Exception 
{ 
    theTestObject.doABadThing(); //MyException here 
} 

用做記錄的問題是,需要有人去真正分析日誌文件,這是耗時且容易出錯的。但是,如果生成MyException,測試將通過上面的測試,如果不是,則測試失敗。這反過來又允許你自動失敗構建,而不是希望測試人員正確地讀取日誌。

+0

謝謝,我熟悉這個約定,但在我的特殊情況下,掃描日誌實際上比這種類型的測試簡單得多。如果我在較低級別進行測試,它會起作用,但不幸的是,由於我正在編寫一個插件,因此我基本上被集成測試困住了。 – Coderer 2013-02-12 16:30:51

相關問題