MSTEST0075: Unikaj zmieniania bieżącego katalogu w testach równoległych

Property Value
Identyfikator reguły MSTEST0075
Tytuł Unikaj zmieniania bieżącego katalogu w testach równoległych
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 Tak, tylko w przypadku języka C#

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 lub metoda inicjowania o zakresie klasy, w której jest uruchamiany, wywołuje Directory.SetCurrentDirectory lub przypisuje Environment.CurrentDirectory bez odpowiadającego mu [ResourceLock] lub [DoNotParallelize].

Opis reguły

Bieżący katalog ma zakres globalny dla procesu w każdym systemie operacyjnym i, w przeciwieństwie do ustawień regionalnych, nie ma odpowiednika o zakresie ograniczonym do wątku ani operacji asynchronicznej. Test, który go zmienia, psuje katalog roboczy każdego testu uruchamianego współbieżnie, a ścieżki względne rozwiązywane w innych miejscach w pakiecie testów po cichu wskazują niewłaściwą lokalizację.

[TestMethod]
public void ChangesDirectory()
{
    Directory.SetCurrentDirectory(tempPath); // Violation
}

Jak naprawić naruszenia

Zadeklaruj [ResourceLock(WellKnownResources.CurrentDirectory)], aby serializować kolidujące testy, lub dodaj [DoNotParallelize], aby wykluczyć test z równoległego wykonywania. Nawet jeśli używasz blokady, lepiej przekazywać ścieżki bezwzględne, dzięki czemu nie ma potrzeby zmieniać bieżącego katalogu.

[ResourceLock(WellKnownResources.CurrentDirectory)]
[TestMethod]
public void ChangesDirectory()
{
    Directory.SetCurrentDirectory(tempPath);
}

Poprawka kodu w języku C# dodaje atrybut [ResourceLock] do metody testowej lub — w przypadku fikstury o zasięgu klasy, takiej jak [TestInitialize] — do klasy testowej. Visual Basic kod ma tę diagnostykę, ale nie ma automatycznej poprawki; dodaj atrybut ręcznie.

Kiedy pomijać ostrzeżenia

Nie wyciszaj ostrzeżeń tej reguły bez zadeklarowania blokady lub wyłączenia równoległego wykonywania, ponieważ w przeciwnym razie mutacja będzie po cichu ścigać się z testami uruchamianymi równolegle.

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

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

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

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

Zobacz także