本文介紹了 MSTest.Sdk 的進階設定選項。 如需基本設定和入門的說明,請參閱 MSTest 入門指南。
重要
預設情況下,MSTest.Sdk 使用 MSTest 執行器搭配 MTP,包括 dotnet 測試。 這需要修改你的 CI 和本地 CLI 呼叫,也會影響 .runsettings 的可用條目。 你可以 透過切換到 VSTest 來保留舊的整合和工具。
MSTest.Sdk 預設會將 EnableMSTestRunner 和 TestingPlatformDotnetTestSupport 設為 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 版本的建議延伸模組。 當屬性未明確設定時,這會是預設值。開啟下列延伸模組:
- 程式代碼涵蓋範圍
- Trx 報表
- Azure DevOps Report (MSTest.Sdk 4.3.0+)
- GitHub Actions 報告(實驗性及預發布版,MSTest.Sdk 4.3.0+)
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,您可以引入所有測試 using 和 Aspire 所需的依賴項和預設 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,您可以引入所有測試 using 和 Playwright 所需的依賴項和預設 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 任務時的範例更新:
\- task: DotNetCoreCLI@2
inputs:
command: 'test'
projects: '**/**.sln'
- arguments: '--configuration Release'
+ arguments: '--configuration Release -- --report-trx --results-directory $(Agent.TempDirectory) --coverage'
實驗性功能
以下MSTest 4.3功能為 實驗性質。 其公開 API 可能會變更,且是透過實驗性診斷提供,因此若要選擇啟用,則必須確認對應的診斷 ID。 請記得帶著這個前提使用它們。
反射源產生器
注意
於 MSTest 4.3.0(實驗性)中引入。
MSTest 反射來源產生器會在編譯時探索測試,而不是依賴執行階段反射,這使測試專案可與裁剪和原生 AOT 相容。 透過新增 MSTest.SourceGeneration 套件來啟用它。 當原始碼產生器啟動時,測試類別必須直接宣告 [TestClass] ,而非繼承; MSTEST0069 分析器會標記依賴繼承 [TestClass]的類別。
從 MSTest 4.3.2 開始,MSTestSourceGenMode 在已裁剪的專案和原生 AOT 專案中預設為 ReflectionFree。
從 MSTest 4.4 起,無反射生成實現完整的繼承屬性元資料,包括 AttributeUsage 和 AllowMultiple。 當產生器無法靜態實現元資料時,MSTest 會退回到執行時支援的反射模式。
以程式設計方式進行測試篩選 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#12824 和 dependabot-core#8615。)