Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
| 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.