MSTEST0067: evitar o bloqueio síncrono de chamadas no código de teste

Property Valor
ID da regra MSTEST0067
Título Evite bloquear chamadas de forma síncrona no código de teste
Categoria Uso
Correção interruptiva ou sem interrupção Non-breaking
Habilitado por padrão No
Severidade padrão Informações
introduzido na versão 4.3.0
Há uma correção de código No

Note

Essa regra está disponível a partir do MSTest 4.3. Ela é desativada por padrão. Ele está habilitado como um aviso quando <MSTestAnalysisMode>All</MSTestAnalysisMode> está definido.

Cause

O código de teste usa uma chamada de bloqueio síncrona, como Thread.Sleep, Task.Wait, Task.WaitAll, Task.WaitAnyou Task<TResult>.Result.

A regra é acionada em métodos marcados com TestMethodAttribute (incluindo atributos personalizados que herdam dele) e em métodos de teste marcados com TestInitializeAttribute, TestCleanupAttribute, ClassInitializeAttribute, ClassCleanupAttribute, AssemblyInitializeAttribute, AssemblyCleanupAttribute, GlobalTestInitializeAttribute e GlobalTestCleanupAttribute.

Descrição da regra

Bloquear a thread atual de forma síncrona dentro de métodos de teste ou fixtures de teste é uma fonte comum de instabilidade e também pode causar deadlock quando a estrutura de testes executa testes em um contexto de sincronização que requer agendamento cooperativo. Prefira usar await Task.Delay para esperas baseadas em tempo e usar await na tarefa para observar seu resultado.

[TestClass]
public class TestClass
{
    [TestMethod]
    public async Task Test()
    {
        Thread.Sleep(1000); // Violation
        var result = ComputeAsync().Result; // Violation
        ComputeAsync().Wait(); // Violation
    }

    private static Task<int> ComputeAsync() => Task.FromResult(42);
}

Como corrigir violações

Use o equivalente assíncrono:

[TestClass]
public class TestClass
{
    [TestMethod]
    public async Task Test()
    {
        await Task.Delay(1000);
        var result = await ComputeAsync();
    }

    private static Task<int> ComputeAsync() => Task.FromResult(42);
}

Quando suprimir avisos

Essa regra é desativada por padrão. Quando ativada, suprime ocorrências individuais quando a espera síncrona é intencional e inevitável — por exemplo, ao interagir com uma API síncrona que não pode ser tornada assíncrona.

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

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

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