Microsoft Fakes を使用したテストでコードを分離する

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

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

要件

注意

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

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

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

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

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

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

Diagram that show Fakes replacing other components.

スタブを使う場合に関する推奨事項

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

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

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

shim を使う場合に関する推奨事項

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

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

パフォーマンス: shim の場合は実行時にコードを書き直すので、処理速度が遅くなります。 スタブの場合はこのようなパフォーマンス オーバーヘッドがないので、仮想メソッドの場合と同じように高速です。

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

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

プライベート メソッド: メソッド シグネチャですべての型が参照可能な場合、shim はプライベート メソッドの呼び出しを置き換えることができます。 スタブは、参照可能なメソッドのみを置き換えることができます。

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


.NET Framework の Microsoft Fakes を SDK スタイルのプロジェクトに移行する

Microsoft Fakes を使う .NET Framework テスト プロジェクトを SDK スタイルの .NET Framework、.NET Core、または .NET 5 以降のプロジェクトに移行する。

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

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

  • 特定の型が .NET Framework と .NET Core または .NET 5.0 の異なるアセンブリに存在する (たとえば、.NET Framework では System.DateTimeSystem/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 テストの実行

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

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

さまざまな .NET および Visual Studio バージョンでの Microsoft Fakes の互換性とサポート

.NET Framework をターゲットとする古いプロジェクト (非 SDK スタイル) における Microsoft Fakes

  • 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 以降のプロジェクトにおける Microsoft Fakes

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