Dot-Net

在 nUnit 中使用 Console.Out.WriteLine 與 Trace.WriteLine 隔離執行或在 reSharper 或 TeamCity 中執行

  • October 18, 2010

我隱約記得在 reSharper 或 TeamCity 的上下文中閱讀過關於在 nUnit 中使用 Trace.WriteLine 而不是 Console.Out.WriteLine 的“某事”“某處”,但我不記得細節了。

因此,問題是在 nUnit 單獨執行的上下文中或在 reSharper/TeamCity 中使用一個比另一個有什麼好處,如果有的話有什麼區別,你個人會使用什麼?

目前我的立場是 Trace.WriteLine 不僅因為我模糊地記得我可以夢想的東西,而且我覺得在單元測試中跟踪更多的是診斷任務而不是輸出任務。

就個人而言,我並不熱衷於在單元測試中嵌入跟踪(使用您提到的任何一種方法)。如果單元測試需要這樣做,則很可能表明您的單元測試過於復雜。如果您需要通過單元測試跟踪邏輯,則應在整個測試中使用斷言以程式方式檢查預期行為是否正在發生,從而無需文本跟踪輸出。

但是,您需要務實——有時這樣做很有用。使用任何一種方法(或其他類似的方法Debug.WriteLine)都可以,但是您使用哪種方法確實會給您一些靈活性。

如果您有很多輸出跟踪的測試,那麼在一次執行中執行所有測試時,您可以獲得很多跟踪輸出。在 NUnit 中,您可以在選項頁面中對其進行過濾:

NUnit 文本選項

這四個選項執行以下參考

  • 標準輸出:擷取寫入 Console.Error 的所有輸出。
  • 錯誤輸出:擷取寫入 Console.Error 的所有輸出。
  • 跟踪輸出:擷取寫入跟踪或調試的所有輸出。
  • 日誌輸出:擷取寫入 log4net 日誌的輸出。NUnit 擷取錯誤級別或更高級別的所有輸出,除非DefaultLogThreshold為測試程序集或項目的配置文件中的設置指定了另一個級別。

通過關閉這些選項,您可以單獨禁用發送到四種不同日誌記錄方法的跟踪輸出,從而使您能夠過濾測試跟踪。

我不知道 ReSharper 的測試執行程序中有任何類似的設置。

還值得考慮的一件事是文本輸出可能會產生副作用。我最近遇到了 NUnit 崩潰,因為某些輸出包含在 XML 文件中非法的字元 - NUnit 會在我們的自動建構中生成一個字元。


編輯

@Bronumski:我可以看到使用一種方法與另一種方法的唯一真正區別是輸出的消耗方式。

某些工具會拾取Debug跟踪(例如 DebugView)但不會Console輸出。此外,您可以Trace通過配置(在 app.config 中)在執行時禁用輸出,但不能禁用Console輸出。僅當您必須通過跟踪測試來裝飾真實(即非測試)程式碼時,這才有意義-在執行時記錄大量文本可能會很昂貴,因此如果可以將其關閉,除非您確實需要它來診斷,否則將是有益的某物。

此外,在使用 NUnit 時,如果您有太多日誌需要處理,您可以有選擇地相互獨立地關閉它們。

引用自:https://stackoverflow.com/questions/3872608