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 | 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.