MSTEST0077: Evitar caminhos de sistema de ficheiros codificados ou partilhados num teste paralelizado

Property Value
ID da regra MSTEST0077
Título Evite caminhos de sistema de ficheiros codificados ou partilhados 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

Importante

TestContext.TestTempDirectory 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 passa um caminho absoluto constante, ou um literal de caminho relativo, diretamente para um método de File.*/Directory.* mutação do sistema de ficheiros, como File.WriteAllText ou .Directory.CreateDirectory

Descrição da regra

Um caminho codificado fixamente ou relativamente constante tem como alvo uma localização partilhada por todos os outros testes na montagem. Sob paralelização em montagem, dois testes podem então escrever simultaneamente no mesmo local e colidir.

[TestMethod]
public void WritesReport()
{
    File.WriteAllText("report.txt", contents); // Violation
}

Apenas os caminhos estaticamente constantes passados para uma API em mutação são sinalizados. Leituras, construção de caminhos e caminhos construídos a partir de variáveis ficam para rever manualmente, porque o analisador não consegue dizer se dois testes realmente colidem num caminho calculado.

Como corrigir violações

Use uma localização única por teste, como TestContext.TestTempDirectory, em vez de um caminho fixo ou relativo.

[TestMethod]
public void WritesReport()
{
    string path = Path.Combine(TestContext.TestTempDirectory!, "report.txt");
    File.WriteAllText(path, contents);
}

Quando suprimir avisos

É seguro suprimir este aviso se o caminho visar intencionalmente um fixture que todos os testes leem mas nenhum teste escreve simultaneamente, ou se os testes que escrevem nele já estiverem coordenados, por exemplo através de [DoNotParallelize].

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

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

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

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

Consulte também