MSTest SDK 配置

本文介紹了 MSTest.Sdk 的進階設定選項。 如需基本設定和入門的說明,請參閱 MSTest 入門指南

重要

預設情況下,MSTest.Sdk 使用 MSTest 執行器搭配 MTP,包括 dotnet 測試。 這需要修改你的 CI 和本地 CLI 呼叫,也會影響 .runsettings 的可用條目。 你可以 透過切換到 VSTest 來保留舊的整合和工具。

MSTest.Sdk 預設會將 EnableMSTestRunnerTestingPlatformDotnetTestSupport 設為 true。 欲了解更多關於 dotnet 測試及其不同模式的資訊,請參見 「使用 dotnet 測試測試」。

測試工具輔助函式庫

如果使用 MSTest.Sdk 的project是作為測試工具輔助函式庫,且本身不包含任何可執行的測試,該project應該是 <IsTestApplication>false</IsTestApplication>

選取跑者

預設情況下,MSTest SDK 依賴 MTP,但你也可以透過加入屬性 來切換到 <UseVSTest>true</UseVSTest>

延長MTP

你可以透過一組 NuGet 套件擴充功能來自訂 MTP 體驗。 為了簡化和改善這個體驗,MSTest SDK 引入了兩個功能:

Microsoft。Testing.Platform 個人檔案

profiles 的概念允許你選擇將套用到測試project的預設配置與擴充套件。

您可以使用屬性 TestingExtensionsProfile,將配置檔設為下列三個配置檔之一:

  • None - 未啟用任何擴充功能。

  • Default - 啟用此 MSTest.SDK 版本的建議延伸模組。 當屬性未明確設定時,這會是預設值。

    開啟下列延伸模組:

  • AllMicrosoft - 啟用 Microsoft 選定可廣泛直接使用的擴充功能,包括採用受限制授權的擴充功能。 實驗性及僅限 API 的擴充功能仍可能需要明確啟用。

    啟用 Default 設定檔中的所有擴充功能,以及下列擴充功能:

    在 MSTest.Sdk 3.11.0 至 4.2.x 版本中,Azure DevOps 報告擴充僅包含於 AllMicrosoft

注意

這些設定檔參照了 Azure DevOps Report 和 GitHub Actions Report 套件,但報告功能在執行階段仍維持停用狀態。 傳遞 --report-azdo 以啟用 Azure DevOps 報告功能。 要啟用 GitHub Actions 報告,請在 GitHub Actions 執行測試並通過 --report-gh

以下是使用 None 設定檔的完整範例:

<Project Sdk="MSTest.Sdk/4.1.0">

    <PropertyGroup>
        <TargetFramework>net10.0</TargetFramework>
        <TestingExtensionsProfile>None</TestingExtensionsProfile>
    </PropertyGroup>

</Project>
擴展/個人資料設定 沒有 預設 AllMicrosoft
程式代碼涵蓋範圍 ✔️ ✔️
當機記憶體轉儲 ✔️
假貨 ✔️¹
暫停傾倒 ✔️
即時重載 ✔️
HTML 報告 ✔️
GitHub Actions 報告 ✔️³ ✔️³
重試 ✔️
Trx ✔️ ✔️
Azure DevOps Report ✔️³ ✔️²

¹ MSTest.Sdk 3.7.0+ ² MSTest.Sdk 3.11.0+ ³ MSTest.Sdk 4.3.0+

啟用或停用延伸模組

可以透過 MSBuild 屬性使用模式 Enable[NugetPackageNameWithoutDots] 來啟用和停用延伸模組。

例如,啟用 crash dump 擴充功能(NuGet 套件 Microsoft。Testing.Extensions.CrashDump),你可以使用以下屬性EnableMicrosoftTestingExtensionsCrashDump,並設為 true

<Project Sdk="MSTest.Sdk/4.1.0">

<PropertyGroup>
    <TargetFramework>net10.0</TargetFramework>
    <EnableMicrosoftTestingExtensionsCrashDump>true</EnableMicrosoftTestingExtensionsCrashDump>
</PropertyGroup>

</Project>

所有可用擴充功能的清單,請參見 MTP 功能

部分 MTP 擴充功能仍需選擇加入,且不包含在 Default OR AllMicrosoft 設定檔中:

  • 從 MSTest.Sdk 4.3 開始,設定 <EnableMicrosoftTestingExtensionsJUnitReport>true</EnableMicrosoftTestingExtensionsJUnitReport>,然後傳遞 --report-junit
  • 從 MSTest.Sdk 4.4 預覽開始,設定 <EnableMicrosoftTestingExtensionsCtrfReport>true</EnableMicrosoftTestingExtensionsCtrfReport>,然後傳遞 --report-ctrf
  • 若要參考 OpenTelemetry 擴充,請設 <EnableMicrosoftTestingExtensionsOpenTelemetry>true</EnableMicrosoftTestingExtensionsOpenTelemetry>。 由於擴充功能需要 API 設定,請依 照 OpenTelemetry 描述,在你的自訂入口點註冊它。

這些擴充功能僅在 MTP 下提供。

警告

請務必檢查每個擴充功能的授權條款,因為它們可能會有所不同。

啟用和停用的擴充功能會與您所選擇的擴充功能設定檔提供的擴充功能結合。

這個屬性模式可以用來在隱式 Default 設定檔 (如先前的 CrashDumpExtension 範例所示) 之上啟用額外的擴充功能。

你也可以停用來自選定設定檔的擴充功能。 例如,透過設定 MS Code Coverage 來停用 <EnableMicrosoftTestingExtensionsCodeCoverage>false</EnableMicrosoftTestingExtensionsCodeCoverage> 擴充功能:

<Project Sdk="MSTest.Sdk/4.1.0">

    <PropertyGroup>
        <TargetFramework>net10.0</TargetFramework>
        <EnableMicrosoftTestingExtensionsCodeCoverage>false</EnableMicrosoftTestingExtensionsCodeCoverage>
    </PropertyGroup>

</Project>

在 MSTest.Sdk 4.3.0 及後續版本中,Default 設定檔會引用 Azure DevOps Report 和 GitHub Actions Report 套件。 若要移除其中任一套件參考,請設定 <EnableMicrosoftTestingExtensionsAzureDevOpsReport>false</EnableMicrosoftTestingExtensionsAzureDevOpsReport><EnableMicrosoftTestingExtensionsGitHubActionsReport>false</EnableMicrosoftTestingExtensionsGitHubActionsReport>。 如果你保留套件參考,Azure DevOps 的報告功能只有在你傳入 --report-azdo 時才會開始。 GitHub Actions 的報告只有在你執行 GitHub Actions 測試並通過 --report-gh後才會開始。

功能

除了選擇執行器和執行器專用擴充功能之外,MSTest.Sdk 還提供額外的功能,以簡化和提升測試體驗。

使用 Aspire 進行測試

Aspire 是一個具規範性、雲端準備就緒的堆疊,用於構建可觀察、適用於生產環境的分散式應用程式。 Aspire 透過一系列處理特定雲端原生問題的 NuGet 套件來提供。 更多資訊請參閱 Aspire 文件

注意

此功能可從 MSTest.Sdk 3.4.0 取得。

透過將屬性 EnableAspireTesting 設為 true,您可以引入所有測試 usingAspire 所需的依賴項和預設 MSTest 指令。

<Project Sdk="MSTest.Sdk/4.1.0">

    <PropertyGroup>
        <TargetFramework>net10.0</TargetFramework>
        <EnableAspireTesting>true</EnableAspireTesting>
    </PropertyGroup>

</Project>

使用 Playwright 進行測試

Playwright 讓現代 web apps 能夠可靠地進行端到端測試。 如需詳細資訊,請參閱官方 Playwright 文件

注意

此功能可從 MSTest.Sdk 3.4.0 取得。

透過將屬性 EnablePlaywright 設為 true,您可以引入所有測試 usingPlaywright 所需的依賴項和預設 MSTest 指令。

<Project Sdk="MSTest.Sdk/4.1.0">

    <PropertyGroup>
        <TargetFramework>net10.0</TargetFramework>
        <EnablePlaywright>true</EnablePlaywright>
    </PropertyGroup>

</Project>

移轉到 MSTest SDK

請考慮移轉至 MSTest SDK 所需的下列步驟。

更新您的專案

在將現有的 MSTest 測試專案遷移到 MSTest SDK 時,首先將測試專案頂端的 Sdk="Microsoft.NET.Sdk" 條目替換成 Sdk="MSTest.Sdk"

- Sdk="Microsoft.NET.Sdk"
+ Sdk="MSTest.Sdk"

global.json 中新增版本:

{
    "msbuild-sdks": {
        "MSTest.Sdk": "4.1.0"
    }
}

接著你可以開始簡化你的 project。

移除預設屬性:

- <EnableMSTestRunner>true</EnableMSTestRunner>
- <OutputType>Exe</OutputType>
- <IsPackable>false</IsPackable>
- <IsTestProject>true</IsTestProject>

移除預設軟體包引用:

- <PackageReference Include="MSTest"
- <PackageReference Include="MSTest.TestFramework"
- <PackageReference Include="MSTest.TestAdapter"
- <PackageReference Include="MSTest.Analyzers"
- <PackageReference Include="Microsoft.NET.Test.Sdk"

最後,根據你使用的擴充套件設定檔,你也可以移除一些 Microsoft.Testing.Extensions.* 套件。

更新您的 CI

一旦你更新了專案,如果你使用預設的 MTP 並且依賴 dotnet test 來執行測試,你必須更新你的 CI 設定。 如需更多資訊並想了解所有必要的變更,請參閱「dotnet test 整合」

如果你使用的是 dotnet test 的 VSTest 模式,以下是在 Azure DevOps 中使用 DotNetCoreCLI 任務時的範例更新:

預設的 MSTest.Sdk 擴充設定檔會提供新增選項所需的 Microsoft.Testing.Extensions.TrxReportMicrosoft.Testing.Extensions.CodeCoverage 套件。 如果您選取 None 設定檔,請先啟用或參照這兩個擴充功能,再使用這些選項。

\- task: DotNetCoreCLI@2
  inputs:
    command: 'test'
    projects: '**/**.sln'
-    arguments: '--configuration Release'
+    arguments: '--configuration Release -- --report-trx --results-directory $(Agent.TempDirectory) --coverage'

反射源產生器

重要

以下 MSTest 4.4 的行為僅在預覽版中提供,直到 MSTest 4.4.0 版本釋出。

MSTest 4.3 在獨立版本的實驗 MSTest.SourceGeneration 套件中引入了反射源產生器。 從 MSTest 4.4 開始,套件從實驗階段升級,改用 MSTest 版本。

原生 AOT 專案會自動包含原始碼產生器。 對於使用 MSTest.Sdk 的非 NativeAOT 專案,請使用 <EnableMSTestSourceGeneration>true</EnableMSTestSourceGeneration> 啟用。 MSTest.Sdk 透過 MSTestVersion 對齊 MSTest.SourceGenerationMSTest.TestFrameworkMSTest.TestAdapter 的版本。

SDK 也支援可重用測試函式庫及使用中央套件管理的專案產生原始碼。 它提供匹配的 MSTest.TestAdapter 執行時鉤子並產生所需的 PackageVersion 項目。

.NET Standard 不支援這些執行時鉤子。 當你啟用 .NET Standard 目標的原始碼產生時,SDK 會回報以下錯誤:

.NET 標準目標框架不支援 MSTest 原始碼產生,因為所需的 MSTest.TestAdapter 執行時掛鉤無法使用。

原始碼產生器會在編譯時發現測試。 當產生元處於啟用狀態時,測試類別必須直接宣告 [TestClass] ,而非繼承。 MSTEST0069 分析器會標示依賴繼承而來的 [TestClass] 的類別。

從 MSTest 4.3.2 開始,MSTestSourceGenMode 在已裁剪的專案和原生 AOT 專案中預設為 ReflectionFree。 此模式在支援測試形狀時使用產生的元資料與調用器。 在支援反射的執行階段上,對於不受支援或缺少的產生項目,MSTest 會改用反射。

從 MSTest 4.4 起,無反射生成實現完整的繼承屬性元資料,包括 AttributeUsageAllowMultiple。 在 MTP 中,它可以略過對單純的同步 [TestMethod][DataRow] 方法進行執行階段的發現與驗證。 非同步測試、自訂測試方法屬性、自訂 DynamicData 實作、自訂 ITestDataSource 實作,以及不明確的測試形式皆採用備援路徑。 VSTest 也保留了其現有路徑。

無反射模式會報告以下診斷結果:

ID 不支援的測試圖形
AOTSG0001 靜態測試類別
AOTSG0002 開啟泛型測試類別,包括巢狀於泛型型別中的類別
AOTSG0003 產生的程式碼無法存取的類別,包括檔案區域類別,以及私有或私有受保護的巢狀類別
AOTSG0004 通用測試方法
AOTSG0005 參數為 refinout 的測試方法

實驗性功能

以下MSTest 4.3功能為 實驗性質。 其公開 API 可能會有所變更,且僅會透過實驗性診斷功能提供。 要選擇加入,請確認對應的診斷ID。

以程式設計方式進行測試篩選 ITestFilter

注意

於 MSTest 4.3.0(實驗性)中引入。

實驗性 ITestFilter 延伸點可透過 [TestFilterProviderAttribute] 註冊,讓你在載入任何測試類別之前,以程式方式決定是否執行各個測試。 這對於無法用命令列濾波器表達的自訂選擇邏輯非常有用。

實作 ITestFilter.Filter(TestFilterContext) 可在不載入測試類別的情況下檢查元資料:

public sealed class MyFilter : ITestFilter
{
    public TestFilterResult Filter(TestFilterContext context) =>
        context.DisplayName.Contains("Nightly", StringComparison.Ordinal)
            ? TestFilterResult.Run : TestFilterResult.Drop;
}

輸入 TestFilterResult.Run 以執行測試,輸入 Drop 以省略且不產生結果,或輸入 Skip(reason) 以回報已略過的結果。 MSTest 可以同時呼叫一個過濾實例,因此實作必須是執行緒安全的。 命令列與測試瀏覽器過濾器會在 之前執行 ITestFilter,而 [Ignore] 在 之後進行評估。

從 MSTest 4.4 開始,.NET 專案可以使用通用且型別安全的註冊表單[assembly: TestFilterProvider<MyFilter>]。 接著,編譯器會強制要求 MyFilter 實作 ITestFilter,並具有公用的無參數建構函式。 .NET Framework 無法使用通用屬性。 對於多目標專案,選擇帶有目標框架預處理器符號的通用或非通用形式。

#if NET
[assembly: TestFilterProvider<MyFilter>]
#else
[assembly: TestFilterProvider(typeof(MyFilter))]
#endif

從 MSTest 4.4 起, MSTEST0081 分析儀會完整驗證非通用註冊表。 對於通用型態,它仍會回報註冊多個提供者的通用過濾器類型與組件。

TestRun.Current 以及計畫中的測試

注意

於 MSTest 4.3.0(實驗性)中引入。

實驗性 TestRun.Current API(來自 RFC 014)會公開目前這次執行的相關資訊,包括已規劃的測試集合,讓擴充功能和測試夾具可以檢查預定要執行的項目。

已知限制

NuGet 提供的 MSBuild SDK(包括 MSTest.Sdk)在更新版本時支援有限工具,導致一般用於管理 NuGet 套件的 NuGet 更新和 Visual Studio UI 無法如預期運作。 你需要手動更新 global.json 檔案和 project 檔案的版本。 (即使使用 Dependabot,這也同樣適用,因為問題dependabot-core#12824dependabot-core#8615。)

另請參閱