MSTEST0077: 並列化されたテストでハードコーディングまたは共有ファイルシステム パスを回避する

財産
ルール識別子 MSTEST0077
タイトル 並列化されたテストでハードコードまたは共有ファイルシステム パスを回避する
Category Usage
修正が破壊的か非破壊的か Non-breaking
既定で有効 Yes
既定の重大度 情報
バージョン で導入された 4.4.0 (プレビュー)
コード修正はありますか No

Important

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

Note

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

原因

テストは、File.WriteAllTextDirectory.CreateDirectoryなどのファイルシステムを変更するFile.*/Directory.*メソッドに、定数絶対パスまたは相対パス リテラルを直接渡します。

ルールの説明

ハードコードまたは相対定数パスは、アセンブリ内の他のすべてのテストによって共有される場所を対象とします。 アセンブリ内の並列化では、2 つのテストを同時に同じ場所に書き込んで競合させることができます。

[TestMethod]
public void WritesReport()
{
    File.WriteAllText("report.txt", contents); // Violation
}

変更 API に渡される静的に定数パスにのみフラグが設定されます。 2 つのテストが計算されたパスで実際に競合しているかどうかをアナライザーが判断できないため、変数から構築された読み取り、パスの構築、およびパスは手動で確認できます。

違反を修正する方法

固定パスや相対パスではなく、 TestContext.TestTempDirectoryなどの一意のテストごとの場所を使用します。

[TestMethod]
public void WritesReport()
{
    string path = Path.Combine(TestContext.TestTempDirectory!, "report.txt");
    File.WriteAllText(path, contents);
}

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

パスが意図的にすべてのテストが読み取るが同時にテスト書き込みを行わないフィクスチャをターゲットにしている場合、または書き込み先のテストが既に調整されている場合(たとえば、 [DoNotParallelize]を通じて)、この警告を抑制しても安全です。

警告を抑制する

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

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

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

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

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

こちらも参照ください