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 | MSTEST0074 |
| Título | O processo com mutação de teste - o estado global deve declarar um bloqueio de recurso |
| 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 | Sim, só para C# |
Importante
ResourceLockAttribute está planeado para o MSTest 4.4 e está disponível apenas em versões pré-visualizadas até ao lançamento do MSTest 4.4.0.
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 escopo de classe sob o qual corre, chama Environment.SetEnvironmentVariable ou/Console.SetOutSetErrorSetIn/ sem correspondência [ResourceLock] ou .[DoNotParallelize]
Descrição da regra
Mutar o estado global do processo, como variáveis de ambiente ou redirecionamento da consola, a partir de um teste é inseguro uma vez que a paralelização em montagem esteja ativada, porque um teste irmão a correr em simultâneo observa a mutação. Ao contrário de [ResourceLock], que falha na abertura quando uma chave é esquecida, esta regra sinaliza a mutação em tempo de compilação.
[TestMethod]
public void SetsVariable()
{
Environment.SetEnvironmentVariable("MODE", "test"); // Violation
}
Como corrigir violações
Declarar [ResourceLock] com a chave correspondente WellKnownResources para serializar testes concorrentes, ou adicionar [DoNotParallelize] para optar por excluir o teste da paralelização.
[ResourceLock(WellKnownResources.EnvironmentVariables)]
[TestMethod]
public void SetsVariable()
{
Environment.SetEnvironmentVariable("MODE", "test");
}
Uma correção de código C# adiciona o [ResourceLock] atributo para ti, no método de teste ou, para um fixture com âmbito de classe como [TestInitialize], na classe de teste. O código do Visual Basic tem este diagnóstico mas não tem uma correção automática; adiciona o atributo manualmente.
Quando suprimir avisos
Não suprima avisos desta regra sem declarar um bloqueio ou optar por não usar paralelização, porque ao fazê-lo a mutação corre 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 MSTEST0074
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0074
Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.MSTEST0074.severity = none
Para obter mais informações, consulte Como suprimir avisos de análise de código.