MSTEST0077: Vermeiden von hartcodierten oder freigegebenen Dateisystempfaden in einem parallelisierten Test

Eigenschaft Wert
Regel-ID MSTEST0077
Title Vermeiden von hartcodierten oder freigegebenen Dateisystempfaden 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

Important

TestContext.TestTempDirectory 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 übergibt einen konstanten absoluten Pfad oder ein relatives Pfadliteral direkt an eine Dateisystem-Mutating-Methode, zFile.WriteAllText. B. oder Directory.CreateDirectory.File.*/Directory.*

Regelbeschreibung

Ein hartcodierter oder relativer Konstantenpfad zielt auf einen Speicherort ab, der von jedem anderen Test in der Assembly gemeinsam genutzt wird. Unter der Inassembly-Parallelisierung können zwei Tests dann gleichzeitig an denselben Ort schreiben und kollidieren.

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

Nur statisch konstanten Pfade, die an eine Stummschalt-API übergeben werden, werden gekennzeichnet. Lese-, Pfadkonstruktions- und Pfade, die aus Variablen erstellt wurden, bleiben ihnen überlassen, manuell zu überprüfen, da die Analyse nicht erkennen kann, ob zwei Tests tatsächlich auf einem berechneten Pfad kollidieren.

Wie man Verstöße behebt

Verwenden Sie einen eindeutigen Standort pro Test, z TestContext.TestTempDirectory. B. anstelle eines festen oder relativen Pfads.

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

Wann sollten Warnungen unterdrückt werden?

Es ist sicher, diese Warnung zu unterdrücken, wenn der Pfad absichtlich auf eine Vorrichtung abzielt, die jeder Test liest, aber kein Test gleichzeitig schreibt, oder wenn die Tests, die schreiben, bereits koordiniert sind, z. B. durch [DoNotParallelize].

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 MSTEST0077
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0077

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.MSTEST0077.severity = none

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

Siehe auch