Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
| 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.