C# 斷言 Assert

重構-斷言

現象:某一段代碼須要對程序狀態作出某種假設
作法:以斷言明確表現這種假設
動機:
經常有這種一段代碼:只有某個條件爲真是,該更名才能正常運行。
一般假設這樣的假設並無代碼中明確表現出來,必須閱讀整個算法才能看出。
有時程序員會註釋這樣的代碼。
而如今這種重構介紹一種更好的技術:使用斷言明確標明這些假設。
斷言是一個條件表達式,應該老是爲真。若是他失敗,就是bug。
所以斷言的失敗應該是一個非受控異常,斷言絕對不能被系統其它部分使用。實際上,程序最後的成品每每將斷言系通通統刪除,所以,標記某些東西是個斷言是很重要。
斷言做爲調試和交流的輔助,在交流角度,斷言能夠幫助程序閱讀者理解代碼所作的假設;在調試的角度,斷言能夠在距離bug最近的地方抓住它們。
作法:
若是程序員不犯錯,斷言就不會對系統形成任何影響,因此加入斷言永遠不影響程序的行爲。
若是發現某個條件始終爲真,就加入一個斷言說明這種狀況。
能夠引入一個assert類,用於處理各類狀況下的斷言。
不要濫用斷言,請不要用來檢查你認爲應該爲真的條件,請只用來檢查必定爲真的條件。濫用斷言可能會形成難以維護的重複邏輯。
在一段代碼中引用斷言是有好處的,他迫使你從新考慮這段代碼的約束條件。
若是不知足這些約束條件,程序也能夠正常運行,斷言就不能帶來任何幫助,只會把代碼變得混亂,而且可能妨礙之後的修改。
若是斷言的所指示的約束條件不能知足,代碼是否正常運行?若是能夠就把斷言拿掉。
還須要注意斷言中重複的代碼。
C# 斷言代碼
  1. Boolean b1 = false;
  1. System.Diagnostics.Debug.Assert(b1);

斷言(Assert)與異常(Exception)

 

斷言是被用來檢查非法狀況而不是錯誤狀況,即在該程序正常工做時毫不應該發生的非法狀況,用來幫助開發人員對問題的快速定位。異常處理用於對程序發生異常狀況的處理,加強程序的健壯性、容錯性,減小程序使用中對用戶不有好的行爲,不讓(一般也沒必要)用戶知道發生了什麼錯誤。程序員

  實際開發中,咱們一般將Assert與異常混淆, 不知道何時使用Assert,何時使用異常處理。或者不用Assert,將一切狀況都歸爲異常。這樣一來,就掩蓋了問題,當問題發生的時候,很難進行定位,而這些問題本該是在開發的時候就解決掉的。同時,也增長了開銷(在c#中,debug.Assert()編譯成release版本時,不會產生任何代碼,而try/catch在debug/release版本中都是有代碼產生,運行時須要開銷)。算法

 

  Assert類位於Microsoft.VisualStudio.TestTools.UnitTesting 命名空間下,該命名空間提供支持單元測試的類。此命名空間包含許多屬性,這些屬性爲測試引擎標識有關數據源、方法執行順序、程序管理、代理/主機信息以及部署數據的測試信息。Microsoft.VisualStudio.TestTools.UnitTesting 命名空間還包含自定義單元測試異常。c#

  MSDN中,有詳細的Assert類的公共方法:http://msdn.microsoft.com/zh-cn/library/Microsoft.VisualStudio.TestTools.UnitTesting.Assert(v=vs.100).aspxapp

本文簡單歸類一些簡單的使用方法。掌握Assert類,一個BestPractice就是,瞭解Assert的幾個主要方法,而後熟悉其重寫方法便可,整理表格以下:dom

Name單元測試

Description測試

AreEqual(+18)spa

AreNotEqual(+18)debug

Verifies that specified values are equal(or not equal). The assertion fails if the values are not equal(or equal).代理

Displays a message if the assertion fails, and applies the specified formatting to it.(if available)

AreSame(+3)

Verifies that specified object variables refer to the same object. The assertion fails if they refer to different objects.

Displays a message if the assertion fails, and applies the specified formatting to it.(if available)

Equal

Determines whether two objects are equal.

Fail(+3)

Fails an assertion without checking any conditions.

Displays a message, and applies the specified formatting to it.(if available)

InConclusive(+3)

Indicates that an assertion cannot be proven true or false. Also used to indicate an assertion that has not yet been implemented.  

Displays a message, and applies the specified formatting to it.(if available)

IsFalse(+3)

IsTrue(+3)

Verifies that a specified condition is false(or true). The assertion fails if the condition is true(not true).

Displays a message, and applies the specified formatting to it.(if available)

IsInstanceOfType(+3)

IsNotInstanceOfType(+3)

Verifies that a specified object is(or is not) an instance of the specified type. The assertion fails if the type is not(or is) found in the inheritance hierarchy of the object.

Displays a message, and applies the specified formatting to it.(if available)

IsNull(+3)

IsNotNull(+3)

Verifies that a specified object is null(or not null) . The assertion fails if it is not null(or is null).

Displays a message if the assertion fails, and applies the specified formatting to it.(if available)

ReplaceNullChars

In a string, replaces null characters ('\0') with "\\0".

  

  關於異常處理, 在編寫代碼的時候,應充分考慮各類具體異常,而不簡單的catch到Exception,寫出更健壯的代碼。

  一般來講,可以用Assert的地方,均可以用try/catch處理 。但這不是好習慣。We need to "Writing Clean Code".

 

  文中相關擴展鏈接,  

  Microsoft.VisualStudio.TestTools.UnitTesting Namespace

  Assert Class

  A Unit Testing Walkthrough with Visual Studio Team Test

相關文章
相關標籤/搜索