MSTEST0074: Test de mutatie van de globale processtatus moet een resourcevergrendeling declareren

Property Waarde
Regel-ID MSTEST0074
Title Test het dempen van proces-globale status moet een resourcevergrendeling declareren
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 Ja, alleen voor C#

Important

ResourceLockAttribute is gepland voor MSTest 4.4 en is alleen beschikbaar in preview-versies totdat MSTest 4.4.0 wordt uitgebracht.

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, aanroepen Environment.SetEnvironmentVariable of/SetError/SetInConsole.SetOutzonder een overeenkomende [ResourceLock] of .[DoNotParallelize]

Beschrijving van regel

Het dempen van de proces-globale status, zoals omgevingsvariabelen of omleiding van de console, van een test is onveilig zodra parallellisatie in assembly is ingeschakeld, omdat een test op hetzelfde niveau de mutatie observeert. In tegenstelling tot [ResourceLock], wat niet openvalt wanneer een sleutel wordt vergeten, markeert deze regel de mutatie tijdens het compileren.

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

Hoe schendingen op te lossen

Declareer [ResourceLock] met de overeenkomende WellKnownResources sleutel om de strijdende tests te serialiseren of voeg toe [DoNotParallelize] om de test buiten parallellisatie uit te voeren.

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

Een C#-codefix voegt het [ResourceLock] kenmerk voor u toe, bij de testmethode of, voor een klasse-scoped armatuur, zoals [TestInitialize]in de testklasse. Visual Basic code deze diagnose heeft, maar geen automatische oplossing heeft; voeg het kenmerk handmatig toe.

Wanneer waarschuwingen onderdrukken

Onderdrukt geen waarschuwingen van deze regel zonder een vergrendeling te declareren of uit te sluiten van parallelle uitvoering, 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 MSTEST0074
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0074

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

Zie Hoe u codeanalysewaarschuwingen kunt onderdrukken voor meer informatie.

Zie ook