MSTEST0074: Testa att mutera process-globalt tillstånd bör deklarera ett resurslås

Property Value
Regel-ID MSTEST0074
Titel Testa att mutera process-globalt tillstånd bör deklarera ett resurslås
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 Ja, endast för C#

Important

ResourceLockAttribute är planerat för MSTest 4.4 och är endast tillgängligt i förhandsversioner tills MSTest 4.4.0 släpps.

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, anropar Environment.SetEnvironmentVariable eller/Console.SetOutSetErrorSetIn/ utan matchning [ResourceLock] eller .[DoNotParallelize]

Regelbeskrivning

Att mutera process-globalt tillstånd, till exempel miljövariabler eller konsolomdirigering, från ett test är osäkert när parallellisering i sammansättning har aktiverats, eftersom ett syskontest som körs samtidigt observerar mutationen. Till skillnad från [ResourceLock], som inte öppnas när en nyckel glöms bort, flaggar den här regeln mutationen vid kompileringstiden.

[TestMethod]
public void SetsVariable()
{
    Environment.SetEnvironmentVariable("MODE", "test"); // Violation
}

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

Deklarera [ResourceLock] med matchande WellKnownResources nyckel för att serialisera utmanande tester eller lägg till [DoNotParallelize] för att välja bort parallellisering.

[ResourceLock(WellKnownResources.EnvironmentVariables)]
[TestMethod]
public void SetsVariable()
{
    Environment.SetEnvironmentVariable("MODE", "test");
}

En C#-kodkorrigering lägger till [ResourceLock] attributet åt dig, på testmetoden eller för en matchning med klassomfattning som [TestInitialize], i testklassen. Visual Basic kod har den här diagnostiken men har ingen automatisk korrigering. Lägg till attributet för hand.

När du ska ignorera varningar

Ignorera inte varningar från den här regeln utan att deklarera ett lås eller välja bort parallellisering, eftersom det gör att mutationen 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 MSTEST0074
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0074

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.MSTEST0074.severity = none

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

Se även