次の方法で共有


Microsoft.Testing.Platform アーキテクチャ

新しいテスト プラットフォームへようこそ。 その機能を理解しやすくするために、まず、テストを登録して実行する方法を示す簡単な例から始めます。 この基本的な例では、コア機能と、すぐに開始する方法を確実に理解できます。

この記事のすべての概念は、完全なサンプルとして Microsoft Test Framework リポジトリで例示されています。 詳細については、 サンプル コードを参照してください。

手順 1: 単純なテスト アプリケーションを登録して実行する

この最初の例では、テスト アプリケーションを宣言して実行するための基本的な手順について説明します。 この簡単な方法により、最小限のセットアップでプラットフォームの使用をすぐに開始できます。

手順 2: プラットフォームの拡張

最初のテスト アプリケーションを作成する方法を確認したら、拡張機能の例を調べて、テスト アプリケーション拡張機能を取り巻く概念の一部を説明します。

手順 3: 拡張ポイントの包括的な概要

基本に慣れたら、さまざまな拡張ポイントを掘り下げます。 これには以下が含まれます。

  1. プラットフォームとテスト フレームワークの機能: プラットフォームとテスト フレームワークによって提供されるあらゆる機能を理解し、それらを効果的に活用できます。

  2. カスタム テスト フレームワーク: カスタム テスト フレームワークを記述して登録する方法。テスト環境を特定の要件に合わせて調整できます。

  3. In-Process およびアウトプロセス拡張機能: インプロセス拡張機能とアウトプロセス拡張機能の両方を記述および登録する方法の詳細な手順により、プラットフォームを拡張する方法に柔軟性が提供されます。

  4. 実行順序: カスタム拡張機能のシームレスな統合と操作を保証するために、さまざまな拡張ポイントの実行順序を明確にします。

手順 4: 利用可能なサービスとヘルパー

最後に、プラットフォーム内で使用可能なサービスとヘルパー関数の完全な一覧を確認します。 このセクションは、すべてのツールを自由に活用して、堅牢で効率的なテスト拡張機能を作成するのに役立つリファレンスとして機能します。

この構造化されたアプローチに従うことで、基本的な使用方法から高度なカスタマイズまで、テスト プラットフォームの包括的な理解を得ることができます。 始めて、プラットフォームが提供できる可能性を最大限に引き出しましょう。

手順 1: 単純なテスト アプリケーションを登録して実行する

このドキュメントでは、テスト プラットフォームのアーキテクチャを紹介するために、ホストとしてクラシック コンソール アプリケーション (Windows 用) を使用します。 このドキュメントのサンプルは C# で記述されていますが、.NET Ecma 仕様をサポートする任意の言語でテスト プラットフォームを使用し、.NET でサポートされている任意の OS で実行できます。 プラットフォームを使用するには、 Microsoft.Testing.Platform.dll アセンブリを参照するだけです。このアセンブリは、 https://www.nuget.org/packages/Microsoft.Testing.Platformで入手できる公式の NuGet パッケージを通じて使用できます。

コンソール プロジェクト Contoso.UnitTests.exeでは、次の Main メソッドによってエントリ ポイントが定義されます。

public static async Task<int> Main(string[] args)
{
    ITestApplicationBuilder builder = await TestApplication.CreateBuilderAsync(args);
    
    builder.RegisterTestFramework();
    
    using ITestApplication testApp = await builder.BuildAsync();
    
    return await testApp.RunAsync();
}

このコードには、MSTest などのテスト フレームワークを RegisterTestFramework 経由で登録する場合を除き、テスト セッションの実行に必要なすべてのものが含まれます。 このコードについては、後のセクションで説明します。

既定の動作では、テスト プラットフォーム MSBuild タスクによってエントリ ポイントが自動的に生成されます。 これを行うには、 Microsoft.Testing.Platform.MSBuild パッケージをプロジェクトに追加します。

Contoso.UnitTests.exeアプリケーションが開始されると、標準の Windows プロセスが作成され、テスト プラットフォームは登録済みのテスト フレームワークと対話してテスト セッションを実行します。

この作業を実行するために、1 つのプロセスが作成されます。

テスト ホスト プロセスを表す図。

テスト プラットフォームには、次のようなテスト セッション情報をターミナルに書き込む組み込みのディスプレイ デバイスが含まれています。

Microsoft(R) Testing Platform Execution Command Line Tool
Version: 1.1.0+8c0a8fd8e (UTC 2024/04/03)
RuntimeInformation: win-x64 - .NET 9.0.0-preview.1.24080.9
Copyright(c) Microsoft Corporation.  All rights reserved.
Passed! - Failed: 0, Passed: 1, Skipped: 0, Total: 1, Duration: 5ms - Contoso.UnitTests.dll (win-x64 - .NET 9.0.0-preview.1.24080.9)

ITestApplication.RunAsync()呼び出しによって返される既知の終了コードは、プラットフォーム出口コードで詳しく説明されています。

手順 2: プラットフォームの拡張

テストの実行では、通常、コード カバレッジ情報または同様の情報を収集してコードの品質を評価します。 このようなワークロードでは、テスト ホスト プロセスの開始前に構成が必要になる場合があります (環境変数の設定など)。

テスト プラットフォームでは、 アウトプロセス 拡張機能を使用することで、これに対応します。 アウトプロセス拡張機能を使用して実行すると、テスト プラットフォームは複数のプロセスを開始し、適切に管理します。

次の例では、 TestHostController 拡張機能を使用してコード カバレッジ機能を登録する方法を示します。

ITestApplicationBuilder builder = await TestApplication.CreateBuilderAsync(args);

builder.RegisterTestFramework();
builder.AddCodeCoverage();

using ITestApplication testApp = await builder.BuildAsync();

return await testApp.RunAsync();

builder.AddCodeCoverage();は、プロセス外の拡張ポイントであるTestHostController拡張ポイントを内部的に使用します。

public static class TestApplicationBuilderExtensions
{
    public static ITestApplicationBuilder AddCodeCoverage(
        this ITestApplicationBuilder builder)
    {
        builder.TestHostControllers
               .AddEnvironmentVariableProvider(/* ... */);
        
        // ...
        
        return builder;
    }
}

api AddEnvironmentVariableProvider のパラメーターについては、後のセクションで説明します。

今回 Contoso.UnitTests.exe 実行すると、 TestHostController 拡張機能が登録されていることがテスト プラットフォームによって検出されます。 その結果、 Contoso.UnitTests.exe プロセスの別のインスタンスが子プロセスとして開始されます。 これは、 AddEnvironmentVariableProvider API に登録されている拡張機能で必要に応じて環境変数を適切に設定するために行われます。

プロセス レイアウトは次のようになります。

テスト ホストとテスト ホスト コントローラーのプロセス レイアウトを表す図。

この例では、開始プロセスを正しく処理し、すべてのコマンド ライン引数を子プロセスに伝達するコンソール アプリケーション レイアウトを想定しています。 別のホストを使用している場合は、エントリ ポイント コードによってプロセス エントリ ポイント ("Main") が適切なコード ブロックに正しく転送されるようにする必要があります。 ランタイムは、単に同じコマンド ライン引数を使用して起動します。

上記のセクションでは、テスト プラットフォームのアーキテクチャについて簡単に説明します。 現在の機能拡張ポイントは、次の 2 つのカテゴリに分かれています。

  1. インプロセス 拡張機能には、テスト アプリケーション ビルダーの TestHost プロパティを使用してアクセスできます。 イン プロセスとは、テスト フレームワークと同じプロセスで実行されることを意味します。

    ITestApplicationBuilder builder = await TestApplication.CreateBuilderAsync(args);
    
    builder.RegisterTestFramework();
    
    builder.TestHost.AddXXX(/* ... */);
    

    実際、最も重要な拡張ポイントは、インプロセス テスト フレームワーク (RegisterTestFramework) です。これは唯一 必須 のフレームワークです。

  2. プロセス外拡張機能 には、テスト アプリケーション ビルダーの TestHostControllers プロパティを使用してアクセスできます。 これらの拡張機能は、テスト フレームワークとは別のプロセスで実行され、"監視" されます。

    ITestApplicationBuilder builder = await TestApplication.CreateBuilderAsync(args);
    
    builder.TestHostControllers.AddXXX(/* ... */);
    

手順 3: 拡張ポイントの包括的な概要

まず、さまざまな拡張ポイントに進む前に、機能の概念を理解することから始めましょう。

手順 4: 利用可能なサービス

テスト プラットフォームは、テスト フレームワークと拡張ポイントの両方に貴重なサービスを提供します。 これらのサービスは、構成へのアクセス、コマンド ライン引数の解析と取得、ログ ファクトリの取得、ログ システムへのアクセスなどの一般的なニーズに対応します。 IServiceProvider は、テスト プラットフォームの サービス ロケーター パターン を実装します。

これらのサービスにアクセスして使用する方法に関するすべてのサービス、ヘルパー、技術情報は、 Microsoft.Testing.Platform Services のドキュメントに記載されています。