單元測試框架爲咱們寫單元測試提供了極大的便利,目前市面上有不少單元測試框架,這麼多,怎麼選呢?bash
這個須要視團隊狀況而定,有這麼些規則是須要考慮的:框架
綜上,宇宙最強IDE默認集成的MSTest中標(非必需狀況,強烈推薦使用MSTest)。工具
在VS中右鍵單擊任意公開的類名或方法便可看到建立單元測試項目的選項(也能夠在設計解決方案的時候創建好單元測試項目,並引用須要依賴的程序集)。單元測試
舉個例子,如今要對Shape.Core.dll中的Line類的Contains方法寫單元測試,測試其在傳入一個當前直線上的點時,能正確返回true,按照規範應該這樣命名:測試
項目名:Shape.Core.Tests
類名:LineTests
方法名:Contains_PointIsOnLine_ReturnTrue()
複製代碼
固然,註釋也是很重要的,通常能夠在註釋中註明測試條件和預期行爲。spa
在單元測試方法中增長分組,能夠更好的管理單元測試,也方便自動化測試,只須要在在測試方法上,使用[TestCategory(name)]特性進行標記。標記分組後,可針對組單獨運行或者調試測試用例。 組的命名規則可參考:[模塊]_[類名]_[功能]_[額外用途],如:設計
一個完整的單元測試用例應該包含以下三個部分3d
仍是Line類的Contains方法,請看按照標準步驟的代碼:調試
/// <summary>
/// 條件:點point在直線line上
/// 預期:<see cref="Line.Contains"/> 方法判斷點在直線上
/// </summary>
[TestMethod]
public void Contains_PointIsOnLine_ReturnsTrue()
{
//// Arrange
var point = new Point(1, 1);
var line = new Line(new Point(0, 2), new Point(2, 0));
//// Act
var contains = line.Contains(point);
//// Assert
Assert.IsTrue(contains);
}  
複製代碼
以上命名規則和步驟是業界普遍使用的,每一位開發者務必遵循。code
上面講的例子是在單元測試框架的基礎上寫的,那麼其中那些是單元測試框架的功勞呢?單元測試框架還能夠幫咱們作些什麼呢?
測試方法上的[TestMethod]就是MSTest爲咱們提供的用於標識一個單元測試方法的特性,在項目或者類名上運行單元測試時,這些方法就會運行起來。
Assert也是MSTest爲咱們提供的類庫。
除此以外,測試框架還提供了
代碼覆蓋率指的是運行單元測試時,產品代碼的覆蓋狀況。VS默認執行的是Block(Block指的是對應IL上單一入口和單一出口的代碼塊,在實際執行代碼覆蓋率時無需糾結Block的定義和具體劃分)級別的代碼覆蓋率檢查。
目前VS只對企業版提供了單元測試代碼覆蓋率的檢查工具(若是不是企業版,也可以使用JUST TRACE等工具來輔助檢查,但強烈推薦安裝企業版)這裏以VS2017企業版爲例:
也能夠經過測試=>窗口=>測試資源管理器
打開測試用例瀏覽窗口,進行選中的單元測試或者所有單元測試的代碼覆蓋率檢查:
執行完代碼覆蓋率分析,會獲得一個下面這樣的窗口:
經過這個窗口能夠看到程序集、類和方法的代碼覆蓋率,雙擊相應方法能夠看到具體的代碼覆蓋狀況,好比:
其中紅色部分是未被覆蓋的代碼,米色部分是未覆蓋徹底的代碼,淺藍色是徹底覆蓋的代碼。
正如本節開始所說,約定單元測試Block級別的覆蓋,所以,對於明確要求測試的公共方法,該方法的代碼覆蓋率要求100%。
另外: 覆蓋率數據只能表明你測試過哪些代碼,不能表明你是否測試好這些代碼(測試用例的設計尤其重要哦(^_^))
2017-3-16 08:02:54