Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
| Eigenschaft | Wert |
|---|---|
| Regel-ID | MSTEST0076 |
| Title | Vermeiden einer stummgeschalteten prozessweiten Kultur in einem parallelisierten Test |
| 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 | No |
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
Eine Prüfung oder eine Klasse-bezogene Vorrichtungsmethode, unter der sie ausgeführt wird, weist DefaultThreadCurrentCulture oder DefaultThreadCurrentUICulture ohne Übereinstimmung [ResourceLock] oder [DoNotParallelize].
Regelbeschreibung
CultureInfo.DefaultThreadCurrentCulture und DefaultThreadCurrentUICulture legen Sie die Standardkultur für den gesamten Prozess fest, sodass jeder gleichzeitig ausgeführte Test die Änderung beobachtet, und die Formatierung oder Analyse kann beschädigt werden. Die Einzelnen Thread- und Umgebungsformulare und , werden CultureInfo.CurrentCulture/CurrentUICulturenicht gekennzeichnet: auf modernen .NET weisen sie einen AsyncLocalgesicherten Wert zu, der mit dem Ausführungskontext fließt, sodass sie keine beschädigten gleichgeordneten Tests aufweisen. Thread.CurrentThread.CurrentCulture/CurrentUICulture
[TestMethod]
public void SetsCulture()
{
CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture; // Violation
}
Da die gekennzeichneten Setter prozessweit sind, hilft das Wiederherstellen des vorherigen Werts in einem finally Block nicht: Gleichzeitig ausgeführte Tests beobachten die geänderte Kultur für die Dauer der Mutation noch.
Wie man Verstöße behebt
Fügen Sie den Test hinzu, oder vermeiden Sie [DoNotParallelize] das Stummschalten der prozessweiten Kultur, und verwenden Sie stattdessen die Eigenschaften pro Thread oder Umgebungskultur.
[DoNotParallelize]
[TestMethod]
public void SetsCulture()
{
CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture;
}
Es gibt keinen bekannten [ResourceLock] Schlüssel für die Kultur, daher wird eine deklarierte [ResourceLock] Art als Anerkennung behandelt, dass Sie den Kulturzugriff koordiniert haben, und diese Regel bleibt stumm.
Wann sollten Warnungen unterdrückt werden?
Unterdrücken Sie Warnungen aus dieser Regel nicht, ohne parallelisierung zu deaktivieren oder zu den Kultureigenschaften pro Thread zu wechseln, 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 MSTEST0076
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0076
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.MSTEST0076.severity = none
Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.