2017-10-20 161 views
1

我正在嘗試在生產代碼中找到斷言的最佳做法,但我很驚訝我找到的信息很少。生產代碼中的NUnit斷言

首先是否可以在生產代碼中聲明斷言?

其次,我發現內置的Debug.Assert for .NET本質上會自動禁用生產代碼,並且實際上只能在開發環境中運行。這是真的嗎,NUnit是否也有內置的這個功能?

例如,如果我在生產代碼中具有以下內容,斷言將被忽略?

var sortedActuals = actuals.OrderByDescending(a => 
        { 
         Assert.That(a.GLPeriodDateTime, Is.Not.Null, "GLPeriodDateTime was null when it should not be"); 
         return a.GLPeriodDateTime.Value; 
        }) 
+0

你試過了嗎?結果是什麼? – mason

+0

我不會在生產代碼中使用NUnit聲明。如果你想檢查你可以提出自己的例外或使用代碼合同。在這種情況下,它看起來像'a'的類應該確保'GLPeriodDateTime'永遠不爲空。 – Lee

回答

2

您不應該在生產代碼中使用NUnit聲明。如果斷言失敗,則NUnit斷言總是會引發異常。 NUnit不檢查它是否在Debug或Release(Production)中運行。 NUnit斷言也被設計爲在NUnit測試中使用。

對於您的實際代碼中的斷言,您應該使用Debug.Assert。它的功能較少,但是它在編譯模式下編譯出來,所以不會使您的應用程序在生產環境中崩潰。

1

我將從第二個問題開始。不,這個說法不會被忽略。在C#項目的構建配置中,您可以指定構建忽略DEBUG常量。這就是Debug.Assert語句被刪除的方式(Visual Studio爲您提供默認設置的構建配置)。

至於你的第一個問題,我會說在生產代碼中有NUnit斷言是不可接受的。問問自己,使用斷言對於異常或其他錯誤狀態有什麼好處?

如果GLPeriodDateTime在用戶沒有錯誤的情況下可以爲空,則可能需要在發佈之前進行更徹底的測試以解決此問題。如果用戶存在錯誤,則有更好的方法(例如異常)通知用戶錯誤。斷言適用於開發人員使用。

+0

感謝您的輸入。我不認爲它永遠是空的,因爲它從用戶輸入需要的字段。我仍然希望爲開發人員進行檢查,不過因爲有些數據是從舊系統導入的,而「應該」總是有這些數據,所以不檢查它是不明智的。我想我會使用內置的斷言讓開發人員知道但不會打擾用戶。 –

3

NUnit斷言必須在發佈版本中起作用,因爲發佈版本必須經過測試。出於多種原因,您不應在生產代碼中包含NUnit聲明。

  1. NUnit的斷言(以及Debug.Assert的)旨在檢測代碼的問題。提供給您的應用程序的錯誤數據是正常應用程序流程的一部分,應該由您的生產代碼進行檢測和處理。

  2. 斷言旨在NUnit的控制下運行,它知道結果的含義。例如,某些斷言在失敗時會拋出異常,而其他斷言則不會。您需要知道差異才能對其進行有效使用。

  3. 還有其他的,行之有效的處置不良數據,包括異常處理,自定義錯誤消息等方式

  4. 最有可能的,你要使用NUnit的約束語法從NUnit的測試分離。這是一個很好的語法,有幾個人要求我們把它作爲一個單獨的軟件包拆分出來。如果我們這樣做了,你可以使用它,但不幸的是我們還沒有。

+0

另一個很好的答案,謝謝。 –