アプリケーションの開発中、Live Unit Testing では、影響を受ける単体テストがバックグラウンドで自動的に実行され、結果とコード カバレッジがリアルタイムで表示されます。 コードを変更すると、Live Unit Testing は、変更が既存のテストにどのように影響したか、および追加した新しいコードが 1 つ以上の既存のテストによってカバーされるかどうかについてのフィードバックを提供します。 このフィードバックは、バグ修正を行うか、新機能を追加するときに単体テストを記述するよう促します。
テストに Live Unit Testing を使用すると、テストの状態に関するデータが保持されます。 永続化されたデータを使用すると、コードの変更に応じてテストを動的に実行しながら、Live Unit Testing で優れたパフォーマンスを提供できます。
Live Unit Testing は、.NET Core または .NET Framework を対象とするプロジェクトの Visual Studio Enterprise エディションでのみ使用できます。
サポートされているテスト フレームワーク
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 |
Microsoft.VisualStudio.QualityTools.UnitTestFramework を参照する以前の MSTest ベースのテスト プロジェクトがあり、新しい MSTest NuGet パッケージに移行したくない場合は、Visual Studio 2019 または Visual Studio 2017 にアップグレードしてください。
場合によっては、Live Unit Testing が機能するためにプロジェクトによって参照される NuGet パッケージを明示的に復元することが必要になる場合があります。 次の 2 つのオプションがあります。
- ソリューションの明示的なビルドを実行して復元します。 最上位の Visual Studio メニューの [ ビルド>ソリューションのリビルド ] を選択します。
- ソリューション内のパッケージを復元します。 ソリューションを右クリックし、[ NuGet パッケージの復元] を選択します。
設定する
ソリューションの Live Unit Testing を初めて開始するときに、セットアップ ウィザードを使用して、Live Unit Testing でテストをビルドして実行する方法を構成できます。
Live Unit Testing が停止したら、テスト>>Configure Live Unit Testing for solution に移動してセットアップ ウィザードを開くこともできます。
Live Unit Testing を実行すると、元のリポジトリのコピーであるワークスペースが作成されます。 その後、Live Unit Testing は、Visual Studio で行った保存されていない変更をワークスペースに適用し、ビルドを実行し、テストの実行を行い、最新のコード カバレッジに関するレポートを行います。
ウィザードを使用して最初に構成する必要があるのは、ファイルのコピー先とコピー先です。
リポジトリのルート
リポジトリ ルートは、Live Unit Testing ワークスペースを作成するためにコピーするフォルダーを指定します。 リポジトリのルート フォルダーである必要があります。つまり、すべてのソース、バイナリ、およびツールが含まれている必要があります。 ソリューション ファイルがリポジトリ ルートの下に存在しない場合は、リポジトリ のルートを変更する必要があります。
ワークスペースのルート
ワークスペース ルートは、Live Unit Testing がリポジトリの複製を保持するフォルダーを指定します。 パスが長すぎることを示す例外に注意してください。 既定では、ルートはホーム フォルダーの下に作成されます。 ただし、一例として、通常、ドライブ C の下にリポジトリを作成する必要がある場合、ワークスペース ルートは C:\lut\Repo のように調整できます。
除外するファイルを指定する
すべてのファイルを Live Unit Testing ワークスペースにコピーする必要はありません。 通常のビルドが Live Unit Testing ビルドに干渉しないように、ビルド中に生成された成果物はコピーから除外する必要があります。 また、通常の nuget restore コマンドが Live Unit Testing nuget restore コマンドに干渉しないようにする必要があります。
既定では、Live Unit Testing では、次の 2 つのファイル パターンのいずれかが除外されます。
- Git リポジトリの場合、 gitignore ファイルで指定されたファイルは Live Unit Testing ワークスペースにコピーされません。
- Git 以外のリポジトリの場合、 bin/ や obj/ などの基本的なフォルダーの一覧は Live Unit Testing ワークスペースにコピーされません。
より複雑なリポジトリの場合は、独自の無視ファイルを指定する必要があります。 ウィザードから [<Custom>] オプションを選択します。 [次へ] を選択すると、ウィザードの完了後に Live Unit Testing によって作成されるカスタム無視ファイルの内容が表示されます。 ルティニョール ファイルです。
注
Git リポジトリによっては、gitignore ファイルで無視されているファイルをチェックインすることが可能なため、カスタム lutignore ファイルが必要です。 カスタム のルティニョール ファイルがないと、Live Unit Testing はこれらのファイルをコピーしないため、ビルドエラーが発生する可能性があります。
ルティニョールファイル構造
ルティニョール ファイルは、gitignore ファイルと同じ形式を使用します。 ワークスペースにコピーされないように、ビルド中に生成されたフォルダーまたはファイルに一致するルールが含まれている必要があります。 既定のプロジェクト テンプレートのほとんどは、次の無視ファイルで十分です。
[Bb]in
[Oo]bj
# WILL NOT COPY ANY BIN AND OBJ FOLDERS TO THE LIVE UNIT TESTING WORKSPACE
リポジトリにビルド フォルダーが 1 つある場合は、無視ファイルに代わりにそのフォルダーが一覧表示されます。
[Aa]rtifacts/
# WILL NOT COPY THE ARTIFACTS FOLDER TO THE LIVE UNIT TESTING WORKSPACE
リポジトリにビルド フォルダーに他のツールが含まれている場合は、一致するパターンのセットでこれらのツールを除外する必要があります。
[Aa]rtifacts/
![Aa]rtifacts/tools/
# WILL NOT COPY THE ARTIFACTS FOLDER TO THE LIVE UNIT TESTING WORKSPACE
# HOWEVER IT WILL COPY THE TOOLS SUBFOLDER THAT MIGHT CONTAIN TOOLS AND UTILITIES
ビルド オプション
ウィザードの構成ページの 2 番目の部分では、ビルド オプションを構成します。
- PDB の生成: ビルドを高速化するために、Live Unit Testing ではビルド中に PDB は生成されません。 これらのシンボル ファイルを使用すると、テストエラーが発生したときにスタック トレースに移動できます。
- 複数の CPU コアを使用してビルドする: 既定では、Live Unit Testing は複数の CPU コアを使用してビルドを実行し、ビルド時間を短縮します。 コンピューターの速度が低下する場合、または複数のプロセッサを使用してソリューションをビルドできない場合は、このオプションを選択しないでください。
テスト実行オプション
ウィザード構成ページの最後の部分では、テスト実行オプションを設定します。
- テスト ケースのタイムアウト: 一部のテストの実行に時間がかかる場合があります。 いずれかのテストが特定の期間を超えると、このフィールドを設定すると自動的に実行が中止されます。 テストは自動的に取り消すことができます。
- 複数のプロセッサを使用する: 既定では、Live Unit Testing は複数のプロセッサを使用して実行パフォーマンスを高速化しようとします。 コンピューターの速度が低下する場合、またはソリューションでテストを並列で実行できない場合は、このオプションを選択しないでください。 たとえば、複数のテストが同じファイル パスから書き込み/読み取りを試みると、これらのシナリオが発生する可能性があります。
その他の構成
最上位の Visual Studio メニュー バーで [ツール>オプション ] を選択して、Live Unit Testing を構成します。
オプション ウィンドウで、すべての設定>テスト>ライブ ユニット テスト セクションを展開します。
[オプション] ダイアログで、[Live Unit Testing>General] セクションを展開します。
Live Unit Testing が有効になった後 (「 Live Unit Testing の開始、一時停止、停止」を参照)、 Test>Live Unit Testing>Options を選択してオプションを再度開くことができます。
構成可能なオプションは次のとおりです。
ソリューションのビルドとデバッグ時に Live Unit Testing が一時停止するかどうか。
システムのバッテリ電源が指定されたしきい値を下回ったときに Live Unit Testing が一時停止するかどうか。
保存されているすべてのデータを削除する機能。 この機能は、Live Unit Testing が予期しない、または予期しない方法で動作している場合に役立ちます。これは、永続化されたデータが破損していることを示唆します。
Live Unit Testing プロセスが消費できるメモリの最大量。
[Live Unit Testing Output] \(Live Unit Testing 出力\) ウィンドウに書き込まれる情報のレベル。
オプションには、ログ記録なし (なし)、エラー メッセージのみ (エラー)、エラーメッセージと情報メッセージ (情報、既定値)、またはすべての詳細 (詳細) が含まれます。
また、という名前のユーザー レベルの環境変数に値 1 を割り当てることで、Live Unit Testing
VS_UTE_DIAGNOSTICSウィンドウに詳細出力を表示することもできます。 次に、Visual Studio を再起動します。Live Unit Testing から詳細な MSBuild ログ メッセージをファイルにキャプチャするには、
LiveUnitTesting_BuildLogユーザー レベルの環境変数を、ログを含むファイルの名前に設定します。
Live Unit Testing 用にビルドをカスタマイズする
より複雑なソリューションの場合は、ビルドをさらにカスタマイズする必要がある場合があります。 たとえば、テストの実行中に翻訳ファイルをビルドする必要がない場合があります。 ビルドを高速化するには、Live Unit Testing を使用して翻訳ファイルのビルドを無効にします。 これを行うには、プロジェクト ファイルを操作します。
Live Unit Testing のオーバーライドを追加する
ソリューションで、インストルメンテーション用にビルドするためのカスタムステップ (Live Unit Testing) が必要な場合は、プロジェクトまたは .targets ファイルにコードを追加して、 BuildingForLiveUnitTesting プロパティをチェックし、ビルド前/ビルド後のカスタムステップを実行できます。
たとえば、次のサンプルを記述して、Live Unit Testing でのみ実行される別のターゲットを追加できます。
<Target Name="GenerateNuGetPackages" BeforeTargets="AfterBuild" Condition="'$(BuildingForLiveUnitTesting)' == 'true'">
<Exec Command='"$(MSBuildThisFileDirectory)..\tools\GenPac" '/>
</Target>
BuildingForLiveUnitTesting プロパティを使用すると、テスト ビルドに対して実行すべきではない一部のタスクを無効にすることができます。 たとえば、Live Unit Testing では、テストのアナライザーを無効にする <RunAnalyzers>false</RunAnalyzers> が設定されます。
Live Unit Testing テストの依存関係
テストの実行に必要なすべてのファイルがコピーされていない可能性があります。 Live Unit Testing では、テストを実行する別のフォルダーが作成されます。 この配置により、テストの実行中にビルドを実行できますが、ビルド フォルダーのすべてのファイルがテスト フォルダーにコピーされるわけではありません。
通常は、次の 2 つの理由のいずれかでテストの依存関係を追加します。
- テストは、ソース ツリーの下のファイルに依存します。 たとえば、テストは resx ファイルの内容を調べたり、構成ファイルを読み取ったりします。
- テストは、参照する一部のライブラリに依存します。 たとえば、依存関係として構築された実行可能ファイルをテストで実行します。
注
テストの依存関係は、セットアップ ウィザードで リポジトリ ルート として指定されたディレクトリ内に存在する必要があります。
どちらの場合も、Live Unit Testing では、テストを実行するためにコピーする必要があるファイルの数を最小限に抑えるために、これらのファイルは既定ではコピーされません。 テストの実行に必要な場合は、 LiveUnitTestingTestDependency プロパティを使用してこれらのファイルを明示的に指定する必要があります。 たとえば、次のレイアウトがあるとします。
SRC/
CONSOLE_UTILITY/
TEST_PROJECT/
ARTIFACTS/
CONSOLE_UTILITY/NET472/DEBUG/
TEST_PROJECT/NET472/DEBUG/
既定では、Live Unit Testing を使用してこれらのプロジェクトをビルドすると、 Artifacts/Test_Project のみがテスト フォルダーにコピーされます。 ソースまたはconsole_utilityをテスト フォルダーに追加するには、次のサンプルを test_project.csprojに追加します。
<LiveUnitTestingTestDependency Include=”$(RepoRoot)/Src/ConsoleUtility” />
<LiveUnitTestingTestDependency Include=”$(RepoRoot)/Artifacts/ConsoleUtility/net472/$(Configuration)/</LiveUnitTestingTestDependency” />
開始、一時停止、停止
Live Unit Testing を有効にするには、最上位の Visual Studio メニューで [ テスト>Live Unit Testing>Start を選択します。 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 を開始すると、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]\(ライブ単体テスト\) タブのプレイリスト エディターを使用して、プロジェクト、名前空間、またはクラスを実行に含めたり、実行から除外したりできます。 ツール ウィンドウで [ プレイリストの編集] を選択します。
ツリー ビュー要素を選択またはクリアして、テストを含めたり除外したりできます。 たとえば、1 つのテストを確認した場合、Live Unit Testing は変更時にそれを実行します。 クラスを選択すると、そのクラス内のすべてのテストが実行され、そのクラスに追加された新しいテストも実行されます。
コード エディター ウィンドウ
コード エディター ウィンドウを使用して、個々のテスト メソッドを含めたり除外したりできます。 コード エディター ウィンドウでテスト メソッドの署名または本文を右クリックし、次のいずれかのオプションを選択します。
- Live Unit Testing>選択 <メソッドを含めます>
- Live Unit Testing>選択 <メソッドを除外します>
- Live Unit Testing>選択済みメソッド以外をすべて除外します>
ソリューション エクスプローラ
単体テストで個々のプロジェクトを選択するには、Live Unit Testing の開始後に次の手順に従います。
- ソリューション エクスプローラーでソリューションを右クリックし、Live Unit Testing>Exclude を選択してソリューション全体を除外します。
- テストに含める各テスト プロジェクトを右クリックし、 Live Unit Testing>Include を選択します。
テストコードでプログラム的に
ExcludeFromCodeCoverageAttribute属性を適用して、プログラムによって、メソッド、クラス、または構造体を Live Unit Testing でカバレッジのレポートから除外できます。
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")]
カバレッジの視覚化を表示する
Live Unit Testing を有効にすると、Visual Studio エディターのコードの各行が更新され、作成中のコードが単体テストでカバーされているかどうかと、それをカバーするテストが合格しているかどうかが表示されます。
次の図は、合格したテストと失敗したテストを含むコード行と、テストでカバーされていないコード行を示しています。 緑色の "✓" の行は、テストに合格することによってのみカバーされます。 赤い "x" が付いた行は、1つ以上の失敗したテストによってカバーされています。 青い "➖" の行は、どのテストでもカバーされません。
コード エディターでコードを変更すると、Live Unit Testing カバレッジの視覚化が直ちに更新されます。 次の図に示すように、編集の処理中に視覚化が変更され、渡されたシンボルや失敗したシンボル、カバーされていないシンボルの下に丸いタイマーの画像が追加され、データが最新ではないことを示します。
テストの状態に関する情報を取得する
コード ウィンドウで成功または失敗したシンボルにカーソルを合わせると、その行にヒットしているテストの数を確認できます。 個々のテストの状態を表示するには、シンボルを選択します。
ツールヒントでは、テストの名前と結果を提供するだけでなく、一連のテストを再実行またはデバッグできます。 ツールヒントで 1 つ以上のテストを選択した場合は、それらのテストのみを実行またはデバッグすることもできます。 このアクションを使用すると、コード ウィンドウを離れることなくテストをデバッグできます。
デバッグ中は、既に設定されているブレークポイントを監視するだけでなく、デバッガーが予期しない結果を返す Assert メソッドを実行すると、プログラムの実行が一時停止します。
ツールヒントで失敗したテストをポイントすると、次の図に示すように、失敗に関する詳細情報が表示されるように展開されます。 失敗したテストに直接移動するには、ツールヒントでテストをダブルクリックします。
失敗したテストに移動すると、Live Unit Testing によって、次のテストがメソッド シグネチャに視覚的に示されます。
- 合格 (緑の「✓」と共に半分いっぱいのビーカーで示されます)。
- 失敗しました (半分満たしたビーカーと赤い「🞩」記号で示されます)。
- Live Unit Testing には関与しません (青い「➖」と共に半分満たされたビーカーで示されます)。
非テスト メソッドはシンボルで識別されません。 次の図は、4 種類のメソッドをすべて示しています。
テストの失敗を診断して修正する
失敗したテストから、製品コードを簡単にデバッグし、編集を行い、アプリケーションの開発を続けることができます。 Live Unit Testing はバックグラウンドで実行されるため、デバッグ、編集、続行のサイクル中に Live Unit Testing を停止して再起動する必要はありません。
たとえば、前の図に示したテストエラーは、非アルファ文字が true メソッドに渡されたときにSystem.Char.IsLower返されるというテスト メソッドの誤った仮定が原因でした。 テスト メソッドを修正した後、すべてのテストに合格する必要があります。 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>Start を選択します。 Live Unit Testing ウィンドウは、表示>その他のウィンドウ>Live Unit Testing ウィンドウ のメニューを使って開くこともできます。
[Live Unit Testing]\(ライブ単体テスト\) ウィンドウで、一部のテストがフェードアウトしていることに気付く場合があります。たとえば、Live Unit Testing を停止して再起動すると、次の図に示すように、Live Unit Testing ウィンドウはすべてのテストをフェードアウトします。
消えているテスト結果は、そのテストが最新のLive Unit Testの実行に含まれていなかったことを示します。 テストは、テストへの変更またはテストの依存関係が検出された場合にのみ実行されます。 変更がない場合は、テストを不必要に実行する必要がなくなります。 この場合、グレー表示されたテスト結果は、最新の実行には含まれていない場合でも、引き続き最新の状態です。
コードを変更することで、フェードアウトしたテストを再実行できます。
Live Unit Testing の自動実行とテスト結果の更新とテスト エクスプローラーからのテストの明示的な実行には、いくつかの違い があります。 これらの違いは次のとおりです。
- テスト エクスプローラー ウィンドウからテストを実行またはデバッグすると、通常のバイナリが実行されます。 Live Unit Testing では、インストルメント化されたバイナリが実行されます。
- Live Unit Testing では、テストを実行するための新しいアプリケーション ドメインは作成されません。 代わりに、既定のドメインからテストを実行します。 テスト エクスプローラー ウィンドウからテストを実行すると、新しいアプリケーション ドメインが作成されます。
- Live Unit Testing では、各テスト アセンブリでテストが順番に実行されます。 [テスト エクスプローラー] ウィンドウでは、複数のテストを並列で実行することを選択できます。
Live Unit Testing テストの実行をキャンセルする
Live Unit Testing は、コードを変更するたびにテストを実行し続けます。 実行が進行中で、さらにコードを変更すると、Live Unit Testing は最初の実行が完了するまで待機している間に、別の実行をキューに入れます。
ファイルを保存するたびに、Live Unit Testing は最初の実行を取り消し、代わりにキューに登録された実行をすぐにスケジュールします。 このプロセスは、最初の実行の完了に長い時間がかかるシナリオに役立ちます。