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 | 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.