Partilhar via


MSTEST0045: Usar o cancelamento cooperativo para limite de tempo

Property Value
ID da regra MSTEST0045
Title Usar o cancelamento cooperativo para o limite de tempo
Category Usage
A correção é invasiva ou não invasiva Non-breaking
Ativado por padrão Yes
Severidade padrão Informação (Aviso na versão 4.0)
Introduzido na versão 3.10.0
Existe uma correção de código Yes

Cause

Um método de teste usa TimeoutAttribute sem definir a CooperativeCancellation propriedade como true.

Descrição da regra

Não há como abortar graciosamente um thread em execução. Existem duas maneiras de um timeout funcionar:

  • Pare de observar o thread executando o teste. Mas isso pode ser problemático em muitos casos e pode tornar os testes restantes instáveis devido a possíveis condições de corrida. Trata-se de um cancelamento não cooperante.
  • Solicite o cancelamento assim que o tempo limite for atingido, sendo da responsabilidade do teste encerrar mediante solicitação. Trata-se de um cancelamento cooperativo.

Ao usar TimeoutAttribute, deves definir CooperativeCancellation como true para habilitar o cancelamento cooperativo. Sem cancelamento cooperativo, a estrutura de teste para de observar a execução do teste quando o tempo limite é atingido, mas o teste continua sendo executado em segundo plano. Isso pode levar a problemas para outros testes ou etapas de limpeza, pois o teste original ainda está em execução e pode interferir nas operações subsequentes.

Ao utilizar o modo de cancelamento cooperativo, o MSTest apenas aciona o cancelamento do token e é da sua responsabilidade transmitir e usar o token de contexto do teste no seu código de teste. Esse modo se alinha com o comportamento padrão de cancelamento no .NET.

Como corrigir violações

Use o fixador de código fornecido para definir automaticamente a CooperativeCancellation propriedade como true no TimeoutAttribute. Você também pode adicionar manualmente a propriedade, se necessário.

[TestClass]
public class TestClass1
{
    public TestContext TestContext { get; set; }

    [Timeout(TimeoutValue, CooperativeCancellation = true)]
    [TestMethod]
    public void TestMethod1()
    {
        // Respect TestContext.CancellationTokenSource.Token
    }
}

Como alternativa, você pode configurar o cancelamento cooperativo globalmente em suas configurações de execução ou testconfig.json arquivo para aplicar essa configuração a todos os atributos de tempo limite em seu projeto de teste.

Quando suprimir avisos

Suprima esse aviso se precisar especificamente que o teste seja encerrado abruptamente quando o tempo limite for atingido, em vez de usar o cancelamento cooperativo.