MSTEST0075: 並列化されたテストで現在のディレクトリを変更しないようにする

財産
ルール識別子 MSTEST0075
タイトル 並列化されたテストで現在のディレクトリを変更しないようにする
Category Usage
修正が破壊的か非破壊的か Non-breaking
既定で有効 Yes
既定の重大度 情報
バージョン で導入された 4.4.0 (プレビュー)
コード修正はありますか はい(C# の場合のみ)

Important

ResourceLockAttribute は MSTest 4.4 用に計画されており、MSTest 4.4.0 がリリースされるまでプレビュー ビルドでのみ使用できます。

Note

このアナライザーは、アセンブリの並列処理が構文的に有効になっている場合 (たとえば、一致する[assembly: DoNotParallelize]のない[assembly: Parallelize]を使用する場合や、.editorconfig ファイルがmstest_parallel_safety_mode = always設定されている場合にのみアクティブ化されます。 アナライザーは、 .runsettings または MSBuild プロパティ ( MSTestParallelizeWorkers など) でのみ有効になっている並列処理を検出できません。 このように並列化を構成し、このアナライザーを実行する場合は、 .editorconfig オプションを設定します。

原因

テストまたはクラス スコープのフィクスチャ メソッドが実行されている場合は、Directory.SetCurrentDirectoryを呼び出すか、一致する[ResourceLock]または[DoNotParallelize]なしでEnvironment.CurrentDirectoryを割り当てます。

ルールの説明

現在のディレクトリは、すべてのオペレーティング システムでプロセス グローバルであり、カルチャとは異なり、スレッド スコープまたは非同期スコープの同等のディレクトリはありません。 これを変更するテストでは、同時に実行されているすべてのテストの作業ディレクトリが破損し、スイート内の別の場所で解決された相対パスが間違った場所をサイレント ポイントします。

[TestMethod]
public void ChangesDirectory()
{
    Directory.SetCurrentDirectory(tempPath); // Violation
}

違反を修正する方法

競合するテストをシリアル化する [ResourceLock(WellKnownResources.CurrentDirectory)] を宣言するか、 [DoNotParallelize] を追加して、並列化からテストをオプトアウトします。 ロックがある場合でも、現在のディレクトリを変更する必要がないように、絶対パスを渡す必要があります。

[ResourceLock(WellKnownResources.CurrentDirectory)]
[TestMethod]
public void ChangesDirectory()
{
    Directory.SetCurrentDirectory(tempPath);
}

C# コード修正では、テスト メソッドで、またはテスト クラスのクラス スコープフィクスチャ ([TestInitialize] など) に対して、[ResourceLock]属性が追加されます。 Visual Basicコードにはこの診断がありますが、自動修正はありません。属性を手動で追加します。

どのようなときに警告を抑制するか

ロックを宣言したり、並列化をオプトアウトしたりせずに、この規則からの警告を抑制しないでください。そうすると、同時に実行されるテストに対して変異が警告なしに競い合う状態になるためです。

警告を抑制する

単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。

#pragma warning disable MSTEST0075
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0075

ファイル、フォルダー、またはプロジェクトのルールを無効にするには、noneでその重要度をに設定します。

[*.{cs,vb}]
dotnet_diagnostic.MSTEST0075.severity = none

詳細については、「 コード分析の警告を抑制する方法」を参照してください。

こちらも参照ください