MSTEST0075: Evitar alterar o diretório atual num teste paralelizado

Property Value
ID da regra MSTEST0075
Título Evite alterar o diretório atual 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 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 âmbito de classe sob o qual corre, chama Directory.SetCurrentDirectory ou atribui Environment.CurrentDirectory sem correspondência [ResourceLock] ou [DoNotParallelize].

Descrição da regra

O diretório atual é global de processos em todos os sistemas operativos e, ao contrário da cultura, não tem equivalente com escopo de thread ou assíncrono. Um teste que o altera corrompe o diretório de trabalho de todos os testes em execução simultânea, e caminhos relativos resolvidos noutros locais do conjunto apontam silenciosamente para o local errado.

[TestMethod]
public void ChangesDirectory()
{
    Directory.SetCurrentDirectory(tempPath); // Violation
}

Como corrigir violações

Declarar [ResourceLock(WellKnownResources.CurrentDirectory)] para serializar testes concorrentes, ou adicionar [DoNotParallelize] para optar por excluir o teste da paralelização. Mesmo com bloqueio, prefiro passar caminhos absolutos para que o diretório atual nunca precise de mudar.

[ResourceLock(WellKnownResources.CurrentDirectory)]
[TestMethod]
public void ChangesDirectory()
{
    Directory.SetCurrentDirectory(tempPath);
}

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 MSTEST0075
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0075

Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none no arquivo de configuração.

[*.{cs,vb}]
dotnet_diagnostic.MSTEST0075.severity = none

Para obter mais informações, consulte Como suprimir avisos de análise de código.

Consulte também