MSTEST0075: Undvik att ändra den aktuella katalogen i ett parallelliserat test

Property Value
Regel-ID MSTEST0075
Titel Undvik att ändra den aktuella katalogen 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 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 klassomfattande fixturmetod som körs under, anropar Directory.SetCurrentDirectoryEnvironment.CurrentDirectory eller tilldelar utan matchning [ResourceLock] eller [DoNotParallelize].

Regelbeskrivning

Den aktuella katalogen är process-global på alla operativsystem och har, till skillnad från kultur, ingen motsvarighet med trådomfattning eller asynkron omfattning. Ett test som ändrar den skadar arbetskatalogen för varje test som körs samtidigt och relativa sökvägar som matchas någon annanstans i sviten pekar tyst på fel plats.

[TestMethod]
public void ChangesDirectory()
{
    Directory.SetCurrentDirectory(tempPath); // Violation
}

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

Deklarera [ResourceLock(WellKnownResources.CurrentDirectory)] för att serialisera utmanande tester eller lägg till [DoNotParallelize] för att välja bort parallelliseringen. Även med ett lås föredrar du att skicka absoluta sökvägar så att den aktuella katalogen aldrig behöver ändras.

[ResourceLock(WellKnownResources.CurrentDirectory)]
[TestMethod]
public void ChangesDirectory()
{
    Directory.SetCurrentDirectory(tempPath);
}

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 MSTEST0075
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0075

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

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

Se även