Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
| Property | Value |
|---|---|
| ID da regra | MSTEST0076 |
| Título | Evite mutar a cultura em todo o processo num teste paralelizado |
| Category | Usage |
| A correção é invasiva ou não invasiva | Inquebrável |
| Ativado por padrão | Sim |
| Severidade padrão | Informações |
| Introduzido na versão | 4.4.0 (pré-visualização) |
| Existe uma correção de código | Não |
Note
Este analisador ativa apenas quando a paralelização assembly está sintaticamente habilitada, por exemplo através de [assembly: Parallelize] sem um correspondente [assembly: DoNotParallelize], ou quando um .editorconfig ficheiro define mstest_parallel_safety_mode = always. O analisador não consegue detetar paralelização que está ativada apenas através .runsettings de propriedades do MSBuild como MSTestParallelizeWorkers. Define a .editorconfig opção se configurares a paralelização dessa forma e ainda quiseres que este analisador corra.
Motivo
Um teste, ou um método de fixture com âmbito de classe sob o qual corre, atribui DefaultThreadCurrentCulture ou DefaultThreadCurrentUICulture sem um matching [ResourceLock] ou [DoNotParallelize].
Descrição da regra
CultureInfo.DefaultThreadCurrentCulture e DefaultThreadCurrentUICulture definir a cultura padrão para todo o processo, de modo que cada teste em execução simultânea observe a alteração, e a formatação ou análise pode ser corrompida. As formas por thread e ambiente, Thread.CurrentThread.CurrentCulture/CurrentUICulture eCurrentUICultureCultureInfo.CurrentCulture/ , não são sinalizadas: no .NET moderno atribuem um AsyncLocalvalor -backed que flui com o contexto de execução, para não corromperem testes irmãos.
[TestMethod]
public void SetsCulture()
{
CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture; // Violation
}
Como os setters assinalados são de todo o processo, restaurar o valor anterior num finally bloco não ajuda: os testes em execução simultânea ainda observam a cultura alterada durante toda a duração da mutação.
Como corrigir violações
Adicione [DoNotParallelize] o teste, ou evite mutar a cultura em todo o processo e use as propriedades por thread ou cultura ambiente em vez disso.
[DoNotParallelize]
[TestMethod]
public void SetsCulture()
{
CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture;
}
Não existe uma chave bem conhecida [ResourceLock] para a cultura, por isso uma declaração [ResourceLock] de qualquer tipo é tratada como um reconhecimento de que coordenaste o acesso à cultura, e esta regra mantém-se em silêncio.
Quando suprimir avisos
Não suprima avisos desta regra sem optar por não usar paralelização ou mudar para as propriedades de cultura por fio, porque isso faz com que a mutação corra silenciosamente contra testes em execução simultânea.
Suprimir um aviso
Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar a regra.
#pragma warning disable MSTEST0076
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0076
Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.MSTEST0076.severity = none
Para obter mais informações, consulte Como suprimir avisos de análise de código.