MSTEST0074: プロセスグローバル状態の変更テストでリソース ロックを宣言する必要がある

財産
ルール識別子 MSTEST0074
タイトル プロセスグローバル状態の変更テストでリソース ロックを宣言する必要がある
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 オプションを設定します。

原因

一致する[ResourceLock][DoNotParallelize]を使用せずに、Environment.SetEnvironmentVariableまたはConsole.SetOut/SetError/SetInを呼び出すテストまたはクラス スコープのフィクスチャ メソッド。

ルールの説明

環境変数やコンソール リダイレクトなどのプロセス グローバル状態の変更は、アセンブリ内の並列化が有効になると安全ではありません。これは、同時に実行されている兄弟テストで変更が観察されるためです。 キーを忘れたときに開かない [ResourceLock]とは異なり、この規則はコンパイル時に変更にフラグを設定します。

[TestMethod]
public void SetsVariable()
{
    Environment.SetEnvironmentVariable("MODE", "test"); // Violation
}

違反を修正する方法

一致するWellKnownResources キーを使用して[ResourceLock]を宣言して競合するテストをシリアル化するか、[DoNotParallelize]を追加して、テストを並列化からオプトアウトします。

[ResourceLock(WellKnownResources.EnvironmentVariables)]
[TestMethod]
public void SetsVariable()
{
    Environment.SetEnvironmentVariable("MODE", "test");
}

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

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

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

警告を抑制する

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

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

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

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

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

こちらも参照ください