MSTest SDK の構成

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

重要

既定では、MSTest.Sdk はMTP 付き MSTest ランナーを使用し、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 では次の 2 つの機能が導入されています。

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) を有効にするには、次のプロパティ EnableMicrosoftTestingExtensionsCrashDumptrue に設定することができます。

<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 から入手できます。

プロパティ EnableAspireTestingtrue に設定すると、 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 から入手できます。

プロパティ EnablePlaywrighttrue に設定すると、 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 タスクを使用する場合の更新例を次に示します。

\- 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 以降、トリミングされたプロジェクトおよび Native AOT プロジェクトでは、MSTestSourceGenMode は既定で ReflectionFree になります。

MSTest 4.4 以降、リフレクションフリー生成では、 AttributeUsageAllowMultipleを含む、完全な継承された属性メタデータが具体化されます。 ジェネレーターがメタデータを静的に具体化できない場合、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 は 1 つのフィルター インスタンスを同時に呼び出すことができるため、実装はスレッド セーフである必要があります。 コマンド ライン フィルターとテスト エクスプローラー フィルターは、 ITestFilter前に実行されますが、 [Ignore] は後で評価されます。

MSTest 4.4 以降、.NET プロジェクトでは、汎用のタイプ セーフな登録フォーム [assembly: TestFilterProvider<MyFilter>]を使用できます。 その後、コンパイラは、 MyFilterITestFilter を実装し、パラメーターなしのパブリック コンストラクターを持っていることを強制します。 ジェネリック属性は、.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 を使用した場合でも適用されます)。

関連項目