MSTEST0077: evitar caminhos de sistema de arquivos codificados ou compartilhados em um teste paralelizado

Property Value
ID da regra MSTEST0077
Título Evitar caminhos de sistema de arquivos codificados ou compartilhados 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 Não

Importante

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

Descrição da regra

Um caminho constante codificado ou relativo tem como destino um local compartilhado por todos os outros testes no assembly. Em paralelização no assembly, dois testes podem gravar no mesmo local simultaneamente e colidir.

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

Somente caminhos estaticamente constantes passados para uma API em mutação são sinalizados. Leituras, construção de caminho e caminhos criados a partir de variáveis são deixados para você revisar manualmente, pois o analisador não pode informar se dois testes realmente colidem em um caminho computado.

Como corrigir violações

Use um local exclusivo 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 esse aviso se o caminho direcionar intencionalmente a um dispositivo que cada teste lê, mas nenhum teste é gravado simultaneamente ou se os testes que gravam nele já estiverem coordenados, por exemplo.[DoNotParallelize]

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

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.MSTEST0077.severity = none

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

Consulte também