簡體   English   中英

生產代碼中的NUnit斷言

[英]NUnit assertions in production code

我試圖找到在生產代碼中使用斷言的最佳實踐,但我很驚訝我發現的信息很少。

首先,通常可以接受或不在生產代碼中使用斷言語句?

其次,我讀到內置的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;
                    })

NUnit Assertions必須在發布版本中運行,因為必須測試發布版本。 出於多種原因,您不應在生產代碼中包含NUnit斷言。

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

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

  3. 還有其他完善的處理錯誤數據的方法,包括異常處理,自定義錯誤消息等。

  4. 最有可能的是,您嘗試使用與NUnit測試分開的NUnit約束語法。 這是一個很好的語法,有幾個人要求我們把它作為一個單獨的包分開。 如果我們這樣做了,你可以使用它,但不幸的是我們還沒有。

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

對於實際代碼中的斷言,您應該使用Debug.Assert 功能較少,但它會在發布模式下編譯出來,因此不會導致您在生產中運行的應用程序崩潰。

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

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM