Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
| 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.