Microsoft Fakes を使用してテスト対象のコードを分離する

コードの分離は、多くの場合、Microsoft Fakes などのツールを使用して実装されるテスト戦略であり、テストするコードはアプリケーションの残りの部分から分離されます。 この分離は、テスト対象のコードと対話するアプリケーションの部分をスタブまたは shim に置き換えることで実現されます。 これらはテストによって制御される小さなコードであり、置き換える実際の部分の動作をシミュレートします。

この方法の利点は、コードの特定の機能を分離してテストすることに集中できる点です。 テストが失敗した場合、原因は分離されたコード内にあり、他のコード内にはないことがわかります。 さらに、Microsoft Fakes によって提供されるスタブと shim を使用すると、アプリケーションの他の部分がまだ機能していない場合でもコードをテストできます。

Requirements

Note

Visual Studioを使用したプロファイリングは、Microsoft Fakes を使用するテストでは使用できません。

コード分離におけるMicrosoft偽物の役割

Microsoft Fakes は、スタブと shim という 2 つのメカニズムを提供することで、コード分離において重要な役割を果たします。

  • スタブ: これらは、クラスを同じインターフェイスを実装する小さな置き換えで置き換えるために使用されます。 そのためには、各コンポーネントが他のコンポーネントではなくインターフェイスのみに依存するようにアプリケーションを設計する必要があります。

  • Shim: これらは、実行時にアプリケーションのコンパイル済みコードを変更するために使用されます。 アプリケーションは、指定したメソッド呼び出しを行う代わりに、テストで提供される shim コードを実行します。 shim は、変更できないアセンブリの呼び出し (アセンブリ.NETなど) に置き換えることができます。

通常、スタブはVisual Studio ソリューション内の呼び出しに使用され、他の参照アセンブリの呼び出しには shim が使用されます。 これは、ソリューション内では、スタブ処理で必要な方法でインターフェイスを定義してコンポーネントを分離することをお勧めします。 ただし、外部アセンブリには個別のインターフェイス定義が含まれていないことが多いため、shim が代わりに使用されます。

他のコンポーネントを置き換える Fakes を示す図。

スタブを使用するタイミングに関する推奨事項

スタブは通常、Visual Studio ソリューション内の呼び出しに使用されます。スタブに必要な方法でインターフェイスを定義してコンポーネントを分離することをお勧めします。 ただし、System.dllなどの外部アセンブリは、通常、個別のインターフェイス定義では提供されないため、代わりに shim が使用されます。

スタブを使用するには、異なるコンポーネントが相互に依存するのではなく、インターフェイス定義のみに依存するようにアプリケーションを設計する必要があります。 この分離により、アプリケーションの堅牢性と柔軟性が高くなり、テスト目的でテスト対象のコンポーネントをインターフェイスのスタブ実装に接続できます。

実際には、Visual Studioのインターフェイス定義からスタブ型を生成し、実際のコンポーネントをテストのスタブに置き換えることができます。

Shim を使用するタイミングに関する推奨事項

スタブはVisual Studio ソリューション内の呼び出しに使用されますが、shim は通常、他の参照アセンブリの呼び出しに使用されます。 これは、通常、System.dll などの外部アセンブリには個別のインターフェイス定義が用意されていないため、shim を代わりに使用する必要があるためです。

ただし、shim を使用する場合は、いくつかの要因を考慮する必要があります。

パフォーマンス: Shim は実行時にコードを書き直すので、動作が遅くなります。 スタブにはこのパフォーマンス オーバーヘッドがなく、仮想メソッドを実行できるのと同じくらい高速です。

静的メソッド、シール型: スタブのみを使用してインターフェイスを実装できます。 そのため、スタブ型は、静的メソッド、非仮想メソッド、シールされた仮想メソッド、シール型のメソッドなどには使用できません。

内部型: スタブと shim の両方を、アセンブリ属性 InternalsVisibleToAttributeを使用してアクセス可能にする内部型で使用できます。

プライベート メソッド: Shim は、メソッド シグネチャのすべての型が表示されている場合、プライベート メソッドの呼び出しを置き換えることができます。 スタブは、表示されているメソッドのみを置き換えることができます。

インターフェイスと抽象メソッド: スタブは、テストで使用できるインターフェイスと抽象メソッドの実装を提供します。 Shim にはメソッド本体がないため、インターフェイスと抽象メソッドをインストルメント化できません。


.NET フレームワークの Microsoft Fakes を SDK-Style プロジェクトに移行する

Microsoft Fakes を使用する .NET Framework テスト プロジェクトを SDK スタイルの .NET Framework、.NET Core、または .NET 5 以上のプロジェクトに切り替える。

.NET Core または .NET 5.0 に移行するには、Microsoft Fakes 用に設定された .NET Framework の変更を最小限に抑える必要があります。 考慮する必要があるケースは次のとおりです。

  • カスタム プロジェクト テンプレートを使用している場合は、SDK スタイルであり、互換性のあるターゲット フレームワーク用にビルドされていることを確認する必要があります。

  • 特定の型は、.NET Framework と .NET Core/.NET 5.0 の異なるアセンブリに存在します (例: System.DateTimeは、.NET Framework の System/mscorlib に存在し、.NET Core と .NET 5.0) の System.Runtime) に存在し、これらのシナリオでは、偽のアセンブリを変更する必要があります。

  • fakes アセンブリとテスト プロジェクトへのアセンブリ参照がある場合は、次のような参照が見つからないことを示すビルド警告が表示されることがあります。

    (ResolveAssemblyReferences target) ->
    warning MSB3245: Could not resolve this reference. Could not locate the assembly "AssemblyName.Fakes". Check to make sure the assembly exists on disk.
    If this reference is required by your code, you may get compilation errors.
    

    この警告は、Fakes の生成で必要な変更が行われたためであり、無視できます。 ビルド中に暗黙的に追加するため、プロジェクト ファイルからアセンブリ参照を削除することで回避できます。

Microsoft Fakes テストの実行

Microsoft Fakes アセンブリが構成済みの FakesAssemblies ディレクトリ (既定値は $(ProjectDir)FakesAssemblies) に存在する限り、vstest タスクを使用してテストを実行できます。

Microsoft Fakes を使用する vstest タスク .NET Core および .NET 5 以上のプロジェクトを使用した分散テストには、Visual Studio 2019 Update 9 Preview 20201020-06 以降が必要です。

異なる.NETおよびVisual StudioバージョンでのMicrosoftフェイクの互換性とサポート

.NET Framework (SDK 以外のスタイル) を対象とする古いプロジェクトで Fakes をMicrosoftします。

  • Microsoft Fakes アセンブリの生成は、Visual Studio Enterprise 2015 以降でサポートされています。
  • Microsoft Fakes テストは、使用可能なすべてのMicrosoftで実行できます。TestPlatform NuGet パッケージ。
  • コード カバレッジは、Visual Studio Enterprise 2015 以降で Microsoft Fakes を使用するテスト プロジェクトでサポートされています。

SDK スタイルの .NET Framework、.NET Core、.NET 5.0 以降のプロジェクトで Fakes をMicrosoftする

  • Microsoft Fakes アセンブリの生成は、Visual Studio Enterprise 2019 Update 6 でプレビューされており、Update 8 では既定で有効になっています。
  • Microsoft.NET Framework を対象とするプロジェクトの Fakes テストは、使用可能なすべてのMicrosoftで実行できます。TestPlatform NuGet パッケージ。
  • .NET Core および .NET 5.0 以降を対象とするプロジェクトのMicrosoft Fakes テストは、Microsoftで実行できます。バージョン 16.9.0-preview-20210106-01 以降を含む TestPlatform NuGet パッケージ。
  • コード カバレッジは、Visual Studio Enterprise バージョン 2015 以降で Microsoft Fakes を使用して、.NET Framework を対象とするテスト プロジェクトでサポートされています。
  • Microsoft Fakes を使用した .NET Core および .NET 5.0 以降を対象とするテスト プロジェクトのコード カバレッジ サポートは、Visual Studio 2019 更新プログラム 9 以降で利用できます。