MSTEST0075: evitare di modificare la directory corrente in un test parallelizzato

Proprietà Value
ID regola MSTEST0075
Titolo Evitare di modificare la directory corrente 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 Sì, solo per C#

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 o un metodo di fixture con ambito classe in cui viene eseguito, chiama Directory.SetCurrentDirectory o assegna Environment.CurrentDirectory senza corrispondenza [ResourceLock] o [DoNotParallelize].

Descrizione della regola

La directory corrente è globale a livello di processo in ogni sistema operativo e, a differenza della cultura, non ha un equivalente con ambito di thread o asincrono. Un test che la modifica compromette la directory di lavoro di tutti i test eseguiti contemporaneamente, e i percorsi relativi risolti altrove nella suite puntano senza segnalarlo alla posizione sbagliata.

[TestMethod]
public void ChangesDirectory()
{
    Directory.SetCurrentDirectory(tempPath); // Violation
}

Come correggere le violazioni

Dichiarare [ResourceLock(WellKnownResources.CurrentDirectory)] per serializzare i test in conflitto oppure aggiungere [DoNotParallelize] per escludere il test dalla parallelizzazione. Anche con un lock, è preferibile passare percorsi assoluti in modo che non sia mai necessario cambiare la directory corrente.

[ResourceLock(WellKnownResources.CurrentDirectory)]
[TestMethod]
public void ChangesDirectory()
{
    Directory.SetCurrentDirectory(tempPath);
}

Una correzione del codice C# aggiunge l'attributo [ResourceLock] al metodo di test oppure, per una fixture con ambito di classe come [TestInitialize], alla classe di test. Il codice Visual Basic presenta questa diagnostica, ma non dispone di una correzione automatica; aggiungere manualmente l'attributo.

Quando eliminare gli avvisi

Non eliminare gli avvisi da questa regola senza dichiarare un blocco o rifiutare esplicitamente la parallelizzazione, perché in questo modo la mutazione corre automaticamente contro i test contemporaneamente in esecuzione.

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

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

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

Vedere anche