Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
| Property | Waarde |
|---|---|
| Regel-ID | MSTEST0075 |
| Title | Vermijd het wijzigen van de huidige map in een parallelle test |
| 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 Directory.SetCurrentDirectory of toewijzen Environment.CurrentDirectory zonder een overeenkomende [ResourceLock] of [DoNotParallelize].
Beschrijving van regel
De huidige map is proces-globaal op elk besturingssysteem en heeft, in tegenstelling tot cultuur, geen thread-scoped of asynchroon bereik equivalent. Een test die de werkmap van elke test die gelijktijdig wordt uitgevoerd, beschadigd en relatieve paden die ergens anders in de suite op de achtergrond zijn opgelost, wijzen op de verkeerde locatie.
[TestMethod]
public void ChangesDirectory()
{
Directory.SetCurrentDirectory(tempPath); // Violation
}
Hoe schendingen op te lossen
Declareer [ResourceLock(WellKnownResources.CurrentDirectory)] het serialiseren van de tests of voeg toe [DoNotParallelize] om de test buiten parallelle uitvoering uit te voeren. Zelfs met een vergrendeling geeft u de voorkeur aan absolute paden, zodat de huidige map nooit hoeft te veranderen.
[ResourceLock(WellKnownResources.CurrentDirectory)]
[TestMethod]
public void ChangesDirectory()
{
Directory.SetCurrentDirectory(tempPath);
}
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 MSTEST0075
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0075
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.MSTEST0075.severity = none
Zie Hoe u codeanalysewaarschuwingen kunt onderdrukken voor meer informatie.