MSTEST0076: Vermijd het dempen van procesbrede cultuur in een geparallelliseerde test

Property Waarde
Regel-ID MSTEST0076
Title Vermijd het dempen van procesbrede cultuur in een geparallelliseerde test
Categorie Usage
Fix kan brekend of niet-brekend zijn Non-breaking
standaard ingeschakeld Yes
standaardniveau van ernst Informatie
geïntroduceerd in versie 4.4.0 (preview)
Is er een oplossing voor de code No

Note

Deze analyse wordt alleen geactiveerd wanneer assembly-parallellisatie syntactisch is ingeschakeld, bijvoorbeeld zonder [assembly: Parallelize] een overeenkomende [assembly: DoNotParallelize], of wanneer een .editorconfig bestand wordt ingesteld mstest_parallel_safety_mode = always. De analyse kan geen parallelle uitvoering detecteren die alleen is ingeschakeld via .runsettings of MSBuild-eigenschappen zoals MSTestParallelizeWorkers. Stel de .editorconfig optie in als u op die manier parallelle uitvoering configureert en deze analyse nog steeds wilt uitvoeren.

Oorzaak

Een test of een klasse-scoped armaturenmethode die wordt uitgevoerd onder, wijst DefaultThreadCurrentCulture of zonder een overeenkomende [ResourceLock] of DefaultThreadCurrentUICulture[DoNotParallelize].

Beschrijving van regel

CultureInfo.DefaultThreadCurrentCulture en DefaultThreadCurrentUICulture de standaardcultuur voor het hele proces instellen, zodat elke gelijktijdige uitvoeringstest de wijziging observeert en dat de opmaak of parsering kan worden beschadigd. De vormen Thread.CurrentThread.CurrentCulture/CurrentUICulture per thread en omgeving, enCurrentUICultureCultureInfo.CurrentCulture/ , worden niet gemarkeerd: op moderne .NET ze een AsyncLocalwaarde met ondersteuning toewijzen die met de uitvoeringscontext stroomt, zodat ze geen tests op hetzelfde niveau beschadigen.

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

Omdat de gemarkeerde setters procesbreed zijn, helpt het herstellen van de vorige waarde in een finally blok niet: gelijktijdig uitgevoerde tests observeren nog steeds de gewijzigde cultuur voor de duur van de mutatie.

Hoe schendingen op te lossen

Voeg de test toe [DoNotParallelize] of vermijd het dempen van procesbrede cultuur en gebruik in plaats daarvan de eigenschappen per thread of omgevingscultuur.

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

Er bestaat geen bekende [ResourceLock] sleutel voor cultuur, dus een aangegeven [ResourceLock] soort wordt beschouwd als een bevestiging dat u de toegang tot de cultuur hebt gecoördineerd en deze regel blijft stil.

Wanneer waarschuwingen onderdrukken

Onderdrukt geen waarschuwingen van deze regel zonder parallelle uitvoering af te sluiten of over te schakelen naar de eigenschappen van de cultuur per thread, omdat dit de mutatie op de achtergrond laat racen tegen gelijktijdig uitgevoerde tests.

Een waarschuwing onderdrukken

Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.

#pragma warning disable MSTEST0076
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0076

Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst ervan in op none in het configuratiebestand.

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

Zie Hoe u codeanalysewaarschuwingen kunt onderdrukken voor meer informatie.

Zie ook