MSTEST0074: Testen des Mutating process-global state sollte eine Ressourcensperre deklarieren

Eigenschaft Wert
Regel-ID MSTEST0074
Title Test mutating process-global state should declare a resource lock
Kategorie Usage
Die Behebung ist eingreifend oder nicht eingreifend Non-breaking
Standardmäßig aktiviert Ja
Voreingestellte Schwere Info
wurde in Version eingeführt. 4.4.0 (Vorschau)
Gibt es eine Codekorrektur Ja, nur für C#

Important

ResourceLockAttribute ist für MSTest 4.4 geplant und ist nur in Vorschaubuilds verfügbar, bis MSTest 4.4.0 veröffentlicht wird.

Note

Dieser Analyzer wird nur aktiviert, wenn die Assembly-Parallelisierung syntaktisch aktiviert ist, z. B. durch einen [assembly: Parallelize] Abgleich [assembly: DoNotParallelize]oder wenn eine .editorconfig Datei festgelegt wird mstest_parallel_safety_mode = always. Der Analyzer kann keine Parallelisierung erkennen, die nur über .runsettings msBuild-Eigenschaften wie MSTestParallelizeWorkersz. B. aktiviert ist. Legen Sie die Option fest, wenn Sie die .editorconfig Parallelisierung auf diese Weise konfigurieren und trotzdem möchten, dass dieser Analyzer ausgeführt werden soll.

Ursache

Ein Test oder eine Klasse-bezogene Vorrichtungsmethode, unter der sie ausgeführt wird, aufruft Environment.SetEnvironmentVariable oder/Console.SetOutSetErrorSetIn/ ohne übereinstimmende [ResourceLock] oder .[DoNotParallelize]

Regelbeschreibung

Das Stummschalten des prozess-globalen Zustands, z. B. Umgebungsvariablen oder Konsolenumleitung, aus einem Test ist unsicher, sobald die Parallelisierung in der Assembly aktiviert ist, da ein gleichgeordneter Test, der gleichzeitig ausgeführt wird, die Mutation beobachtet. Im Gegensatz dazu [ResourceLock], was beim Vergessen eines Schlüssels fehlschlägt, kennzeichnet diese Regel die Mutation zur Kompilierungszeit.

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

Wie man Verstöße behebt

Deklarieren Sie [ResourceLock] den übereinstimmenden WellKnownResources Schlüssel, um konkurrierende Tests zu serialisieren, oder fügen Sie hinzu [DoNotParallelize] , um den Test außer Parallelisierung zu deaktivieren.

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

Bei einer C#-Codekorrektur wird das [ResourceLock] Attribut für Sie, bei der Testmethode oder für eine klassebezogene Vorrichtung wie [TestInitialize]z. B. bei der Testklasse hinzugefügt. Visual Basic Code verfügt über diese Diagnose, verfügt aber nicht über einen automatischen Fix; fügen Sie das Attribut manuell hinzu.

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie Warnungen aus dieser Regel nicht, ohne eine Sperre zu deklarieren oder die Parallelisierung zu deaktivieren, da dies die Mutationsrennen im Hintergrund für gleichzeitig ausgeführte Tests verlässt.

Unterdrücken einer Warnung

Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.

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

Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad auf none in der Konfigurationsdatei fest.

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

Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.

Siehe auch