MSTEST0074: Un test che modifica lo stato globale del processo deve dichiarare un blocco di risorsa

Proprietà Value
ID regola MSTEST0074
Titolo Il test che modifica lo stato globale del processo deve dichiarare un blocco di risorsa
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 fixture con ambito di classe nel cui contesto viene eseguito, chiamano Environment.SetEnvironmentVariable o Console.SetOut/SetError/SetIn senza una chiamata corrispondente a [ResourceLock] o [DoNotParallelize].

Descrizione della regola

Modificare lo stato globale del processo, ad esempio le variabili di ambiente o il reindirizzamento della console, all’interno di un test non è sicuro una volta abilitata la parallelizzazione interna all’assembly, perché un altro test dello stesso assembly in esecuzione contemporaneamente può osservare tale modifica. A differenza di [ResourceLock], che ha esito negativo quando viene dimenticata una chiave, questa regola contrassegna la mutazione in fase di compilazione.

[TestMethod]
public void SetsVariable()
{
    Environment.SetEnvironmentVariable("MODE", "test"); // Violation
}

Come correggere le violazioni

Dichiara [ResourceLock] con la chiave WellKnownResources corrispondente per serializzare i test in conflitto, oppure aggiungi [DoNotParallelize] per escludere il test dalla parallelizzazione.

[ResourceLock(WellKnownResources.EnvironmentVariables)]
[TestMethod]
public void SetsVariable()
{
    Environment.SetEnvironmentVariable("MODE", "test");
}

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

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

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

Vedere anche