Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
| Property | Value |
|---|---|
| ID da regra | MSTEST0075 |
| Título | Evite alterar o diretório atual em um teste paralelizado |
| 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 instalação com escopo de classe em que ele é executado, chama Directory.SetCurrentDirectory ou atribui Environment.CurrentDirectory sem uma correspondência [ResourceLock] ou [DoNotParallelize].
Descrição da regra
O diretório atual é global em todos os sistemas operacionais e, ao contrário da cultura, não tem escopo de thread ou equivalente com escopo assíncrono. Um teste que o altera corrompe o diretório de trabalho de cada teste em execução simultaneamente e os caminhos relativos resolvidos em outro lugar do pacote apontam silenciosamente para o local errado.
[TestMethod]
public void ChangesDirectory()
{
Directory.SetCurrentDirectory(tempPath); // Violation
}
Como corrigir violações
Declare [ResourceLock(WellKnownResources.CurrentDirectory)] para serializar testes de disputa ou adicione [DoNotParallelize] para recusar o teste de paralelização. Mesmo com um bloqueio, prefira passar caminhos absolutos para que o diretório atual nunca precise mudar.
[ResourceLock(WellKnownResources.CurrentDirectory)]
[TestMethod]
public void ChangesDirectory()
{
Directory.SetCurrentDirectory(tempPath);
}
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 MSTEST0075
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0075
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.MSTEST0075.severity = none
Para obter mais informações, consulte Como suprimir avisos de análise de código.