MSTEST0074: testare lo stato globale del processo di modifica deve dichiarare un blocco delle risorse

Proprietà Value
ID regola MSTEST0074
Titolo Testare lo stato globale del processo di modifica deve dichiarare un blocco di risorse
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 Environment.SetEnvironmentVariable o Console.SetOut/SetErrorSetIn/senza corrispondenza [ResourceLock] o .[DoNotParallelize]

Descrizione della regola

La modifica dello stato globale del processo, ad esempio variabili di ambiente o reindirizzamento della console, da un test non è sicura una volta abilitata la parallelizzazione nell'assembly, perché un test di pari livello in esecuzione osserva simultaneamente la mutazione. 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

Dichiarare [ResourceLock] con la chiave corrispondente WellKnownResources per serializzare i test concorrenti o aggiungere [DoNotParallelize] per rifiutare esplicitamente il test fuori dalla parallelizzazione.

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

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 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