MSTEST0076: Undvik att mutera processomfattande kultur i ett parallelliserat test

Property Value
Regel-ID MSTEST0076
Titel Undvik att mutera processomfattande kultur i ett parallelliserat test
Kategori Usage
Korrigeringen är antingen brytande eller icke-brytande Oumbrytbar
Aktiverad som standard Yes
Standard allvarlighetsgrad Info
introducerades i version 4.4.0 (förhandsversion)
Finns det en kodkorrigering No

Note

Den här analysatorn aktiveras endast när sammansättningsparallellisering är syntaktiskt aktiverad, till exempel utan [assembly: Parallelize] matchande [assembly: DoNotParallelize], eller när en .editorconfig fil anger mstest_parallel_safety_mode = always. Analysatorn kan inte identifiera parallellisering som endast är aktiverad via .runsettings eller MSBuild-egenskaper som MSTestParallelizeWorkers. Ange alternativet .editorconfig om du konfigurerar parallellisering på det sättet och ändå vill att den här analysatorn ska köras.

Orsak

Ett test, eller en matchningsmetod med klassomfattning som körs under, tilldelar DefaultThreadCurrentCulture eller DefaultThreadCurrentUICulture utan matchning [ResourceLock] eller [DoNotParallelize].

Regelbeskrivning

CultureInfo.DefaultThreadCurrentCulture och DefaultThreadCurrentUICulture ange standardkulturen för hela processen, så att varje test som körs samtidigt observerar ändringen, och formatering eller parsning kan skadas. Formulären per tråd och omgivande format, Thread.CurrentThread.CurrentCulture/CurrentUICulture och CultureInfo.CurrentCulture/CurrentUICulture, flaggas inte: på moderna .NET tilldelar de ett AsyncLocal-backat värde som flödar med körningskontexten, så att de inte skadar syskontester.

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

Eftersom de flaggade setters är processomfattande hjälper det inte att återställa det tidigare värdet i ett finally block: samtidigt som tester körs observeras fortfarande den ändrade kulturen under mutationens varaktighet.

Så här åtgärdar du överträdelser

Lägg till [DoNotParallelize] i testet eller undvik att mutera processomfattande kultur och använd egenskaperna per tråd eller omgivande kultur i stället.

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

Det finns ingen välkänd [ResourceLock] nyckel för kulturen, så en deklarerad [ResourceLock] av något slag behandlas som en bekräftelse på att du har samordnat kulturåtkomsten, och den här regeln förblir tyst.

När du ska ignorera varningar

Utelämna inte varningar från den här regeln utan att välja bort parallellisering eller byta till kulturegenskaperna per tråd, eftersom mutationen då körs tyst mot tester som körs samtidigt.

Undertryck en varning

Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.

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

Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none i konfigurationsfilen.

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

Mer information finns i Så här utelämnar du kodanalysvarningar.

Se även