MSTEST0077: Evitare percorsi del file system codificati in modo rigido o condivisi in un test parallelizzato

Proprietà Value
ID regola MSTEST0077
Titolo Evitare percorsi del file system codificati in modo statico o condivisi in un test parallelizzato
Categoria Utilizzo
La modifica è dirompente o non dirompente Non rompente
Abilitato per impostazione predefinita Sì
Gravità predefinita Informazioni
introdotta nella versione 4.4.0
È presente una correzione del codice No

Note

Questo analizzatore viene attivato solo quando la parallelizzazione dell'assembly è abilitata sintatticamente, ad esempio tramite [assembly: Parallelize] senza un [assembly: DoNotParallelize] corrispondente, oppure quando un file .editorconfig imposta mstest_parallel_safety_mode = always. L'analizzatore non riesce a rilevare la parallelizzazione che è abilitata solo mediante .runsettings o proprietà di MSBuild come MSTestParallelizeWorkers. Imposta l'opzione .editorconfig se configuri la parallelizzazione in questo modo e vuoi comunque eseguire questo analizzatore.

Cause

Un test passa direttamente un percorso assoluto costante o un percorso relativo letterale a un metodo File.*/Directory.* che modifica il file system, ad esempio File.WriteAllText o Directory.CreateDirectory.

Descrizione della regola

Un percorso costante codificato in modo statico o relativo punta a una posizione condivisa da tutti gli altri test nell'assembly. Con la parallelizzazione all’interno dell’assembly, due test possono quindi scrivere contemporaneamente nella stessa posizione ed entrare in conflitto.

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

Vengono contrassegnati solo i percorsi staticamente costanti passati a un'API che modifica i dati. Le letture, la costruzione del percorso e i percorsi compilati dalle variabili vengono lasciati da esaminare manualmente, perché l'analizzatore non è in grado di indicare se due test si scontrano effettivamente su un percorso calcolato.

Come correggere le violazioni

Usare un percorso univoco per test, ad esempio TestContext.TestTempDirectory, anziché un percorso fisso o relativo.

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

Quando eliminare gli avvisi

È possibile ignorare questo avviso se il percorso punta intenzionalmente a una fixture che ogni test legge, ma su cui nessun test scrive contemporaneamente, oppure se i test che vi scrivono sono già coordinati, ad esempio tramite [DoNotParallelize].

Eliminare un avviso

Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.

#pragma warning disable MSTEST0077
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0077

Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità su none nel file di configurazione .

[*.{cs,vb}]
dotnet_diagnostic.MSTEST0077.severity = none

Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.

Vedere anche