編集

次の方法で共有


Live Unit Testing に関してよく寄せられる質問

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

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

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

Test Framework 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

Microsoft.VisualStudio.QualityTools.UnitTestFramework を参照する以前の MSTest ベースのテスト プロジェクトがあり、新しい 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 つのプロジェクトには、xUnit、NUnit、または MSTest テスト フレームワークへの NuGet 参照または直接参照が必要です。 このプロジェクトでは、対応する Visual Studio テスト アダプター NuGet パッケージも参照する必要があります。

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

[Live Unit Testing]\(ライブ単体テスト\) ドロップダウンが選択されていると、ビルド エラーが出力ウィンドウに報告されます。 セットアップ ウィザードの の構成が正しくないため、Live Unit Testing でビルドの問題が発生する可能性があるため、いくつかの一般的な問題が発生します。

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

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

  • 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 つのプロジェクトには、xUnit、NUnit、または MSTest テスト フレームワークへの NuGet 参照または直接参照が必要です。 このプロジェクトでは、対応する Visual Studio テスト アダプター NuGet パッケージも参照する必要があります。 Visual Studio テスト アダプターは、.runsettings ファイルを介して参照することもできます。 .runsettings ファイルには、次の例のようなエントリが必要です。

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

Live Unit Testing はソース ジェネレーター プロジェクトをサポートしていますか?

Live Unit Testing では、インストルメンテーションを使用してソース ジェネレーター プロジェクトをビルドすることはできません。 C# コンパイラがソース ジェネレーターのアセンブリ読み込みを設定する方法により、インストルメンテーションを使用してソース ジェネレーター プロジェクトをビルドしようとすると、Live Unit Testing アセンブリの読み込みに失敗します。

ソース ジェネレーターの csproj ファイル <ExcludeFromCodeCoverage>true</ExcludeFromCodeCoverage> プロパティを設定して、これらのプロジェクトを Live Unit Testing でビルドすることができます。

"ファイルまたはアセンブリ 'Microsoft.Bcl.AsyncInterfaces' を読み込めませんでした"というエラーを解決する方法

Live Unit Testing では、パフォーマンス上の理由から、独自のプロセス内でビルドが実行されます。 この個別のビルド プロセスでエラーが発生している場合は、<UseInProcMSBuildNode>false</UseInProcMSBuildNode>.lutconfig ファイルに設定して、すべてのビルドが MSBuild プロセスで確実に実行されるようにすることができます。

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

  • 一般的な問題は、すべてのファイルがテスト フォルダーにコピーされるわけではないということです。 csproj ファイルに、いくつかの Live Unit Testing Test Dependency 項目を追加する必要がある場合があります。

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

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

Visual Studio Projects で参照されているテスト アダプターをサポートされているバージョンにアップグレードした後、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) で必要のないインストルメンテーション (Live Unit Testing) 用にビルドするカスタムステップがソリューションに必要な場合は、プロジェクトにコードを追加するか、BuildingForLiveUnitTesting プロパティをチェックし、ビルド前/ビルド後のカスタムステップを実行するファイル .targets を できます。 また、特定のビルド ステップ (パッケージの発行や生成など) を削除するか、このプロジェクト プロパティに基づいてビルド ステップ (前提条件のコピーなど) を 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 単体テスト

テスト エクスプローラー ウィンドウからテストを実行することは、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 で STA で MSTest テストを実行するには、テスト メソッドまたは包含クラスを、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 が適切な up-to-date チェックを実行し、新しいビルドが必要かどうかを判断できるように、ターゲットに入力と出力の一覧を指定する必要があります。

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

エディター アイコン

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 がサポートされていますか?

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

fsutil devdrv setfiltersallowed PrjFlt,WdFilter

関連項目