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 | MSTEST0075 |
| Title | Vermeiden Sie das Ändern des aktuellen Verzeichnisses 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 | 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, ruft Directory.SetCurrentDirectory oder weist Environment.CurrentDirectory sie ohne abgleichen [ResourceLock] oder [DoNotParallelize]zu.
Regelbeschreibung
Das aktuelle Verzeichnis ist auf jedem Betriebssystem prozess-global und weist im Gegensatz zur Kultur keine Threadbereichs- oder asynchrone Entsprechung auf. Ein Test, der das Arbeitsverzeichnis aller gleichzeitig ausgeführten Tests beschädigt, und relative Pfade, die an einer anderen Stelle in der Suite aufgelöst wurden, zeigen im Hintergrund an der falschen Position.
[TestMethod]
public void ChangesDirectory()
{
Directory.SetCurrentDirectory(tempPath); // Violation
}
Wie man Verstöße behebt
Deklarieren Sie [ResourceLock(WellKnownResources.CurrentDirectory)] , um konkurrierende Tests zu serialisieren, oder fügen Sie [DoNotParallelize] hinzu, um den Test außer Parallelisierung zu deaktivieren. Selbst bei einer Sperre bevorzugen Sie das Übergeben absoluter Pfade, damit sich das aktuelle Verzeichnis nie ändern muss.
[ResourceLock(WellKnownResources.CurrentDirectory)]
[TestMethod]
public void ChangesDirectory()
{
Directory.SetCurrentDirectory(tempPath);
}
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 MSTEST0075
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0075
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.MSTEST0075.severity = none
Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.