MSTEST0074: Test, który modyfikuje stan globalny dla procesu, powinien zadeklarować blokadę zasobu

Property Value
Identyfikator reguły MSTEST0074
Tytuł Testy modyfikujące globalny stan procesu powinny deklarować blokadę zasobu
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 danych testowych o zakresie klasy, w ramach której jest uruchamiany, wywołuje Environment.SetEnvironmentVariable lub Console.SetOut/SetError/SetIn bez pasującego [ResourceLock] lub [DoNotParallelize].

Opis reguły

Modyfikowanie globalnego stanu procesu, takiego jak zmienne środowiskowe lub przekierowanie konsoli, w teście jest niebezpieczne po włączeniu równoległego wykonywania testów w obrębie zestawu, ponieważ inny test uruchomiony współbieżnie widzi tę zmianę. W przeciwieństwie do [ResourceLock], które nie wykrywa pominięcia klucza, ta reguła wykrywa mutację już na etapie kompilacji.

[TestMethod]
public void SetsVariable()
{
    Environment.SetEnvironmentVariable("MODE", "test"); // Violation
}

Jak naprawić naruszenia

Zadeklaruj [ResourceLock] z pasującym kluczem WellKnownResources, aby wykonywać kolidujące testy sekwencyjnie, lub dodaj [DoNotParallelize], aby wyłączyć test z równoległego wykonywania.

[ResourceLock(WellKnownResources.EnvironmentVariables)]
[TestMethod]
public void SetsVariable()
{
    Environment.SetEnvironmentVariable("MODE", "test");
}

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

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

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

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

Zobacz także