使用Visual Studio 2017即時單元測試

by vivid 20. 九月 2017 13:14

.NET Magazine國際中文電子雜誌
作 者:許薰尹
審 稿:張智凱
文章編號:
N170918702
出刊日期: 2017/9/20

Visual Studio 2017新增的Live Unit Testing(即時單元測試)的功能,可以在背景自動套用單元測試的程式碼,立即以圖型化的介面顯示測試是透通過或失敗。如此程式設計師在撰寫程式的過程中可以馬上得到回饋,了解目前撰寫的程式碼是否符合預期的功能,以達到改善程式碼品質的效果。

Live Unit Testing(即時單元測試)目前只有Enterprise版本的Visual Studio 2017有支援,只適用於.NET Framework類型的C#或Visual Basic專案,.NET Core則尚不支援,Visual Studio 2017需要15.3版以上.NET Core才會支援即時單元測試這個功能。因此本文撰寫時使用的Visual Studio 2017是15.2版,文中將會以.NET Framework類型的MVC專案來示範,未來Visual Studio 2017釋出新版時,才能在.NET Core類型的專案使用。

 

建立ASP.NET MVC 5範本專案

從Visual Studio 2017開發工具「File」-「New」-「Project」選項,開啟「New Project」對話盒,確認視窗上方.NET Framework的目標版本為「.NET Framework 4.6」以上,選取左方「Installed」-「Templates」-「Visual C#」程式語言,從「Web」分類中,選取「ASP.NET Web Application(.NET Framework)」,適當設定專案名稱與專案存放路徑,按下「OK」鍵,請參考下圖所示:

clip_image002[4]

圖 1:建立MVC 5專案。

在「New ASP.NET Web Application」對話盒中選取「MVC」,勾選下方的「MVC」項目,然後按一下畫面中的「OK」 按鈕,請參考下圖所示:

clip_image004[4]

圖 2:勾選下方的「MVC」項目。

待專案建立完成後,修改HomeController類別的Index方法,回傳View的名稱,參考以下範例程式碼:

public class HomeController : Controller {
  public IActionResult Index( ) {
    return View( "Index" );
  }
//以下程式碼略
}

將游標停留在控制器程式設計畫面HomeController類別的Index方法之中,按滑鼠右鍵,從快捷選單選取「Create Unit Tests」,請參考下圖所示:

clip_image006[4]

圖 4:建立單元測試。

在「Create Unit Tests」對話盒中設定想要使用的測試框架,本範例使用預設的MSTest,接著你可以為測試專案取一個名稱,例如「MyWebAppTests」,以及測試類別與方法的名稱格式,如以下的「HomeControllerTests」與「HomeIndexTest」等等,完成基本設定之後按下「OK」按鈕,請參考下圖所示:

clip_image008[4]

圖 5:建立單元測試專案。

接著便會自動產生測試專案,以及基本的測試類別程式碼:

using Microsoft.VisualStudio.TestTools.UnitTesting;
using MyWebApp.Controllers;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MyWebApp.Controllers.Tests {
  [TestClass( )]
  public class HomeControllerTests {
    [TestMethod( )]
    public void HomeIndexTest( ) {
      Assert.Fail( );
    }
  }
}

 

修改程式碼,在HomeIndexTest類別中加入程式碼,叫用HomeController的Index方法,取回ViewResult,然後測試取回的檢視名稱是否相符:

using Microsoft.VisualStudio.TestTools.UnitTesting;
using MyWebApp.Controllers;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Mvc;

namespace MyWebApp.Controllers.Tests {
  [TestClass( )]
  public class HomeControllerTests {
    [TestMethod( )]
    public void HomeIndexTest( ) {
      var controller = new HomeController( );
      var result = controller.Index( ) as ViewResult;
      Assert.AreEqual( "Index" , result.ViewName );
    }
  }
}

 

這段程式碼目前不能編譯,會不認識ViewResult類別,這是因為在目前測試專案中沒有相關的MVC套件的關係。在Visual Stuido 2017開發ASP.NET網站時,常常需要安裝一些套件(package),常常不記得該安裝的套件是哪個。你可以開啟Visual Studio 2017 自動建議安裝套件功能。從Visual Studio 2017開發工具 - 「Tools」-「Options」-「Text Editor」設定「C#」- 「Advanced」項目,勾選「Suggest usings for types in reference assemblies」與「Suggest usings for types in NuGet packages」,請參考下圖所示:

clip_image010[4]

圖 7:開啟自動建議安裝套件功能。

接著將滑鼠移動到有問題的程式上方,Visual Studio 2017就會顯示建議安裝的套件選單,請參考下圖所示:

clip_image012[4]

圖 6:顯示建議安裝的套件選單。

完成程式碼之後,選擇Visual Studio 2017 開發工具「Build」-「Build Solution」建置相關的專案。

 

使用測試總管(Test Explorer)

Visual Studio中的「測試總管(Test Explorer)」工具提供一個圖型化介面可以用來執行、測試與除錯單元測試,分析測試的結果,也支援第三協力廠商的測試框架。透過這個工具可以將測試進行分組、搜尋。從Visual Studio 2017開發工具 - 「Test」-「Windows」-「Test Explorer」開啟測試總管視窗,請參考下圖所示:

clip_image014[4]

圖 8:使用測試總管(Test Explorer)。

點選測試總管(Test Explorer)視窗上方「Run All」項目,就會進行所有的測試方法,然後顯示測試的結果是成功還是失敗,請參考下圖所示:

clip_image016[4]

圖 9:使用測試總管(Test Explorer)進行測試。

 

Live Unit Testing(即時單元測試)

Live Unit Testing(即時單元測試)支援多種測試的框架,包含xUnit.net、NUnit、MSTest等等,它們都可以直接從Nuget.org下載到專案之中使用。

讓我們先回到測試專案,加上第二個測試方法 -「HomeIndexTest2」,此方法測試HomeController類別的Index方法回傳的型別是否為ViewResult型別:

using Microsoft.VisualStudio.TestTools.UnitTesting;
using MyWebApp.Controllers;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Mvc;

namespace MyWebApp.Controllers.Tests {
  [TestClass( )]
  public class HomeControllerTests {
    [TestMethod( )]
    public void HomeIndexTest( ) {
      var controller = new HomeController( );
      var result = controller.Index( ) as ViewResult;
      Assert.AreEqual( "Index" , result.ViewName );
    }
    [TestMethod( )]
    public void HomeIndexTest2( ) {
      var controller = new HomeController( );
      var result = controller.Index( );
      Assert.IsInstanceOfType( result , typeof( ViewResult ) );
    }
  }
}

 

啟動、暫停、停止即時單元測試

只要選取Visual Studio 2017 - 「Test」-「Live Unit Testing」選單,然後點選「Start」選項,就可以啟動即時單元測試。因為即時單元測試是在背景自動執行,因此不需要在程式編輯或除錯的過程中,停止或重新啟動,請參考下圖所示:

clip_image018[4]

圖 10:啟動即時單元測試。

只要啟動即時單元測試,若測試程式涵蓋到你所撰寫的程式碼,且測試成功,你的程式前方便有個綠色打勾的小圖示,請參考下圖所示:

clip_image020[4]

圖 11:即時單元測試測試成功。

只要滑鼠移動到程式前方的小圖示,就可以檢視此行程式碼被哪些測試程式涵蓋到,以及測試的結果是成功還是失敗,請參考下圖所示:

clip_image022[4]

圖 12:即時單元測試測試涵蓋範圍。

讓我們修改一下HomeIndexTest2方法,測試HomeController類別的Index方法回傳的型別是否為RedirectToRouteResult型別,如此將會造成測試失敗:

 

[TestMethod( )]
public void HomeIndexTest2( ) {
  var controller = new HomeController( );
  var result = controller.Index( ) ;
  Assert.IsInstanceOfType( result , typeof( RedirectToRouteResult ) );
}

 

若測試程式涵蓋到你所撰寫的程式碼,且測試失敗,你的程式前方便有個紅色打叉的小圖示,這些都是即時性的,只要變動程式碼,就會馬上套用,請參考下圖所示:

clip_image024[4]

圖 13:即時單元測試測試失敗。

若將滑鼠移動到程式前方的小圖示,再移動到測試程式上方,就可以檢視測試失敗的訊息等相關資訊,以便於我們偵錯並訂正程式的錯誤,請參考下圖所示:

clip_image026[4]

圖 14:檢視測試失敗的訊息。

若測試程式沒有涵蓋到你所撰寫的程式碼,你的程式前方便有個藍色的橫槓圖示,請參考下圖所示:

clip_image028[4]

圖 15:測試沒有涵蓋程式碼顯示藍色的橫槓圖示。

你可以隨時停止、暫停或重新啟動Live Unit Testing(即時單元測試)的功能。選取Visual Studio 2017 - 「Test」-「Live Unit Testing」選單,然後點選「Stop」選項,就可以停止即時單元測試,請參考下圖所示:

clip_image030[4]

圖 16:停止、暫停或重新啟動即時單元測試。

 

排除與包含即時單元測試

若同時開發多個專案,我們可以進一步控制方案或專案是否要加入即時單元測試。你可以從「Solution Explorer」視窗方案項目或專案名稱上方,按滑鼠右鍵,從快捷選單中,選取「Live Tests」- 「Include」或「Exclude」來將方案或專案包含到即時單元測試之中,或將之排除。同時也支援方法等級的包含與排除功能,只要測試方法上方,按滑鼠右鍵,選取「Live Tests」- 「Include」或「Exclude」,請參考下圖所示:

clip_image032[4]

圖 17:排除與包含即時單元測試。

但經筆者測試,針對方法選取「Include」或「Exclude」包含與排除即時單元測試選項之後並不會馬上生效,你可以從「Test」-「Live Unit Testing」-「Restart」重新啟動,就可以馬上看到效果。

 

即時單元測試設定

在Visual Studio 2017工具選項中,可以進一步設定即時單元測試,例如是否在方案載入時自動啟動即時單元測試、在專案建置與除錯時暫停即時單元測試等等,你可以從Visual Studio 2017 -「Tools」-「Options」,從「Live Unit Testing」分頁來進行設定,請參考下圖所示:

clip_image034[4]

圖 18:即時單元測試設定。

總結

Visual Studio 2017中的Live Unit Testing(即時單元測試)可以搭配不同的測試框架來使用,包含MSTest、xUnit與NUnit等等。Visual Studio 2017新增的Live Unit Testing(即時單元測試)的功能,會自動在背景執行,當你在撰寫程式碼時,便自動套用測試,並立即將測試結果使用視覺化的圖示顯示在程式碼前方。

Tags:

.NET Magazine國際中文電子雜誌 | ASP.NET MVC | Visual Studio | 許薰尹Vivid Hsu

新增評論




  Country flag
biuquote
  • 評論
  • 線上預覽
Loading






NET Magazine國際中文電子雜誌

NET Magazine國際中文電子版雜誌,由恆逸資訊創立於2000,自發刊日起迄今已發行超過500篇.NET相關技術文章,擁有超過40000名註冊讀者群。NET Magazine國際中文電子版雜誌希望藉於電子雜誌與NET Developer達到共同學習與技術新知分享,歡迎每一位對.NET 技術有興趣的朋友們多多支持本雜誌,讓作者群們可以有持續性的動力繼續爬文。<請加入免費訂閱>

月分類Month List