アプリケーションの開発中、Live Unit Testing では、影響を受けた単体テストがバックグラウンドで自動的に実行される一方で、結果とコード カバレッジがリアルタイムに表示されます。 コードを変更すると、Live Unit Testing は、既存のテストへの変更の影響と、新しいコードが 1 つ以上の既存のテストによってカバーされているかどうかに関するフィードバックを提供します。 このフィードバックは、バグ修正や新機能を追加する際に単体テストを記述するよう促します。
メモ
Visual Studio 2022 バージョン 17.3 以降、Live Unit Testing が更新されました。 新しいコンテンツについては、「アプリケーション開発中に Live Unit Testing を構成して使用する」を参照してください。
テストで Live Unit Testing を使用すると、テストの状態に関するデータが保持されます。 保持されたデータを使用することにより、Live Unit Testing では、コード変更に対応して動的にテストを実行しながら、優れたパフォーマンスが提供されます。
Live Unit Testing は、Visual Studio の Enterprise エディションで、.NET Core または .NET Framework を対象とする C# および Visual Basic プロジェクトに使用することができます。
サポートされるテスト フレームワーク
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.5.1 | 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 にアップグレードしてください。
場合によっては、Live Unit Testing を動作させるため、プロジェクトによって参照されている NuGet パッケージの明示的な復元が必要になります。 この場合、2 つの選択肢があります。
- ソリューションの明示的なビルドを実行して復元します。 Visual Studio の最上位メニューで [ビルド] > [ソリューションの再ビルド] の順に選択します。
- ソリューション内のパッケージを復元します。 ソリューションを右クリックし、[NuGet パッケージの管理] を選択します。
構成
上位の Visual Studio メニュー バーで [ツール] > [オプション] を選択して Live Unit Testing を構成します。 次に [オプション] ダイアログの左側のウィンドウで、[Live Unit Testing] を選択します。
Live Unit Testing を有効にすると (次のセクション「開始、一時停止、停止」を参照)、[オプション] ダイアログを開くこともできます。 [テスト] > [Live Unit Testing] > [オプション] を選択します。
次の図では、ダイアログで使用できる Live Unit Testing の構成オプションを示します。
次のオプションを構成できます。
ソリューションをビルドしてデバッグするときに Live Unit Testing を一時停止するかどうか。
システムのバッテリ電源が指定したしきい値を下回ったときに Live Unit Testing を一時停止するかどうか。
ソリューションを開いたら Live Unit Testing を自動的に実行するかどうか。
デバッグ シンボルと XML ドキュメントのコメント生成を有効にするかどうか。
保持されたデータを格納するディレクトリ。
保持されたデータをすべて削除できるようにする。 これは、Live Unit Testing で予測不能なまたは予期しない動作が発生している場合に便利です。この状態は、保持されたデータが破損していることを表しています。
テスト ケースがタイムアウトするまでの時間。既定値は 30 秒です。
Live Unit Testing が作成するテスト プロセスの最大数。
Live Unit Testing のプロセスが使用できるメモリの最大容量。
Live Unit Testing の [出力] ウィンドウに書き込まれる情報のレベル。
オプションは、ログなし ([なし])、エラー メッセージのみ ([エラー])、エラーと情報メッセージ ([情報]、既定値)、またはすべての詳細 ([詳細]) です。
Live Unit Testing の出力ウィンドウに詳細な出力を表示することもできます。
VS_UTE_DIAGNOSTICS
という名前のユーザーレベルの環境変数に値 1 を割り当てて、Visual Studio を再起動します。Live Unit Testing からファイルに詳細な MSBuild ログ メッセージをキャプチャするには、
LiveUnitTesting_BuildLog
ユーザー レベル環境変数を、ログを格納するファイルの名前に設定します。
開始、一時停止、停止
Live Unit Testing を有効にするには、Visual Studio の最上位メニューから [テスト] > [Live Unit Testing] > [開始] の順に選択します。 Live Unit Testing を有効にすると、[Live Unit Testing] メニューで使用可能なオプションが、[開始] の 1 項目から、[一時停止] と [停止] に変わります。
[一時停止] では、Live Unit Testing が一時的に中断されます。
Live Unit Testing を一時停止すると、カバレッジの視覚化はエディターに表示されませんが、収集されたすべてのデータは保持されます。 Live Unit Testing を再開するには、Live Unit Testing メニューから [続行] を選びます。 Live Unit Testing で、一時停止中に行われたすべての編集を取得するために必要な作業が実行されて、グリフが適切に更新されます。
[停止] では、Live Unit Testing が完全に停止されます。 Live Unit Testing では、収集したすべてのデータが破棄されます。
単体テスト プロジェクトが含まれていないソリューションで Live Unit Testing を開始する場合、Live Unit Testing メニューには [一時停止] と [停止] の各オプションが表示されますが、Live Unit Testing は開始されません。 [出力] ウィンドウには、"このソリューションではサポートされているテスト アダプターが参照されていません..." という内容で始まるメッセージが表示されます。
いつでも、Live Unit Testing を一時停止または完全に停止できます。 たとえば、リファクタリングの途中で、しばらくテストが中断されることがわかっている場合に、これらのアクションを取る場合があります。
カバレッジの視覚化を表示する
Live Unit Testing を有効にすると、Visual Studio エディターの各コード行が更新されて、記述しているコードが単体テストによってカバーされているかどうか、およびコードをカバーしているテストが合格かどうかが示されます。
次の図では、テストに合格したコード行と不合格のコード行、およびテストでカバーされていないコード行が示されています。 緑色の "✓" の行は、テストに合格することによってのみカバーされます。 赤い "x" の行は、1 つ以上の失敗したテストでカバーされます。 青い "➖" の行は、どのテストでもカバーされません。
Live Unit Testing のカバレッジの視覚化は、コード エディターでコードを変更するとすぐに更新されます。 編集の処理中に、次の図に示すように、視覚化が変更され、合格、失敗、カバーされていないシンボルの下にラウンド タイマー イメージが追加され、データが最新ではないことが示されます。
テストの状態に関する情報を取得する
コード ウィンドウの合格または不合格のシンボルをカーソルでポイントすると、その行にヒットしているテストの数を確認できます。 個々のテストの状態を確認するには、記号を選択します。
テストの名前と結果が示されるのに加えて、ヒントを使用するとテストのセットを再実行またはデバッグできます。 ツールヒントで 1 つ以上のテストを選択して、それらのテストのみを実行またはデバッグすることもできます。 こうすることで、コード ウィンドウを離れることなくテストをデバッグできます。
デバッグ時には、既に設定してあるブレークポイントを確認するためだけでなく、デバッガーによって実行された Assert メソッドで予期しない結果が返されたときにも、プログラムの実行が一時停止します。
ツールヒントで不合格になったテストをポイントすると、展開されて、次の図に示すような不合格に関してさらなる情報が表示されます。 失敗したテストに直接移動するには、ツールヒントでそのテストをダブルクリックします。
失敗したテストに移動すると、次の状態のテストがメソッドのシグネチャで視覚的に示されます:
- 合格 (中身が半分入ったビーカーと緑の "✓" で示されます)。
- 不合格 (中身が半分入ったビーカーと赤の "🞩" で示されます)。
- Live Unit Testing に含まれない (中身が半分入ったビーカーと青い "➖")。
非テスト メソッドはシンボルで識別されません。 次の図では、メソッドの 4 つの種類がすべて示されています。
不合格になったテストの診断と修正
不合格になったテストからは、簡単に製品のコードをデバッグし、編集して、アプリケーションの開発を続けることができます。 Live Unit Testing はバックグラウンドで実行されるため、デバッグ、編集、続行のサイクルの間、Live Unit Testing を停止して再起動する必要はありません。
例えば、前の画像に示したテストの失敗は、アルファベットでない文字は System.Char.IsLower メソッドに渡すと true
を返すというテストメソッドの誤った仮定が原因である。 テスト メソッドを修正した後は、すべてのテストが合格になるはずです。 Live Unit Testing を一時停止または停止する必要はありません。
Live Unit Testing ウィンドウ
Live Unit Testing で提供されるインターフェイスを使用すると、テスト エクスプローラーと同様に、テストを実行してデバッグし、テストの結果を分析することができます。 Live Unit Testing が有効になっていると、テスト エクスプローラーの単体テストの状態はすぐに更新されます。 単体テストを明示的に実行する必要はありません。 Live Unit Testing が有効になっていないか、停止されていると、Live Unit Testing には最後のテスト実行時の単体テストの状態が表示されます。 Live Unit Testing を再開した後、テストを再実行するにはソース コードを変更する必要があります。
Live Unit Testing を開始するには、Visual Studio の上部にあるメニューで [テスト] > [Live Unit Testing] > [開始] の順に選べます。 また、[表示]>[その他のウィンドウ]>[Live Unit Testing ウィンドウ] を使用して、Live Unit Testing ウィンドウを開くこともできます。
[Live Unit Testing] ウィンドウで、一部のテストがフェード アウトしていることがあります。たとえば、Live Unit Testing を停止して再開すると、次の図に示すように、[Live Unit Testing] ウィンドウのすべてのテストがフェード アウトしています。
フェード アウトされたテスト結果は、テストが最新のライブ単体テストの実行に含まれていなかったことを示します。 テストは、テストまたはテストの依存関係に対する変更が検出された場合にのみ実行されます。 変更がない場合は、不必要なテストの実行が回避されます。 この場合、グレー表示されたテスト結果は最新の実行に含まれていなかったものの、"最新の状態" です。
フェードされているテストはどれも、コードを変更すると再実行できます。
Live Unit Testing で自動的にテストを実行してテスト結果を更新するのと、テスト エクスプローラーからテストを明示的に実行するのには、いくつかの違いがあります。 こうした違いには、次のようなものがあります。
- [テスト エクスプローラー] ウィンドウからテストを実行またはデバッグすると、通常のバイナリが実行されます。 Live Unit Testing では、インストルメント化されたバイナリが実行されます。
- Live Unit Testing では、テストを実行するための新しいアプリケーション ドメインは作成されません。 代わりに、既定のドメインからテストを実行します。 [テスト エクスプローラー] ウィンドウからテストを実行すると、新しいアプリケーション ドメインが作成されます。
- Live Unit Testing では、各テスト アセンブリで順番にテストが実行されます。 [テスト エクスプローラー] ウィンドウでは、複数のテストを並列に実行できます。
大規模なソリューション
ソリューションに 10 個以上のプロジェクトがある場合、Visual Studio で以下の操作を行うと、次のダイアログが表示されます。
- 保持されたデータがない状態で、Live Unit Testing を開始します。
- [ツール] > [オプション] > [Live Unit Testing] > [Delete Persisted Data]\(持続データの削除\) を選択します。
そのダイアログでは、大規模なプロジェクトで大量のテストを動的に実行すると、パフォーマンスが著しく低下する可能性があることが警告されます。 [OK] を選択すると、Live Unit Testing はそのソリューション内のすべてのテストを実行します。 [キャンセル] を選択すると、実行するテストを選択できます。 次のセクションでは、その手順について説明します。
テスト プロジェクトとテスト メソッドを含めるか除外する
多くのテスト プロジェクトが含まれるソリューションでは、Live Unit Testing に参加するプロジェクトおよびプロジェクト内の個別メソッドを制御できます。 たとえば、数百のテスト プロジェクトを含むソリューションがある場合、Live Unit Testing に参加する対象のテスト プロジェクト セットを選ぶことができます。
テスト プロジェクトを選択するにはいくつかの方法があります。 これは、プロジェクトまたはソリューション内のすべてのテストを除外するか、ほとんどのテストを含めるか除外するか、または個々のテストを除外するかによって異なります。 Live Unit Testing は、包含/除外の状態をユーザー設定として保存し、ソリューションを閉じて再び開くときに記憶しています。
プロジェクトまたはソリューション内のすべてのテストを除外する
単体テストで個別のプロジェクトを選ぶには、Live Unit Testing を開始した後で次の手順に従います:
- ソリューション全体を除外するには、ソリューション エクスプローラーでソリューションを右クリックし、[Live Unit Testing] > [除外する] の順に選択します。
- 個別のテスト プロジェクトをテストに含めるには、各テスト プロジェクトを右クリックし、[Live Unit Testing] > [含める] の順に選択します。
コード エディター ウィンドウからテストを個別に除外する
テスト メソッドを個別に追加または除外する場合には、コード エディター ウィンドウを使います。 コード エディター ウィンドウでテスト メソッドのシグネチャを右クリックします。 次に、次のいずれかのオプションを選択します。
- [Live Unit Testing]>[Include <selected method>] (<選択したメソッド> を含める)
- [Live Unit Testing]>[Exclude <selected method>] (<選択したメソッド> を除外する)
- [Live Unit Testing]>[Exclude All But <selected method>] (<選択したメソッド> 以外をすべて除外する)
プログラムによってテストを除外する
Live Unit Testing でのカバレッジのレポートからメソッド、クラス、または構造体をプログラムによって除外する場合には、ExcludeFromCodeCoverageAttribute 属性を適用できます。
Live Unit Testing から個別のメソッドを除外するには、次の属性を使用します。
- xUnit:
[Trait("Category", "SkipWhenLiveUnitTesting")]
- NUnit:
[Category("SkipWhenLiveUnitTesting")]
- MSTest:
[TestCategory("SkipWhenLiveUnitTesting")]
Live Unit Testing からテストのアセンブリ全体を除外するには、次の属性を使用します。
- xUnit:
[assembly: AssemblyTrait("Category", "SkipWhenLiveUnitTesting")]
- NUnit:
[assembly: Category("SkipWhenLiveUnitTesting")]
- MSTest:
[assembly: TestCategory("SkipWhenLiveUnitTesting")]