共用方式為


MSTest v3 移轉指南

本指南可協助使用者將 MSTest 專案從 MSTest v1 升級至 MSTest v3。 MSTest v3 引進了重要的新功能、優化和一些重大變更,以改善測試可靠性、執行速度和與新式 .NET 架構的相容性。

誰會受到影響?

本指南適用於目前 透過下列其中一項使用 MSTest v1 的專案

  • 元件參考:直接參考 Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll 的專案。
  • NuGet 套件:搭配 1.0.0-1.4.0 版使用 MSTest.TestFramework NuGet 套件的專案。

如果您的項目依賴 MSTest 進行單元測試,並包含上述參考,它將受益於 MSTest v3 中的改進,而且需要本指南中所述的調整。

為什麼要移轉至 MSTest v3?

即使您對目前的 MSTest 設定感到滿意,升級至 MSTest v3 仍可發揮大幅優勢,以改善測試的質量和未來整備程度。 這就是為什麼現在進行切換可能是向前邁出的重要一步:

  • 增強安全性:MSTest v1 具有已知的安全性弱點。 透過 MSTest v3,我們已實作廣泛的安全性改進,以保護測試環境。

  • 立即提升效能:MSTest v3 可大幅減少測試運行時間,並將資源使用量優化。 這在 CI/CD 管線中特別有用,其中更快速的測試可以縮短部署週期並降低基礎結構成本。

  • 未來證明您的測試:MSTest v3 為新式 .NET 版本提供強大的支援,包括 .NET 8 和未來的反覆專案,以及跨平臺相容性。 這表示您的測試將更容易調整並準備好進行升級,避免過時測試架構的技術債務。

  • 使用新分析器提高程式代碼可靠性:MSTest v3 內建程式代碼分析器會強制執行最佳做法,協助儘早捕捉問題,並提升更簡潔、更容易維護的測試程序代碼:

    • 主動式問題偵測:分析器會在撰寫測試時提供即時意見反應、建議改進和標幟潛在問題。

    • 更強型別安全判斷提示:取代模棱兩可的多載,MSTest v3 會強制執行類型安全判斷提示,降低不正確的測試行為風險,並讓測試更可靠。

    • 更簡潔的程式代碼、較少的維護:藉由將測試與 MSTest 標準和最佳做法一致,MSTest v3 可協助您維護更簡潔、更容易管理的程式代碼基底,並隨著時間降低技術債務。

  • 更大的彈性和擴充性:MSTest v3 支援進階測試案例,包括動態數據源和元件內平行執行。 這種彈性可啟用更複雜的測試方法,並加速測試套件,而不需要複雜的組態。

藉由升級,您會將測試設定為更快速、更可靠且可適應未來的 .NET 開發,並將專案定位為長期成功且更容易維護。

移轉步驟

1.移除元件參考

對於透過元件參考使用 MSTest v1 的專案,有下列 DLL 的參考:

  • Microsoft.VisualStudio.QualityTools.UnitTestFramework

在非 SDK 樣式專案中,這些參考通常會透過 Visual Studio 新增,而不是直接編輯 XML。 若要使用 Visual Studio GUI 移除這些參考:

  1. 在 Visual Studio 中開啟 方案總管

  2. 使用 MSTest 展開項目的項目節點

  3. 找出專案中的 References 資料夾。

  4. 在 [ 參考] 資料夾內, 尋找並選取 MSTest DLL 參考, Microsoft.VisualStudio.QualityTools.UnitTestFramework

  5. 以滑鼠右鍵按下 選取的參考,然後選擇 操作選單中的 [移除 ]。

    image

  6. 儲存專案 以套用變更。

2.更新專案

您可以使用下列兩種方式之一,將專案更新為 MSTest v3:

  • 更新套件:如果您有 MSTest.TestFrameworkMSTest.TestAdapter 的 NuGet 套件參考,請使用 Visual Studio 中的 NuGet 封裝管理員,或在 NuGet 封裝管理員 控制台中執行下列命令來更新它們:

    Update-Package MSTest.TestFramework -Version 3.6.2
    Update-Package MSTest.TestAdapter -Version 3.6.2
    
  • 或安裝 MSTest 套件:使用 Visual Studio 中的 NuGet 封裝管理員,或在 NuGet 封裝管理員 控制台中執行下列命令,安裝最新的 MSTest 套件:

    Install-Package MSTest -Version 3.6.2
    
  • 或直接 更新項目檔(適用於 SDK 樣式的專案):更新您的 .csproj 檔案以指定 MSTest SDK 版本。

    <Project Sdk="MSTest.Sdk/3.6.2">
      <PropertyGroup>
        <TargetFramework>net8.0</TargetFramework>
      </PropertyGroup>
    </Project>
    

選擇最適合您項目設定的選項。 這兩種方法可確保您的專案已升級為使用 MSTest v3。

3.更新您的程序代碼

  • Assert.AreEqual/AreNotEqual 或 Assert.AreSame/AreNotSame (with object) 如果其中一個判斷提示造成錯誤,建議您確認要比較的類型兼容。 如果是,請考慮新增明確的泛型類型來解決問題。

  • 使用泛型

    Assert.AreEqual<customObject>(expectedObject, actualObject);
    Assert.AreNotEqual<customObject>(expectedObject, actualObject);
    
  • 測試初始化:使用 TestInitialize 異步初始化的方法。

  • 清除:使用 TestCleanup 方法或 Dispose 模式進行清除。

  • RunSettings:不再支持檔案 .testsettings ,這表示 <LegacySettings> 也不再可用。 使用 .runsettings 進行測試組態。

MSTest v3 的新功能

  • 已改善測試項目的預設值
  • 簡化的設定和使用方式
  • MSTest 執行器的增強擴充性
  • 適用於改善測試開發的新 Roslyn 程式代碼分析器
  • WinUI 應用程式的支援
  • 元件內平行執行
  • 數據驅動測試的動態數據源

已被取代的功能

  • 已卸除對下列項目的支援:
    • .NET Framework 4.5 (使用 .NET 4.6.2 或更高版本)
    • .NET Standard 1.0 (使用 .NET Standard 2.0)
    • 16299 之前的UWP版本
    • 18362 之前的 WinUI 版本
    • .NET 5 (使用 .NET Core 3.1 或 .NET 6)

重大變更和已移除的 API

判斷提示多載

如果 AreEqual、AreNotEqual、AreSame 或 AreNotSame 判斷提示會造成錯誤,建議您檢查要比較的類型是否相容。 如果是,請考慮新增明確的泛型類型來解決問題。

DataRowAttribute 更新

MSTest v3 中的 DataRowAttribute 建構函式已簡化,以強制執行參數的類型比對。 這表示您必須在 DataRow 中指定值,以精確符合方法參數的類型。

範例:

[TestMethod]
[DataRow(1, "test")] // Correct: matches parameter types (int, string)
public void MyTestMethod(int number, string text) { ... }

如果類型不完全相符,MSTest v3 現在會引發錯誤,而不是嘗試轉換。

逾時設定

在 MSTest v3 中,設定的 Timeout 處理已標準化,以確保在不同 .NET 環境中的行為一致。 這項變更可能會影響依賴特定逾時值的測試,特別是當這些測試是異步或在不同的架構下執行時。

  • 在 MSTest v1 或 v2 中,某些逾時設定可能會根據架構(例如 .NET Framework 與 .NET Core)以不同的方式解譯。
  • MSTest v3 會強制執行一致的逾時行為,這表示如果新標準下逾時值太短,則以逾時值設定的測試可能會失敗或行為不同。

這表示

  • 具有逾時的測試可能需要調整:如果您的測試具有 Timeout 特定持續時間的屬性,請確認這些值仍允許在 MSTest v3 下完成測試。 先前以特定逾時通過的測試可能需要更高或較低的逾時值,才能在新規則下正常運作。

  • 整合逾時處理:MSTest v3 整合逾時處理可讓逾時更容易預測,但需要檢查並可能更新 Timeout 舊版測試中的值。

範例:

// Old (v1/v2) - Timeout was sometimes interpreted inconsistently
[TestMethod]
[Timeout(2000)] // Timeout in milliseconds
public void TestMethod() { ... }

// New (v3) - Unified handling of timeout
[TestMethod]
[Timeout(2000)] // Verify this value still works under MSTest v3
public async Task TestMethod() { ... } 

設定變更

確定 .runsettings 檔案與 MSTest v3 語法和結構一致。

平行執行和效能優化

在 .runsettings設定平行執行,以改善效能。

範例:

<RunSettings>
  <RunConfiguration>
    <MaxCpuCount>-1</MaxCpuCount> <!-- Uses all available processors -->
  </RunConfiguration>
</RunSettings>

改善的資源使用量

MSTest v3 會優化資源管理,進而降低記憶體使用量,並提升 CPU 效率。

處理過時的屬性並移轉自定義延伸模組

檢閱已被取代的屬性,並盡可能以 MSTest v3 替代專案取代它們。

程序代碼分析器和最佳做法

MSTest v3 包含適用於最佳做法的內建程式代碼分析器、避免設定陷阱,以及適當使用 MSTest 屬性和設定。 使用 MSTest 套件或 MSTest.Sdk 時,系統會自動提供此功能,或者您可以安裝 MSTest Analyzer 套件

其他資源