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 | MSTEST0076 |
| Titolo | Evitare di modificare le impostazioni cultura dell’intero processo 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 | No |
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, assegna DefaultThreadCurrentCulture o DefaultThreadCurrentUICulture senza il corrispondente [ResourceLock] o [DoNotParallelize].
Descrizione della regola
CultureInfo.DefaultThreadCurrentCulture e DefaultThreadCurrentUICulture impostano le impostazioni cultura predefinite per l'intero processo, quindi ogni test eseguito contemporaneamente risente della modifica e la formattazione o l'analisi possono risultare compromesse. Le forme per thread e ambienti, Thread.CurrentThread.CurrentCulture/CurrentUICulture e CultureInfo.CurrentCulture/CurrentUICulture, non sono contrassegnate: nelle versioni moderne di .NET assegnano un valore basato su AsyncLocal che si propaga con il contesto di esecuzione, quindi non compromettono i test correlati.
[TestMethod]
public void SetsCulture()
{
CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture; // Violation
}
Poiché i setter contrassegnati sono a livello di processo, ripristinare il valore precedente in un blocco finally non aiuta: i test eseguiti contemporaneamente continuano infatti a vedere la cultura modificata per tutta la durata della modifica.
Come correggere le violazioni
Aggiungere [DoNotParallelize] al test o evitare di modificare le impostazioni cultura a livello di processo e usare invece le proprietà delle impostazioni cultura per thread o ambiente.
[DoNotParallelize]
[TestMethod]
public void SetsCulture()
{
CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture;
}
Non esiste alcuna chiave [ResourceLock] comunemente nota per la cultura, quindi una dichiarazione di [ResourceLock] di qualsiasi tipo viene considerata come una presa d'atto del fatto che hai coordinato l'accesso alla cultura, e questa regola non segnala nulla.
Quando eliminare gli avvisi
Non sopprimere gli avvisi di questa regola senza disattivare esplicitamente la parallelizzazione o passare alle proprietà delle impostazioni cultura per singolo thread, perché così la mutazione entra silenziosamente in competizione con i test eseguiti contemporaneamente.
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 MSTEST0076
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0076
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.MSTEST0076.severity = none
Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.