MSTEST0076: Evitare di alterare le impostazioni cultura dell'intero processo in un test parallelizzato

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.

Vedere anche