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 | 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.