MSTEST0076: evitare di modificare le impostazioni cultura a livello di processo in un test parallelizzato

Proprietà Value
ID regola MSTEST0076
Titolo Evitare di modificare le impostazioni cultura a livello di processo in un test parallelizzato
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 No

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, assegna DefaultThreadCurrentCulture o DefaultThreadCurrentUICulture senza una corrispondenza [ResourceLock] o [DoNotParallelize].

Descrizione della regola

CultureInfo.DefaultThreadCurrentCulture e DefaultThreadCurrentUICulture impostare le impostazioni cultura predefinite per l'intero processo, in modo che ogni test in esecuzione simultanea osservi la modifica e la formattazione o l'analisi possa essere danneggiata. I moduli Thread.CurrentThread.CurrentCulture/CurrentUICulture per thread e ambiente eCurrentUICultureCultureInfo.CurrentCulture/ , non vengono contrassegnati: nei .NET moderni assegnano un AsyncLocalvalore supportato da flussi con il contesto di esecuzione, in modo da non danneggiare i test di pari livello.

[TestMethod]
public void SetsCulture()
{
    CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture; // Violation
}

Poiché i setter contrassegnati sono a livello di processo, il ripristino del valore precedente in un finally blocco non è utile: l'esecuzione simultanea di test osserva ancora le impostazioni cultura modificate per la durata della mutazione.

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 una chiave nota [ResourceLock] per le impostazioni cultura, quindi un dichiarato [ResourceLock] di qualsiasi tipo viene considerato come un riconoscimento dell'accesso coordinato alle impostazioni cultura e questa regola rimane invisibile all'utente.

Quando eliminare gli avvisi

Non eliminare gli avvisi da questa regola senza rifiutare esplicitamente la parallelizzazione o passare alle proprietà delle impostazioni cultura per thread, perché in questo modo la mutazione corre automaticamente contro i test in esecuzione simultanea.

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