MSTest SDK の構成

この記事では、MSTest.Sdk の高度な構成オプションについて説明します。 基本セットアップと開始方法については、MSTest の開始方法を参照してください。

重要

既定では、MSTest.Sdk はMTP 付き MSTest ランナーを使用し、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> に切り替えることができます。

Windows アプリケーション モデルをテストする

MSTest.Sdk 4.5 以降、既定の MTP ランナーでは、次のWindows アプリケーション モデルがサポートされています。

  • uap10.0を対象とする従来の UWP プロジェクト。
  • .NET 10 を使用し、UseUwpをtrueに設定する最新の UWP プロジェクト。
  • パッケージ化された完全信頼 WinUI 3 プロジェクト。
  • パッケージ化されていない WinUI 3 プロジェクト。
  • packagedClassicApp を設定する WinUI 3 TrustLevel="appContainer" プロジェクト。

MSTest.Sdk は、互換性のある MTP 2.5 コンポーネントを提供し、パッケージ化されたテスト ホストと AppContainer テスト ホスト用の完全信頼アプリ モデル サイドカーを開始します。 サイドカーはパッケージを登録し、AUMID によって選択されたアプリケーションをアクティブ化し、AppContainer 通信用の正確なパッケージ SID を承認し、パッケージ ストレージから結果成果物を回復します。

UWP プロジェクトでは、ビルド時のサポートのために、Visual Studio UWP ワークロードとデスクトップ MSBuild が引き続き必要です。 Microsoft.NET.Test.Sdk、vstest.console、または Visual Studio UWP テスト ランタイム プロバイダーは必要ありません。

プロジェクトの構成、コマンドの実行、サンプルについては、「 MSTest と MTP を使用して UWP アプリと WinUI 3 アプリをテストする」を参照してください。

MSTest.Sdk 4.5 プレビュー以降では、EnableWindowsUIAutomationを true に設定して、一致するMSTest.Windows.UIAutomation パッケージをWindows対象プロジェクトに追加します。 この機能は、UWP または WinUI アプリ内でテストをホストするのではなく、パッケージ化されていない外部の Win32、Windows フォーム、またはWPF アプリケーションを起動して自動化します。 詳細については、「MSTest UI オートメーション を使用してデスクトップ アプリWindowsテストする」を参照してください。

MTP の拡張

一連の NuGet パッケージ拡張機能を使用して MTP エクスペリエンスをカスタマイズできます。 このエクスペリエンスを簡素化および改善するために、MSTest SDK では次の 2 つの機能が導入されています。

MSTest 4.4 以降、MSTest アダプターはネイティブ MTP 統合を使用し、 Microsoft.Testing.Extensions.VSTestBridgeに依存しなくなりました。 MTP テスト アプリケーションが VSTest アダプターを介してフレームワークを実行する必要がある場合にのみ、ブリッジを明示的に参照します。

Microsoft.Testing.Platform プロファイル

profiles の概念では、テスト projectに適用される構成と拡張機能の既定のセットを選択できます。

プロファイルを設定するには、プロパティ TestingExtensionsProfile を使用して以下の 3 つのプロファイルのいずれかを指定します。

  • None - 拡張機能は何も有効化されません。

  • Default - このバージョンの MSTest.SDK に対して推奨される拡張機能が有効になります。 これは、プロパティが明示的に設定されていない場合の既定値です。

    以下の拡張機能が有効になります。

  • AllMicrosoft- 制限付きのライセンスの拡張機能を含め、標準で幅広く利用できるよう選定された Microsoft 拡張機能を有効にします。 試験的および API 専用の拡張機能では、引き続き明示的なオプトインが必要な場合があります。

    Default プロファイルのすべての拡張機能と、次の拡張機能を有効にします。

    MSTest.Sdk バージョン 3.11.0 から 4.2.x では、Azure DevOps レポート拡張機能はAllMicrosoftにのみ含まれます。

注

プロファイルはAzure DevOps レポート パッケージと GitHub Actions レポート パッケージを参照しますが、実行時にレポートは無効のままです。 --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 レポート ✔️³ ✔️²

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

拡張機能を有効または無効にする

拡張機能を有効または無効にするには、Enable[NugetPackageNameWithoutDots] というパターンの MSBuild のプロパティを使用します。

たとえば、クラッシュ ダンプ拡張機能 (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 プロファイルや 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 レポート パッケージと GitHub Actions レポート パッケージを参照します。 パッケージ参照を削除するには、 <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でテストする

プレイライトは、最新の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 に移行するために必要な次の手順を検討してください。

projectを更新する

既存の 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 integrationを参照してください。

dotnet test の VSTest モードを使用している場合、Azure DevOpsで DotNetCoreCLI タスクを使用する場合の更新例を次に示します。

既定の MSTest.Sdk 拡張機能プロファイルは、追加されたオプションで必要な Microsoft.Testing.Extensions.TrxReport パッケージと Microsoft.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.3 では、独立バージョン管理された試験的な MSTest.SourceGeneration パッケージにリフレクション ソース ジェネレーターが導入されました。 MSTest 4.4 以降、パッケージは試験段階の状態から卒業し、MSTest バージョンを使用します。

ネイティブ AOT プロジェクトには、ソース ジェネレーターが自動的に含まれます。 MSTest.Sdk を使用する NativeAOT 以外のプロジェクトの場合は、 <EnableMSTestSourceGeneration>true</EnableMSTestSourceGeneration>を使用してオプトインします。 MSTest.Sdk は、 MSTest.SourceGeneration、 MSTest.TestFramework、および MSTest.TestAdapter のバージョンを MSTestVersionに合わせて調整します。

SDK では、中央パッケージ管理を使用する再利用可能なテスト ライブラリとプロジェクトでのソース生成もサポートされています。 一致 MSTest.TestAdapter ランタイム フックを提供し、必要な PackageVersion 項目を生成します。

.NET Standard では、これらのランタイム フックはサポートされていません。 .NET Standard ターゲットのソース生成を有効にすると、SDK によって次のエラーが報告されます。

必要な MSTest.TestAdapter ランタイム フックが使用できないため、.NET Standard ターゲット フレームワークでは MSTest ソースの生成はサポートされていません。

ソース ジェネレーターは、コンパイル時にテストを検出します。 ジェネレーターがアクティブな場合、テスト クラスは [TestClass] を継承するのではなく、直接宣言する必要があります。 MSTEST0069 アナライザーは、継承された[TestClass]に依存するクラスにフラグを設定します。

MSTest 4.3.2 以降、トリミングされたプロジェクトおよび Native AOT プロジェクトでは、MSTestSourceGenMode は既定で ReflectionFree になります。 このモードでは、テスト形状をサポートしている場合に、生成されたメタデータとインボーカーを使用します。 リフレクションをサポートするランタイムでは、MSTest は、サポートされていない生成エントリ、または存在しない生成エントリに対して、リフレクションにフォールバックします。

MSTest 4.4 以降、リフレクションフリー生成では、 AttributeUsage や AllowMultipleを含む、完全な継承された属性メタデータが具体化されます。 MTP では、プレーンな同期 [TestMethod] および [DataRow] メソッドの実行時の検出と検証をバイパスできます。 非同期テスト、カスタム テスト メソッド属性、 DynamicData、カスタム ITestDataSource 実装、あいまいなテスト図形では、フォールバック パスが使用されます。 VSTest は既存のパスも保持します。

リフレクションフリー モードでは、次の診断が報告されます。

ID サポートされていないテスト図形
AOTSG0001 静的テストクラス
AOTSG0002 ジェネリック型で入れ子になったクラスを含む、ジェネリック テスト クラスを開く
AOTSG0003 生成されたコードがアクセスできないクラス (ファイル ローカル クラス、プライベートまたはプライベートで保護された入れ子など)
AOTSG0004 ジェネリック テスト メソッド
AOTSG0005 ref、in、または out パラメーターを使用したテスト メソッド

実験的な機能

次の 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 は 1 つのフィルター インスタンスを同時に呼び出すことができるため、実装はスレッド セーフである必要があります。 コマンド ライン フィルターとテスト エクスプローラー フィルターは、 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-core#12824 および dependabot-core#8615 が原因で Dependabot を使用した場合でも適用されます)。

関連項目