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 | MSTEST0077 |
| Title | Vermijd geharde of gedeelde bestandssysteempaden in een geparallelliseerde 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 | No |
Important
TestContext.TestTempDirectory 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 geeft een constant absoluut pad, of een letterlijk pad, rechtstreeks door aan een methode voor het muteren van File.*/Directory.* het bestandssysteem, zoals File.WriteAllText of .Directory.CreateDirectory
Beschrijving van regel
Een vastgelegd of relatief constant pad is gericht op een locatie die wordt gedeeld door elke andere test in de assembly. Onder parallellisatie in de assembly kunnen twee tests vervolgens gelijktijdig naar dezelfde locatie schrijven en botsen.
[TestMethod]
public void WritesReport()
{
File.WriteAllText("report.txt", contents); // Violation
}
Alleen statisch constante paden die worden doorgegeven aan een muterende API, worden gemarkeerd. Leesbewerkingen, padconstructie en paden die zijn gebouwd op basis van variabelen, worden handmatig door de analyse overgelaten, omdat de analyse niet kan zien of twee tests daadwerkelijk botsen op een berekend pad.
Hoe schendingen op te lossen
Gebruik een unieke locatie per test, zoals TestContext.TestTempDirectory, in plaats van een vast of relatief pad.
[TestMethod]
public void WritesReport()
{
string path = Path.Combine(TestContext.TestTempDirectory!, "report.txt");
File.WriteAllText(path, contents);
}
Wanneer waarschuwingen onderdrukken
Het is veilig om deze waarschuwing te onderdrukken als het pad opzettelijk is gericht op een onderdeel dat elke test leest, maar geen test schrijft gelijktijdig, of als de tests die naar het pad worden geschreven, al zijn gecoördineerd, bijvoorbeeld via [DoNotParallelize].
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 MSTEST0077
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0077
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.MSTEST0077.severity = none
Zie Hoe u codeanalysewaarschuwingen kunt onderdrukken voor meer informatie.