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
Gravità predefinita Informazioni
introdotta nella versione 4.4.0 (anteprima)
È presente una correzione del codice Sì, solo per C#

Importante

ResourceLockAttribute è pianificato per MSTest 4.4 ed è disponibile solo nelle build di anteprima fino al rilascio di MSTest 4.4.0.

Note

Questo analizzatore viene attivato solo quando la parallelizzazione dell'assembly è abilitata sintatticamente, ad esempio senza [assembly: Parallelize] una corrispondenza [assembly: DoNotParallelize]o quando un .editorconfig file imposta mstest_parallel_safety_mode = always. L'analizzatore non riesce a rilevare la parallelizzazione abilitata solo tramite .runsettings o le proprietà di MSBuild, MSTestParallelizeWorkersad esempio . Impostare l'opzione .editorconfig se si configura la parallelizzazione in questo modo e si vuole comunque che l'analizzatore venga eseguito.

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 di processo in ogni sistema operativo e, a differenza delle impostazioni cultura, non ha un equivalente con ambito thread o async.the current directory is process-global on every operating system and, differentemente dalle impostazioni cultura, has no thread-scoped or async-scoped equivalent. Un test che modifica la directory di lavoro di ogni test in esecuzione simultaneamente e i percorsi relativi risolti altrove nella suite puntano automaticamente alla posizione errata.

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

Come correggere le violazioni

Dichiarare [ResourceLock(WellKnownResources.CurrentDirectory)] di serializzare i test contendenti o aggiungere [DoNotParallelize] per rifiutare esplicitamente il test fuori dalla parallelizzazione. Anche con un blocco, preferire il passaggio di percorsi assoluti in modo che la directory corrente non debba mai cambiare.

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

Una correzione del codice C# aggiunge automaticamente l'attributo [ResourceLock] al metodo di test o per una fixture con ambito classe, ad [TestInitialize]esempio , nella classe di test. Visual Basic codice include questa diagnostica, ma non ha una correzione automatica. Aggiungere l'attributo a mano.

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