MSTest の構成

Microsoft テスト フレームワークである MSTest は、.NET アプリケーション向けテスト フレームワークです。 これにより、テストの記述および実行が可能になり、Visual Studio と Visual Studio Code テスト エクスプローラー、.NET CLI、および多くの CI パイプラインに統合されたテスト スイートを提供できます。

MSTest は、完全にサポートされているオープンソースのクロスプラットフォーム テスト フレームワークで、GitHub でホストされ、サポートされているすべての .NET ターゲット (.NET Framework、.NET Core、.NET、UWP、WinUI など) で動作します。

実行設定

.runsettings ファイルを使って、単体テストの実行方法を構成できます。 runsettings とプラットフォームに関連する構成の詳細については、VSTest の runsettings のドキュメント、または MSTest ランナーの runsettings のドキュメントを確認してください。

MSTest 要素

次の runsettings エントリを使用すると、MSTest の動作を構成できます。

構成 既定値 価値観
AssemblyCleanupTimeout なし アセンブリ クリーンアップ メソッドの各インスタンスに適用するタイムアウトをグローバルに指定します。 [Timeout] アセンブリ クリーンアップ メソッドで指定された属性は、グローバル タイムアウトをオーバーライドします。
AssemblyInitializeTimeout なし アセンブリ初期化メソッドの各インスタンスに適用するタイムアウトをグローバルに指定します。 [Timeout] アセンブリ初期化メソッドで指定された属性は、グローバル タイムアウトをオーバーライドします。
AssemblyResolution 偽り 単体テストを検索して実行する場合、追加のアセンブリへのパスを指定できます。 たとえば、テスト アセンブリと同じディレクトリにない依存関係アセンブリにこれらのパスを使用します。 パスを指定するには、Directory Path 要素を使用します。 パスには環境変数を含めることができます。

<AssemblyResolution> <Directory path="D:\myfolder\bin\" includeSubDirectories="false"/> </AssemblyResolution>

この機能は、.NET Framework ターゲットを使用している場合にのみ適用されます。
CaptureTraceOutput Result Console.Write*Trace.Write*Debug.Write* API からテキストをキャプチャし、現在のテストに関連付けます。 MSTest 4.4 以降では、 NoneResult、または Liveを使用します。 Live また、テストの実行中に、 ConsoleTraceTestContext.Write* 出力がコンソールにエコーされます。 以前のブール値は引き続きサポートされています。 trueResultにマップされ、 falseNoneにマップされます。
ClassCleanupLifecycle クラスの終了 アセンブリの最後にクラスのクリーンアップを行う場合は、 EndOfAssemblyに設定します。 (msTest v4 以降では、 EndOfClass が既定で ClassCleanup 動作のみであるため、サポートされなくなりました)
ClassCleanupTimeout なし クラス クリーンアップ メソッドの各インスタンスに適用するタイムアウトをグローバルに指定します。 クラス クリーンアップ メソッドで指定された [Timeout] 属性は、グローバル タイムアウトをオーバーライドします。
ClassInitializeTimeout なし クラス初期化メソッドの各インスタンスに適用するタイムアウトをグローバルに指定します。 クラス初期化メソッドで指定された [Timeout] 属性は、グローバル タイムアウトをオーバーライドします。
ConsiderFixturesAsSpecialTests 偽り Visual Studio、Visual Studio Code AssemblyInitialize および AssemblyCleanup ログで、ClassInitializeClassCleanupTest Explorer を個別のエンティティとして表示するには、この値を True に設定します。
DeleteDeploymentDirectoryAfterTestRunIsComplete ほんとう テストの実行後に配置ディレクトリを保持するには、この値を false に設定します。
DeploymentEnabled ほんとう 値を false に設定すると、テスト メソッドで指定した配置項目が配置ディレクトリにコピーされません。
DeployTestSourceDependencies ほんとう テスト ソース参照を展開するかどうかを示す値。
EnableBaseClassTestMethodsFromOtherAssemblies ほんとう 継承するテスト クラスとは異なるアセンブリ内の基底クラスからのテスト メソッドの検出を有効にするかどうかを示す値。
ForcedLegacyMode 偽り Visual Studio の以前のバージョンで、MSTest アダプターは、処理速度とスケーラビリティを向上するために最適化されました。 テストが実行される順序などの一部の動作は、Visual Studio の以前のエディションでの動作と完全に同じではない場合もあります。 以前のテスト アダプターを使うには、値を true に設定します。

たとえば、単体テスト用に指定された app.config ファイルがある場合は、この設定を使用することがあります。

より新しいアダプターを使用できるように、テストのリファクタリングを検討することをお勧めします。
GlobalTestCleanupTimeout TestCleanupTimeout MSTest 4.4 以降では、各グローバル テスト クリーンアップ 方法のタイムアウトを指定します。 このエントリを省略すると、MSTest は TestCleanupTimeoutを使用します。 メソッドの [Timeout] 属性は、両方の値をオーバーライドします。
GlobalTestInitializeTimeout TestInitializeTimeout MSTest 4.4 以降では、グローバル テスト初期化メソッドごとにタイムアウトを指定します。 このエントリを省略すると、MSTest は TestInitializeTimeoutを使用します。 メソッドの [Timeout] 属性は、両方の値をオーバーライドします。
LaunchDebuggerOnTestFailure 偽り MSTest 4.2 以降では、 true に設定すると、テストが失敗したときに MSTest によってデバッガーが起動されます。
MapInconclusiveToFailed 偽り テストが結果不確定の状態で完了した場合は、テスト エクスプローラーでスキップ状態にマップされます。 結果不確定のテストを失敗として表示する場合は、この値を true に設定します。
MapNotRunnableToFailed ほんとう 実行不可能な結果を失敗したテストにマップするかどうかを示す値。
OrderTestsByNameInClass 偽り テスト エクスプローラーとコマンド ラインの両方でテスト名でテストを実行する場合は、この値を true 設定します。
Parallelize 並列処理を設定するために使われます。

Workers: 並列化に使用するスレッド/ワーカーの数。既定では、 現在のマシン上のプロセッサの数です。

Scope: 並列化のスコープ。 MethodLevelに設定できます。 既定では、これは ClassLevel です。

<Parallelize><Workers>32</Workers><Scope>MethodLevel</Scope></Parallelize>
RandomizeTestOrder 偽り MSTest 4.3 以降では、テストをランダムな順序で実行するには、この値を true に設定します。これにより、テスト間の非表示の順序の依存関係が表示されます。 この設定を OrderTestsByNameInClassと組み合わせることはできません。
RandomTestOrderSeed MSTest 4.3 以降では、 RandomizeTestOrdertrue の場合は、実行全体でランダムな順序を再現できるように整数シードを設定します。 設定を解除すると、実行ごとに新しいシードが使用されます。
SettingsFile ここで、MSTest アダプターで使用するテスト設定ファイルを指定できます。 また、[設定] メニューからテスト設定ファイルを指定することもできます。

この値を指定する場合は、 ForcedLegacyModetrue に設定する必要があります。

<ForcedLegacyMode>true</ForcedLegacyMode>
TestCleanupTimeout なし テスト クリーンアップ メソッドの各インスタンスに適用するタイムアウトをグローバルに指定します。 テスト クリーンアップ メソッドで指定された [Timeout] 属性は、グローバル タイムアウトをオーバーライドします。
TestInitializeTimeout なし テスト初期化メソッドの各インスタンスに適用するタイムアウトをグローバルに指定します。 テスト初期化メソッドで指定された [Timeout] 属性は、グローバル タイムアウトをオーバーライドします。
TestTimeout なし 指定されたグローバル テスト ケースのタイムアウトを取得します。
TreatClassAndAssemblyCleanupWarningsAsErrors 偽り クラスのクリーンアップの失敗をエラーとして表示するには、この値を true に設定します。
TreatDiscoveryWarningsAsErrors 偽り テスト検出の警告をエラーとして報告するには、この値を true に設定します。

タイムアウト値は、ミリ秒単位の正の整数である必要があります。 タイムアウトなしで実行するには、 0に設定するのではなく、エントリを省略します。 グローバルテストフィクスチャタイムアウトは、対応する TestInitializeTimeout または TestCleanupTimeout 値を継承します。

TestRunParameter 要素

<TestRunParameters>
    <Parameter name="webAppUrl" value="http://localhost" />
</TestRunParameters>

テスト実行パラメーターは、実行時にテストで使用できる変数と値を定義する方法を提供します。 パラメーターには MSTest TestContext.Properties プロパティを使ってアクセスします。

private string _appUrl;
public TestContext TestContext { get; set; }

[TestMethod]
public void HomePageTest()
{
    string _appUrl = TestContext.Properties["webAppUrl"];
}

テスト実行パラメーターを使用するには、パブリックの TestContext プロパティをテスト クラスに追加します。

.runsettings ファイルの例

次の XML は、一般的な .runsettings ファイルの内容を示しています。 このコードをコピーし、自分のニーズに合わせて編集します。

ファイルの各要素には既定値があるため、省略可能です。

<?xml version="1.0" encoding="utf-8"?>
<RunSettings>

  <!-- Parameters used by tests at runtime -->
  <TestRunParameters>
    <Parameter name="webAppUrl" value="http://localhost" />
    <Parameter name="webAppUserName" value="Admin" />
    <Parameter name="webAppPassword" value="Password" />
  </TestRunParameters>

  <!-- MSTest -->
  <MSTest>
    <MapInconclusiveToFailed>True</MapInconclusiveToFailed>
    <CaptureTraceOutput>false</CaptureTraceOutput>
    <DeleteDeploymentDirectoryAfterTestRunIsComplete>False</DeleteDeploymentDirectoryAfterTestRunIsComplete>
    <DeploymentEnabled>False</DeploymentEnabled>
    <ConsiderFixturesAsSpecialTests>False</ConsiderFixturesAsSpecialTests>
    <AssemblyResolution>
      <Directory path="D:\myfolder\bin\" includeSubDirectories="false"/>
    </AssemblyResolution>
  </MSTest>

</RunSettings>

testconfig.json

MSTest を使用してテストを実行する場合は、testconfig.json ファイルを使用してテスト ランナーの動作を構成できます。 testconfig.json ファイルは、テスト ランナーの構成設定を含む JSON ファイルです。 このファイルは、テスト ランナーとテスト実行環境を構成するために使用されます。 詳細については、 MTP testconfig.json ドキュメントを参照してください

MSTest 3.7 以降では、同じ構成ファイルで MSTest の実行を構成することもできます。 次のセクションでは、testconfig.json ファイルで使用できる設定について説明します。

MSTest 4.3.3 以降では、.NET Framework の実行では、testconfig.jsonのコメントと末尾のコンマも受け入れられます。

MSTest 要素

MSTest 設定は、以降のセクションで説明する機能ごとにグループ化されます。

エントリ 既定値 説明
他のアセンブリから基本クラスのテストメソッドを有効にする ほんとう 継承するテスト クラスとは異なるアセンブリ内の基底クラスからのテスト メソッドの検出を有効にするかどうかを示す値。
クラスクリーンアップライフサイクル 組み立て完了 クラスの終了時にクラスのクリーンアップを行う場合は、それを endOfClass に設定します。

assemblyResolution 設定

このセクションのすべての設定は、assemblyResolution 要素に属しています。

エントリ 既定値 説明
パス なし 単体テストを検索して実行する場合、追加のアセンブリへのパスを指定できます。 たとえば、テスト アセンブリと同じディレクトリにない依存関係アセンブリにこれらのパスを使用します。 図形 { "path": "...", "includeSubDirectories": "true/false" }のパスを指定できます。

例:

{
  "mstest": {
    "assemblyResolution": {
        { "path": "...", "includeSubDirectories": "true/false" }
    }
  }
}

deployment 設定

このセクションのすべての設定は、deployment 要素に属しています。

エントリ 既定値 説明
テスト実行完了後にデプロイディレクトリを削除する ほんとう テストの実行後に配置ディレクトリを保持するには、この値を false に設定します。
テストソース依存関係をデプロイする ほんとう テスト ソース参照をデプロイするかどうかを示します。
有効 ほんとう 値を false に設定すると、テスト メソッドで指定した配置項目が配置ディレクトリにコピーされません。

例:

{
  "mstest": {
    "deployment": {
        "deleteDeploymentDirectoryAfterTestRunIsComplete": true,
        "deployTestSourceDependencies": true,
        "enabled": true
    }
  }
}

output 設定

このセクションのすべての設定は、output 要素に属しています。

エントリ 既定値 説明
captureTrace Result ConsoleTrace、およびDebug出力をキャプチャし、現在のテストに関連付けます。 MSTest 4.4 以降では、 NoneResult、または Liveを使用します。 Live では、テストの実行中に、 TestContext.Write* メッセージを含む出力もエコーされます。 ブール値は引き続きサポートされます。 trueResultにマップされ、 falseNoneにマップされます。

例:

{
  "mstest": {
    "output": {
        "captureTrace": false
    }
  }
}

parallelism 設定

このセクションのすべての設定は、parallelism 要素に属しています。

エントリ 既定値 説明
有効 偽り テスト並列化を有効にします。
スコープ クラス 並列化のスコープ。 methodに設定できます。 既定の classは、特定のクラスのすべてのテストを順番に実行しますが、複数のクラスを並列で実行します。
労働者 0 並列化に使用するスレッド/ワーカーの数。 既定値は、現在のコンピューター上のプロセッサの数にマップされます。

例:

{
  "mstest": {
    "parallelism": {
        "enabled": true,
        "scope": "method",
        "workers": 32
    }
  }
}

execution 設定

このセクションのすべての設定は、execution 要素に属しています。

エントリ 既定値 説明
空のデータソースを結論が出せないと見なす 偽り trueに設定すると、空のデータ ソースは不確定と見なされます。
フィクスチャを特別なテストとして考慮する 偽り Visual Studio、Visual Studio Code AssemblyInitialize および AssemblyCleanup ログの個別エントリとして、ClassInitializeClassCleanupTest Explorer を表示するには、この値を [True] に設定します。
依存関係 MSTest 4.4 以降では、テスト依存関係の chainsnodesを宣言します。 この設定は、Microsoftでのみ使用できます。Testing.Platform。 詳細については、「 依存関係のテスト」を参照してください。
mapInconclusiveToFailed 偽り テストが結果不確定の状態で完了した場合は、テスト エクスプローラーでスキップ状態にマップされます。 結果不確定のテストを失敗として表示する場合は、この値を true に設定します。
テスト失敗時にデバッガーを起動 偽り MSTest 4.2 以降では、 trueに設定すると、テストが失敗したときに MSTest によってデバッガーが起動されます。
mapNotRunnableToFailed ほんとう 実行不可能な結果を失敗したテストにマップするかどうかを示す値。
クラス内でテストを名前順に並べる 偽り 各クラス内でアルファベット順にテストを実行します。 MSTest 4.3 以降では、 mstest.execution.orderTestsByNameInClassを使用します。 以前の mstest.orderTestsByNameInClass キーは引き続き機能しますが、非推奨の警告が生成されます。
テスト順序をランダム化 偽り MSTest 4.3 以降では、この値を true に設定してランダムな順序でテストを実行します。これにより、テスト間の非表示の順序依存関係が表示されます。 この設定を orderTestsByNameInClassと組み合わせることはできません。
randomTestOrderSeed MSTest 4.3 以降では、 randomizeTestOrdertrueされたら、実行全体でランダムな順序を再現できるように整数シードを設定します。 設定を解除すると、実行ごとに新しいシードが使用されます。
クラスとアセンブリのクリーンアップ警告をエラーとして扱う 偽り クラスのクリーンアップの失敗をエラーとして表示するには、この値を true に設定します。
ディスカバリーの警告をエラーとして処理する 偽り テスト検出の警告をエラーとして報告するには、この値を true に設定します。

例:

{
  "mstest": {
    "execution": {
        "considerEmptyDataSourceAsInconclusive": false,
        "considerFixturesAsSpecialTests": false,
        "mapInconclusiveToFailed": true,
        "mapNotRunnableToFailed": true,
        "treatClassAndAssemblyCleanupWarningsAsErrors": false,
        "treatDiscoveryWarningsAsErrors": false
    }
  }
}

timeout 設定

このセクションのすべての設定は、timeout 要素に属しています。

エントリ 既定値 説明
アセンブリのクリーンアップ なし アセンブリ クリーンアップ メソッドの各インスタンスに適用するタイムアウトをグローバルに指定します。
アセンブリ初期化 なし アセンブリ初期化メソッドの各インスタンスに適用するタイムアウトをグローバルに指定します。
クラスクリーンアップ (classCleanup) なし クラス クリーンアップ メソッドの各インスタンスに適用するタイムアウトをグローバルに指定します。
クラス初期化 なし クラス初期化メソッドの各インスタンスに適用するタイムアウトをグローバルに指定します。
globalTestCleanup testCleanup MSTest 4.4 以降では、各グローバル テスト クリーンアップ 方法のタイムアウトを指定します。 このエントリを省略すると、MSTest は testCleanupを使用します。
globalTestInitialize testInitialize MSTest 4.4 以降では、グローバル テスト初期化メソッドごとにタイムアウトを指定します。 このエントリを省略すると、MSTest は testInitializeを使用します。
テスト なし テスト タイムアウトをグローバルに指定します。
テストクリーンアップ なし テスト クリーンアップ メソッドの各インスタンスに適用するタイムアウトをグローバルに指定します。
testInitialize なし テスト初期化メソッドの各インスタンスに適用するタイムアウトをグローバルに指定します。
useCooperativeCancellation 偽り trueに設定すると、タイムアウトの場合、MSTest は CancellationToken の取り消しのみをトリガーしますが、メソッドの監視は停止しません。 この動作はよりパフォーマンスが高くなりますが、すべてのパスを通じてトークンを正しくフローさせるためにユーザーに依存します。

手記

タイムアウト値は、ミリ秒単位の正の整数である必要があります。 タイムアウトなしで実行するには、 0に設定するのではなく、エントリを省略します。 グローバルテストフィクスチャタイムアウトは対応する testInitialize または testCleanup 値を継承するため、グローバルフィクスチャでタイムアウトが必要ない場合は両方のエントリを省略します。 メソッドの [Timeout] 属性は、構成されたタイムアウトをオーバーライドします。

例:

{
  "mstest": {
    "timeout": { "globalTestInitialize": 30000, "globalTestCleanup": 30000 }
  }
}

testconfig.json ファイルの例

次の JSON は、一般的な .testconfig.json ファイルの内容を示しています。 このコードをコピーし、自分のニーズに合わせて編集します。

ファイルの各要素には既定値があるため、省略可能です。

{
  "platformOptions": {
    "resultDirectory": "./TestResults"
  },
  "mstest": {
    "execution": {
        "mapInconclusiveToFailed": true,
        "disableAppDomain": true,
        "considerFixturesAsSpecialTests": false
    },
    "parallelism": {
        "enabled": true,
        "scope": "method"
    },
    "output": {
        "captureTrace": false
    }
  }
}

MSBuild プロパティ

MSTest 4.3 以降では、プロジェクト ファイルからアセンブリ レベルの並列化を選択するか、Directory.Build.props属性を作成せずに[assembly: Parallelize]します。 これらのプロパティは、ビルド時に対応するアセンブリ属性を出力するため、 GenerateAssemblyInfotrue する必要があります (SDK スタイルのプロジェクトの既定)。

財産 既定値 説明
MSTestParallelizeScope 並列化スコープ。 MethodLevel (またはClassLevel) を出力する[assembly: Parallelize(Scope = ExecutionScope.MethodLevel)]またはExecutionScope.ClassLevelに設定するか、Noneを出力する[assembly: DoNotParallelize]に設定します。
MSTestParallelizeWorkers Workers[assembly: Parallelize]値として出力されるワーカー スレッドの最大数。 0の値は、現在のコンピューター上のプロセッサの数にマップされます。 MSTestParallelizeScopeNoneされている場合、このプロパティを設定することはできません。

MSTest は、ビルド中に両方のプロパティを検証します。 無効なスコープ値、整数以外のワーカー数、および None スコープと組み合わせたワーカー数は、ビルドに失敗します。 生成された属性は重複するため、ソースで [assembly: Parallelize] または [assembly: DoNotParallelize] も宣言しないでください。 GenerateAssemblyInfofalse場合は、代わりにソースで属性を宣言します。

次の例では、 Directory.Build.props ファイルをインポートするすべてのテスト プロジェクトに対して、4 つの worker を使用してメソッド レベルの並列化を有効にします。

<Project>
  <PropertyGroup>
    <MSTestParallelizeScope>MethodLevel</MSTestParallelizeScope>
    <MSTestParallelizeWorkers>4</MSTestParallelizeWorkers>
  </PropertyGroup>
</Project>