Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
| 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.