MSTEST0077: Undvik hårdkodade eller delade filsystemsökvägar i ett parallelliserat test

Property Value
Regel-ID MSTEST0077
Titel Undvik hårdkodade eller delade filsystemsökvägar 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 No

Important

TestContext.TestTempDirectory ä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 skickar en konstant absolut sökväg, eller en relativ sökvägsliteral, direkt till en filsystems muterande File.*/Directory.* metod, till exempel File.WriteAllText eller .Directory.CreateDirectory

Regelbeskrivning

En hårdkodad eller relativ konstant sökväg riktar sig mot en plats som delas av alla andra tester i sammansättningen. Under parallellisering i sammansättning kan två tester sedan skriva till samma plats samtidigt och kollidera.

[TestMethod]
public void WritesReport()
{
    File.WriteAllText("report.txt", contents); // Violation
}

Endast statiskt konstanta sökvägar som skickas till ett muterande API flaggas. Läsningar, sökvägskonstruktion och sökvägar som skapats från variabler finns kvar för dig att granska manuellt, eftersom analysatorn inte kan avgöra om två tester faktiskt kolliderar på en beräknad sökväg.

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

Använd en unik plats per test, till exempel TestContext.TestTempDirectory, i stället för en fast eller relativ sökväg.

[TestMethod]
public void WritesReport()
{
    string path = Path.Combine(TestContext.TestTempDirectory!, "report.txt");
    File.WriteAllText(path, contents);
}

När du ska ignorera varningar

Det är säkert att ignorera den här varningen om sökvägen avsiktligt riktar sig mot en fixtur som varje test läser men inga testskrivningar samtidigt, eller om testerna som skriver till den redan är koordinerade, till exempel via [DoNotParallelize].

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

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

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

Se även