.NET 單元測試(一):工具和規範

工欲善其事,必先利其器

  單元測試框架爲咱們寫單元測試提供了極大的便利,目前市面上有不少單元測試框架,這麼多,怎麼選呢?bash

這個須要視團隊狀況而定,有這麼些規則是須要考慮的:框架

  1. 功能知足需求
  2. 穩定且容易獲取
  3. 上手簡單,使用方便(調試、運行、整理單元測試等)
  4. 部署自動化容易

綜上,宇宙最強IDE默認集成的MSTest中標(非必需狀況,強烈推薦使用MSTest)。工具

開始

  在VS中右鍵單擊任意公開的類名或方法便可看到建立單元測試項目的選項(也能夠在設計解決方案的時候創建好單元測試項目,並引用須要依賴的程序集)。單元測試

命名

  • 單元測試項目名:[被測項目].Tests
  • 類名:[被測類]Tests
  • 方法名:[被測方法]_[測試場景]_[預期行爲]

舉個例子,如今要對Shape.Core.dll中的Line類的Contains方法寫單元測試,測試其在傳入一個當前直線上的點時,能正確返回true,按照規範應該這樣命名:測試

項目名:Shape.Core.Tests
 類名:LineTests
 方法名:Contains_PointIsOnLine_ReturnTrue()
複製代碼

固然,註釋也是很重要的,通常能夠在註釋中註明測試條件和預期行爲。spa

分組

  在單元測試方法中增長分組,能夠更好的管理單元測試,也方便自動化測試,只須要在在測試方法上,使用[TestCategory(name)]特性進行標記。標記分組後,可針對組單獨運行或者調試測試用例。 組的命名規則可參考:[模塊]_[類名]_[功能]_[額外用途],如:設計

image.png

步驟

  一個完整的單元測試用例應該包含以下三個部分3d

  • Arrange:準備當前測試場景的前置條件
  • Action:執行被測試方法
  • Assert:對被測試方法的執行結果進行斷言判斷(幾乎每種測試框架都提供了Assert庫,固然,也能夠根據狀況豐富咱們本身的Assert庫)

仍是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);
}&emsp;&emsp;
複製代碼

以上命名規則和步驟是業界普遍使用的,每一位開發者務必遵循。code

再談單元測試框架

  上面講的例子是在單元測試框架的基礎上寫的,那麼其中那些是單元測試框架的功勞呢?單元測試框架還能夠幫咱們作些什麼呢?

  • 測試方法上的[TestMethod]就是MSTest爲咱們提供的用於標識一個單元測試方法的特性,在項目或者類名上運行單元測試時,這些方法就會運行起來。

  • Assert也是MSTest爲咱們提供的類庫。

    除此以外,測試框架還提供了

    • 在測試類的全部方法運行以前和以後執行一個方法
    • 在每一個測試方法執行以前和以後執行一個方法
    • 對測試方法進行歸類(好比須要每次Push都運行的測試能夠歸爲一類)
    • 自動化單元測試
    • ...

更多MSTest的特性

代碼覆蓋率

  代碼覆蓋率指的是運行單元測試時,產品代碼的覆蓋狀況。VS默認執行的是Block(Block指的是對應IL上單一入口和單一出口的代碼塊,在實際執行代碼覆蓋率時無需糾結Block的定義和具體劃分)級別的代碼覆蓋率檢查。

怎麼看代碼覆蓋率

目前VS只對企業版提供了單元測試代碼覆蓋率的檢查工具(若是不是企業版,也可以使用JUST TRACE等工具來輔助檢查,但強烈推薦安裝企業版)這裏以VS2017企業版爲例:

image.png

也能夠經過測試=>窗口=>測試資源管理器

image.png

打開測試用例瀏覽窗口,進行選中的單元測試或者所有單元測試的代碼覆蓋率檢查:

image.png

執行完代碼覆蓋率分析,會獲得一個下面這樣的窗口:

image.png

經過這個窗口能夠看到程序集、類和方法的代碼覆蓋率,雙擊相應方法能夠看到具體的代碼覆蓋狀況,好比:

image.png

其中紅色部分是未被覆蓋的代碼,米色部分是未覆蓋徹底的代碼,淺藍色是徹底覆蓋的代碼。

代碼覆蓋率要求

  正如本節開始所說,約定單元測試Block級別的覆蓋,所以,對於明確要求測試的公共方法,該方法的代碼覆蓋率要求100%。

另外: 覆蓋率數據只能表明你測試過哪些代碼,不能表明你是否測試好這些代碼(測試用例的設計尤其重要哦(^_^))

2017-3-16 08:02:54
相關文章
相關標籤/搜索