MSTEST0076: Unikaj mutowania kultury całego procesu w równoległym teście

Property Value
Identyfikator reguły MSTEST0076
Tytuł Unikaj mutowania kultury całego procesu 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 (wersja zapoznawcza)
Czy istnieje poprawka kodu Nie

Note

Ten analizator aktywuje się tylko wtedy, gdy zrównoleglizowanie zestawu jest włączone syntactycznie, na przykład bez [assembly: Parallelize] dopasowania [assembly: DoNotParallelize], lub gdy .editorconfig plik ustawia wartość mstest_parallel_safety_mode = always. Analizator nie może wykryć równoległości, która jest włączona tylko za pośrednictwem .runsettings właściwości programu MSBuild, takich jak MSTestParallelizeWorkers. .editorconfig Ustaw opcję, jeśli skonfigurujesz zrównanie w ten sposób i nadal chcesz, aby ten analizator był uruchamiany.

Przyczyna

Test lub metoda oprawy o zakresie klasy jest uruchamiana w ramach, przypisuje DefaultThreadCurrentCulture lub DefaultThreadCurrentUICulture bez dopasowania [ResourceLock] lub [DoNotParallelize].

Opis reguły

CultureInfo.DefaultThreadCurrentCulture i DefaultThreadCurrentUICulture ustaw domyślną kulturę dla całego procesu, więc każdy jednocześnie uruchomiony test obserwuje zmianę, a formatowanie lub analizowanie może być uszkodzone. Formularze Thread.CurrentThread.CurrentCulture/CurrentUICulture dla wątku i otoczenia orazCurrentUICultureCultureInfo.CurrentCulture/ , nie są oflagowane: na nowoczesnych .NET przypisują wartość z kopią zapasową AsyncLocalprzepływającą z kontekstem wykonywania, dzięki czemu nie są uszkodzone testy równorzędne.

[TestMethod]
public void SetsCulture()
{
    CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture; // Violation
}

Ponieważ oflagowane zestawy są procesowe, przywrócenie poprzedniej wartości w finally bloku nie pomaga: równoczesne uruchamianie testów nadal obserwuje zmienioną kulturę przez czas trwania mutacji.

Jak naprawić naruszenia

Dodaj [DoNotParallelize] test lub unikaj mutowania kultury całej procesu i zamiast tego użyj właściwości kultury dla każdego wątku lub otoczenia.

[DoNotParallelize]
[TestMethod]
public void SetsCulture()
{
    CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture;
}

Nie istnieje dobrze znany [ResourceLock] klucz dla kultury, więc zadeklarowany [ResourceLock] rodzaj jest traktowany jako potwierdzenie, że masz skoordynowany dostęp do kultury, a ta reguła pozostaje dyskretna.

Kiedy pomijać ostrzeżenia

Nie pomijaj ostrzeżeń z tej reguły bez rezygnacji z równoległości lub przełączania się do właściwości kultury wątku, ponieważ pozostawia to wyścigi mutacji dyskretnie przed równoczesnym uruchamianiem testów.

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

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

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

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

Zobacz także