MSTEST0074: Testar a mutação do estado global do processo deve declarar um bloqueio de recursos

Property Value
ID da regra MSTEST0074
Título Testar a mutação do estado do processo global deve declarar um bloqueio de recurso
Categoria Uso
Correção é disruptiva ou não disruptiva Inquebrável
Habilitado por padrão Sim
Severidade padrão Informações
introduzido na versão 4.4.0 (versão prévia)
Há uma correção de código Sim, somente para C#

Importante

ResourceLockAttribute é planejado para MSTest 4.4 e está disponível apenas em builds de visualização até que o MSTest 4.4.0 seja lançado.

Note

Esse analisador é ativado somente quando a paralelização do assembly está habilitada sintaticamente, por exemplo [assembly: Parallelize] , sem correspondência [assembly: DoNotParallelize]ou quando um .editorconfig arquivo é configurado mstest_parallel_safety_mode = always. O analisador não pode detectar a paralelização habilitada apenas por meio .runsettings ou propriedades do MSBuild, como MSTestParallelizeWorkers. Defina a opção .editorconfig se você configurar a paralelização dessa maneira e ainda quiser que esse analisador seja executado.

Cause

Um teste ou um método de luminária com escopo de classe em que ele é executado, chama Environment.SetEnvironmentVariable ou/Console.SetOutSetErrorSetIn/ sem uma correspondência [ResourceLock] ou .[DoNotParallelize]

Descrição da regra

A mutação do estado global do processo, como variáveis de ambiente ou redirecionamento de console, de um teste não é segura quando a paralelização no assembly é habilitada, porque um teste irmão em execução simultaneamente observa a mutação. Ao contrário [ResourceLock]de , que falha ao abrir quando uma chave é esquecida, essa regra sinaliza a mutação em tempo de compilação.

[TestMethod]
public void SetsVariable()
{
    Environment.SetEnvironmentVariable("MODE", "test"); // Violation
}

Como corrigir violações

Declare [ResourceLock] com a chave correspondente WellKnownResources para serializar testes de disputa ou adicione [DoNotParallelize] para recusar o teste de 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 você, no método de teste ou, para uma luminária com escopo de classe, como [TestInitialize], na classe de teste. Visual Basic código tem esse diagnóstico, mas não tem uma correção automática; adicione o atributo manualmente.

Quando suprimir avisos

Não suprime avisos dessa regra sem declarar um bloqueio ou recusar a paralelização, pois isso deixa a mutação correndo silenciosamente contra a execução simultânea de testes.

Suprimir um aviso

Se você quiser suprimir apenas uma única violação, adicione diretivas de pré-processador ao arquivo de origem para desabilitar a regra e, em seguida, habilitá-la novamente.

#pragma warning disable MSTEST0074
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0074

Para desabilitar a regra em um arquivo, uma pasta ou um projeto, defina a severidade 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.

Consulte também