本文介紹了 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 版本的建議延伸模組。 當屬性未明確設定時,這會是預設值。開啟下列延伸模組:
AllMicrosoft- 啟用 Microsoft 所推出的所有擴充功能(包括帶有限制性授權的擴充功能)。開啟下列延伸模組:
以下是使用 None 設定檔的完整範例:
<Project Sdk="MSTest.Sdk/4.1.0">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<TestingExtensionsProfile>None</TestingExtensionsProfile>
</PropertyGroup>
</Project>
| 擴展/個人資料設定 | 沒有 | 預設 | AllMicrosoft |
|---|---|---|---|
| 程式代碼涵蓋範圍 | ✔️ | ✔️ | |
| 當機記憶體轉儲 | ✔️ | ||
| 假貨 | ✔️¹ | ||
| 暫停傾倒 | ✔️ | ||
| 即時重載 | ✔️ | ||
| 重試 | ✔️ | ||
| Trx | ✔️ | ✔️ | |
| AzureDevOpsReport | ✔️² |
¹ MSTest.Sdk 3.7.0+ ² MSTest.Sdk 3.11.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 功能。
從 MSTest.Sdk 4.3 開始,啟用實驗性的 JUnit 報告擴充功能,然後<EnableMicrosoftTestingExtensionsJUnitReport>true</EnableMicrosoftTestingExtensionsJUnitReport>--report-junit執行測試應用程式時通過。 此擴充功能僅在 Microsoft 上提供。Testing.Platform 並未包含在 Default OR AllMicrosoft 設定檔中。
警告
請務必檢查每個擴充功能的授權條款,因為它們可能會有所不同。
啟用和停用的擴充功能會與您所選擇的擴充功能設定檔提供的擴充功能結合。
這個屬性模式可以用來在隱式 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 還提供額外的功能,以簡化和提升測試體驗。
使用 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 預設是 ReflectionFree 針對修剪和原生 AOT 專案。
從 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。)