Live Unit Testing についてよく寄せられる質問

サポートされるフレームワーク

Live Unit Testing でサポートされているテスト フレームワークは何ですか? また、サポートされている最小バージョンはいくつですか?

Live Unit Testing は、次の表に示されている 3 つの一般的な単体テスト フレームワークで動作します。 アダプターやフレームワークのサポートされる最小バージョンも表に示されています。 単体テスト フレームワークはすべて NuGet.org から入手できます。

テスト フレームワーク Visual Studio アダプターの最小バージョン フレームワークの最小バージョン
xUnit.net xunit.runner.visualstudio バージョン 2.2.0-beta3-build1187 xunit 1.9.2
NUnit NUnit3TestAdapter バージョン 3.7.0 NUnit バージョン 3.5.0
MSTest MSTest.TestAdapter 1.1.4-preview MSTest.TestFramework 1.0.5-preview

古い MSTest に基づくテスト プロジェクトで Microsoft.VisualStudio.QualityTools.UnitTestFramework が参照されていて、新しい MSTest NuGet パッケージに移行したくない場合は、Visual Studio 2019 または Visual Studio 2017 にアップグレードしてください。

.NET Core サポート

Live Unit Testing は .NET Core で動作しますか?

はい。 Live Unit Testing は、.NET Core と .NET Framework で動作します。

構成

Live Unit Testing を有効にしても動作しないのはなぜですか?

出力ウィンドウ (Live Unit Testing ドロップダウンを選んだとき) に、Live Unit Testing が動作しない理由が表示されているはずです。 Live Unit Testing は、次のいずれかの理由で動作しない可能性があります。

  • ソリューションのプロジェクトによって参照されている NuGet パッケージが復元されていない Live Unit Testing は動作しません。 Live Unit Testing を有効にする前に、ソリューションを明示的にビルドをするか、ソリューションで NuGet パッケージを復元することによりこの問題は解決するはずです。

  • MSTest ベースのテストをプロジェクトで使っている場合、Microsoft.VisualStudio.QualityTools.UnitTestFramework への参照を削除し、最新の MSTest NuGet パッケージ MSTest.TestAdapter (1.1.11 以降のバージョンが必要) および MSTest.TestFramework (1.1.11 以降のバージョンが必要) への参照を追加してあることを確認します。 詳しくは、「Visual Studio での Live Unit Testing」記事の「サポートされるテスト フレームワーク」セクションをご覧ください。

  • ソリューションの少なくとも 1 つのプロジェクトに、NuGet の参照、または xUnit、NUnit、MSTest のいずれかのテスト フレームワークへの直接参照が存在する必要があります。 このプロジェクトは、対応する Visual Studio テスト アダプター NuGet パッケージを参照する必要もあります。

プロジェクトがビルドされないのはなぜですか?

[Live Unit Testing] ドロップダウンが選択されていると、ビルド エラーが出力ウィンドウに報告されます。 セットアップ ウィザードの構成が正しくないため、Live Unit Testing でビルドできなくする問題が発生することが知られています。

  • ワークスペース ルート プロパティが長すぎる場合、パスが長すぎることを示す例外が原因でビルドが失敗する可能性があります。

  • リポジトリ ルート プロパティがリポジトリのルートを指していない場合、ワークスペースには一連の間違ったファイルが設定されます。

  • git リポジトリの場合、Exclude files プロパティを使用すると通常、gitignore ファイルで指定されたファイルのコピーが回避されます。 ただし、無視されるファイルを Git リポジトリにチェックインできます。あるいは、ファイルを自動生成するツールを実行することもできますが、ファイルはビルド中に生成されません。 このような場合、<[カスタム]> オプションを選択し、成果物フォルダーのみをリストアップするカスタム ルールのセットをリストアップしてください。

前に説明した問題に加え、次のプロジェクト構成が正しくビルドされない可能性があります。

  • プロジェクトの依存関係がグローバル ソリューション構成として指定されており、各プロジェクトの ProjectReferences としては指定されていない場合、Live Unit Testing の結果、間違ったプロジェクト セットがビルドされる可能性があります。 これを修正するには、プロジェクト間に明示的な参照を追加します。

  • Live Unit Testing プレイリストが選択されるまで、Live Unit Testing でプロジェクトがビルドされません。 これを修正するには、Live Unit Testing プレイリストにいくつかのテストを含めます。

  • MSTest ベースのテストをプロジェクトで使っている場合、Microsoft.VisualStudio.QualityTools.UnitTestFramework への参照を削除し、最新の MSTest NuGet パッケージ MSTest.TestAdapter (1.1.11 以降のバージョンが必要) と MSTest.TestFramework (1.1.11 以降のバージョンが必要) への参照を追加してあることを確認します。 詳細については、「サポートされているテスト フレームワーク」を参照してください。

  • ソリューションの少なくとも 1 つのプロジェクトに、NuGet の参照、または xUnit、NUnit、MSTest のいずれかのテスト フレームワークへの直接参照が存在する必要があります。 このプロジェクトは、対応する Visual Studio テスト アダプター NuGet パッケージを参照する必要もあります。 Visual Studio テスト アダプターは、 .runsettings ファイルから参照することもできます。 .runsettings ファイルには、次の例のようなエントリが必要です。

<RunSettings>
    <RunConfiguration>
          <TestAdaptersPaths>path-to-your-test-adapter</TestAdaptersPaths>
    </RunConfiguration>
</RunSettings>

テストの実行に失敗するのはなぜですか?

  • 一般的な問題は、一部のファイルがテスト フォルダーにコピーされないということです。 場合によっては、csproj ファイルに Live Unit Testing のテスト依存関係項目を追加する必要があります。

  • もう 1 つの問題はタイムアウトです。 Live Unit Testing ではテストが無期限に実行されるため、テストの実行時間が長すぎると、自動的に実行が中止されます。 プロジェクトのウィザードでタイムアウト値を増やすことができます。

アップグレード後の正しくないカバレッジ

Visual Studio プロジェクトで参照されているテスト アダプターをサポートされているバージョンにアップグレードした後、Live Unit Testing に正しくないカバレッジが表示されるのはなぜですか?

  • ソリューションの複数のプロジェクトが NuGet テスト アダプター パッケージを参照している場合は、それぞれをサポートされるバージョンにアップグレードする必要があります。

  • テスト アダプター パッケージからインポートされた MSBuild の .props ファイルも正しく更新されていることを確認してください。 インポートの NuGet パッケージのバージョン/パスを確認します。通常これは、次のように、プロジェクト ファイルの上部近くに表示されます。

      <Import Project="..\packages\xunit.runner.visualstudio.2.2.0\build\net20\xunit.runner.visualstudio.props" Condition="Exists('..\packages\xunit.runner.visualstudio.2.2.0\build\net20\xunit.runner.visualstudio.props')" />
    

ビルドのカスタマイズ

Live Unit Testing のビルドをカスタマイズできますか?

"標準の" インストルメント化されていないビルドには必要ないインストルメンテーション (Live Unit Testing) 用にビルドするためのカスタム手順がソリューションに必要な場合、BuildingForLiveUnitTesting プロパティを調べてビルド前/後のカスタム手順を行うコードを、プロジェクトまたは .targets ファイルに追加できます。 また、このプロジェクト プロパティに基づいて、Live Unit Testing のビルドから特定のビルド手順 (パッケージの発行や生成など) を削除したり、Live Unit Testing にビルド手順 (前提条件のコピーなど) を追加したりすることもできます。 このプロパティに基づいてビルドをカスタマイズしても、標準のビルドは変更されず、Live Unit Testing のビルドのみが影響を受けます。

たとえば、標準のビルドの間に NuGet パッケージを生成するターゲットがあるものとします。 おそらく、編集のたびに NuGet パッケージを生成する必要はありません。 そのような場合、次のようにして、Live Unit Testing のビルドでそのターゲットを無効にできます。

<Target Name="GenerateNuGetPackages" BeforeTargets="AfterBuild" Condition="'$(BuildingForLiveUnitTesting)' != 'true'">
    <Exec Command='"$(MSBuildThisFileDirectory)..\tools\GenPac" '/>
</Target>

テスト エクスプローラーと Live Unit Testing

[テスト エクスプローラー] ウィンドウと Live Unit Testing では、テストの実行方法はどのように違いますか?

いくつか違いがあります。

  • [テスト エクスプローラー] ウィンドウからテストを実行またはデバッグすると標準バイナリが実行されますが、Live Unit Testing ではインストルメント化されたバイナリが実行されます。 インストルメント化されたバイナリをデバッグする場合、テスト メソッドに Debugger.Launch メソッドの呼び出しを追加し、そのメソッドが実行されると常にデバッガーが起動されるようにすることで (Live Unit Testing によって実行される場合を含みます)、インストルメント化されたバイナリをアタッチしてデバッグできます。 ただし、ほとんどのユーザー シナリオについてインストルメンテーションが透過的で、インストルメント化されたバイナリをデバッグする必要がないようにするのが理想的です。

  • Live Unit Testing ではテストを実行するための新しいアプリケーション ドメインは作成されませんが、[テスト エクスプローラー] ウィンドウから実行されたテストでは新しいアプリケーション ドメインが作成されます。

  • Live Unit Testing では、各テスト アセンブリで順番にテストが実行されます。 テスト エクスプローラーで、複数のテストの並列実行を選択できます。

  • 既定では、テスト エクスプローラーによるテストはシングルスレッド アパートメント (STA) で実行されるのに対し、Live Unit Testing によるテストはマルチスレッド アパートメント (MTA) で実行されます。 Live Unit Testing において MSTest テストを STA で実行するには、テスト メソッドまたはそれを含むクラスを、MSTest.STAExtensions 1.0.3-beta NuGet パッケージに含まれる <STATestMethod> または <STATestClass> 属性で修飾します。 NUnit の場合はテスト メソッドを <RequiresThread(ApartmentState.STA)> 属性で修飾し、xUnit の場合は <STAFact> 属性で修飾します。

テストの除外

Live Unit Testing からテストを除外するにはどうすればよいですか?

ユーザー固有の設定については、「Visual Studio での Live Unit Testing」記事の「テスト プロジェクトとテスト メソッドを含めるか除外する」セクションをご覧ください。 テストを含めるまたは除外すると、特定の編集セッションに対して特定のテスト セットを実行したい場合、または個人設定を維持したい場合に便利です。

ソリューション固有の設定では、System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute 属性をプログラムで適用することにより、Live Unit Testing によるインストルメント化からメソッド、プロパティ、クラス、構造体を除外できます。 さらに、プロジェクト ファイルで <ExcludeFromCodeCoverage> プロパティを true に設定して、プロジェクト全体をインストルメント化から除外することもできます。 それでも Live Unit Testing はインストルメント化されていないテストを実行しますが、カバレッジは視覚化されません。

Microsoft.CodeAnalysis.LiveUnitTesting.Runtime が現在のアプリケーション ドメインに読み込まれているかどうかを確認し、理由に基づいてテストを無効にすることもできます。 たとえば、xUnit では次のような処理を行うことができます。

[ExcludeFromCodeCoverage]
public class SkipLiveFactAttribute : FactAttribute
{
   private static bool s_lutRuntimeLoaded = AppDomain.CurrentDomain.GetAssemblies().Any(a => a.GetName().Name ==
                                            "Microsoft.CodeAnalysis.LiveUnitTesting.Runtime");
   public override string Skip => s_lutRuntimeLoaded ? "Test excluded from Live Unit Testing" : "";
}

public class Class1
{
   [SkipLiveFact]
   public void F()
   {
      Assert.True(true);
   }
}

連続的なビルド

編集を行わなかった場合でも Live Unit Testing で常にソリューションがビルドされるのはなぜですか?

編集を行っていなくても、ビルド プロセスによってソリューション自体の一部であるソース コードが生成され、ビルド ターゲット ファイルにおいて適切な入力と出力が指定されていない場合は、ソリューションがビルドされる場合があります。 MSBuild が適切な最新状態チェックを実行し、新しいビルドが必要かどうかを判断できるように、ターゲットに入力と出力のリストを提供する必要があります。

Live Unit Testing は、ソース ファイルが変更されたことを検出すると常に、ビルドを開始します。 ソリューションのビルドでソース ファイルが生成されるので、Live Unit Testing は無限ビルド ループになります。 ただし、Live Unit Testing で (前のビルドで新しく生成されたソース ファイルを検出した後) 2 回目のビルドが開始されるときに、ターゲットの入力と出力が調べられる場合は、入力と出力のチェックですべてが最新であることが示されるため、ビルド ループから抜け出します。

エディターのアイコン

出力ウィンドウのメッセージでは Live Unit Testing が実行しているようなのに、エディターにアイコンが表示されないのはなぜですか?

Live Unit Testing が動作しているアセンブリが何らかの理由でインストルメント化されていない場合に、エディターにアイコンが表示されない場合があります。 たとえば、Live Unit Testing は <UseHostCompilerIfAvailable>false</UseHostCompilerIfAvailable> を設定するプロジェクトと互換性がありません。 この場合、Live Unit Testing を動作させるには、ビルド プロセスを更新してこの設定を削除する、または true に変更する必要があります。 

ログのキャプチャ

ファイル バグ レポートに詳細なログを収集するにはどうすればよいですか?

詳細なログを収集するにはいくつかの方法があります。

  • [ツール]>[オプション]>[Live Unit Testing] の順に移動し、ログ オプションを [詳細] に変更します。 詳細ログにより、より詳細なログが [出力] ウィンドウに表示されます。

  • LiveUnitTesting_BuildLog ユーザー環境変数に、MSBuild ログのキャプチャに使うファイルの名前を設定します。 このようにすると、Live Unit Testing のビルドからの詳細な MSBuild ログ メッセージを、そのファイルから取得できます。

  • LiveUnitTesting_TestPlatformLog ユーザー環境変数を 1 に設定して、テスト プラットフォームのログをキャプチャします。 このようにすると、Live Unit Testing の実行からの詳細なテスト プラットフォームのログ メッセージを [Solution Root]\.vs\[Solution Name]\log\[VisualStudio Process ID] から取得できます。

  • VS_UTE_DIAGNOSTICS という名前のユーザー レベル環境変数を作成し、1 (または任意の値) に設定して、Visual Studio を再起動します。 Visual Studio の [出力 - テスト] タブに多くのログが表示されるようになります。

ワークスペース フォルダー

ワークスペース フォルダーの下にあるファイルを編集できますか?

いいえ。ワークスペース フォルダーのビルド ディレクトリとテスト ディレクトリの下にあるファイルを開いたり、編集したりしないでください。 Live Unit Testing では、src フォルダー内のすべてのファイルを管理し、リポジトリ ルートワークスペース ルートの間で同期を維持してください。

開発ドライブ

ライブ単体テストでは、既定のワークスペース ルートの Dev Drive がサポートされていますか?

はい。ただし、有効になっていることを確認する必要があります。 Dev Drive を使用している場合は、投影ファイル システム (ProjFS) フィルターが有効になっていることを確認します。 たとえば、次のコマンドを使用すると、ProjFS と Windows Defender が有効になります:

fsutil devdrv setfiltersallowed PrjFlt, WdFilter