MSTEST0077: Unikaj zakodowanych na stałe lub udostępnionych ścieżek systemu plików w równoległym teście

Property Value
Identyfikator reguły MSTEST0077
Tytuł Unikaj zakodowanych na stałe lub udostępnionych ścieżek systemu plików w teście równoległym
Kategoria Usage
Poprawka jest przełomowa lub nieprzełomowa Non-breaking
Domyślnie włączone Tak
domyślna ciężkość Informacje
wprowadzone w wersji 4.4.0
Czy istnieje poprawka kodu Nie

Note

Ten analizator jest aktywowany tylko wtedy, gdy równoległość zestawu jest włączona składniowo, na przykład za pomocą [assembly: Parallelize] bez odpowiadającego mu [assembly: DoNotParallelize], lub gdy plik .editorconfig ustawia mstest_parallel_safety_mode = always. Analizator nie może wykryć równoległego wykonywania, które jest włączane wyłącznie za pomocą .runsettings lub właściwości MSBuild, takich jak MSTestParallelizeWorkers. Ustaw opcję .editorconfig, jeśli w ten sposób skonfigurujesz przetwarzanie równoległe i nadal chcesz, aby ten analizator był uruchamiany.

Przyczyna

Test przekazuje stałą ścieżkę bezwzględną lub literał ścieżki względnej bezpośrednio do metody File.*/Directory.* modyfikującej system plików, takiej jak File.WriteAllText lub Directory.CreateDirectory.

Opis reguły

Ścieżka zakodowana na stałe lub względna ścieżka stała wskazuje lokalizację współdzieloną ze wszystkimi pozostałymi testami w asemblii. W ramach równoległego przetwarzania w zestawie dwa testy mogą następnie zapisywać w tej samej lokalizacji jednocześnie i zderzać się.

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

Oznaczane są tylko ścieżki będące statycznymi stałymi, przekazywane do modyfikującego interfejsu API. Odczyty, konstrukcja ścieżki i ścieżki utworzone na podstawie zmiennych są przeznaczone do ręcznego przeglądania, ponieważ analizator nie może określić, czy dwa testy rzeczywiście zderzają się na obliczonej ścieżce.

Jak naprawić naruszenia

Użyj unikatowej lokalizacji na test, takiej jak TestContext.TestTempDirectory, zamiast stałej lub względnej ścieżki.

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

Kiedy pomijać ostrzeżenia

Można bezpiecznie pominąć to ostrzeżenie, jeśli ścieżka celowo wskazuje na zasób testowy, który jest odczytywany przez każdy test, ale do którego żaden test nie zapisuje równocześnie, albo jeśli testy, które do niego zapisują, są już skoordynowane, na przykład za pomocą [DoNotParallelize].

Pomijanie ostrzeżenia

Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.

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

Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.

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

Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.

Zobacz także