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 a livello di 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 (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.