Coyote
O Coyote é uma biblioteca e uma ferramenta de plataforma cruzada para testar o código C# simultâneo e reproduzir deterministicamente os bugs.
Usando o Coyote, você pode testar facilmente a simultaneidade e outros não -determinismo no seu código C#, escrevendo o que chamamos de teste de unidade de simultaneidade . Eles se parecem com os testes de unidade regulares, mas podem testar com segurança cargas de trabalho simultâneas (como atores, tarefas ou solicitações simultâneas aos controladores ASP.NET). Nos testes de unidade regulares, você normalmente evita a simultaneidade devido à descamação, mas com o coiote, você é incentivado a adotar a simultaneidade em seus testes para encontrar bugs.
O Coiote é usado por muitas equipes no Azure para testar seus sistemas e serviços distribuídos e encontrou centenas de bugs relacionados à simultaneidade antes de implantar código na produção e afetar os usuários. Nas palavras de um arquiteto de serviço do Azure:
O Coyote encontrou vários problemas no início do processo de desenvolvimento, esse tipo de questões que geralmente sangram na produção e se tornam muito caras para corrigir mais tarde.
O coiote é feito com ❤️ pela Microsoft Research.
Considere o seguinte teste simples:
[ Fact ]
public async Task TestTask ( )
{
int value = 0 ;
Task task = Task . Run ( ( ) =>
{
value = 1 ;
} ) ;
Assert . Equal ( 0 , value ) ;
await task ;
}
Esse teste passará na maioria das vezes porque a afirmação normalmente é executada antes do início da tarefa, mas há um cronograma em que a tarefa começa com rapidez suficiente para definir value
para 1
fazendo com que a afirmação falhe. Obviamente, este é um exemplo muito ingênuo e o bug é óbvio, mas você pode imaginar condições de corrida muito mais complicadas que estão ocultas em caminhos de execução complexos.
A maneira como o Coyote funciona é que você primeiro converte o teste acima em um teste de unidade de simultaneidade usando a API do Coyote TestingEngine
:
using Microsoft . Coyote . SystematicTesting ;
[ Fact ]
public async Task CoyoteTestTask ( )
{
var configuration = Configuration . Create ( ) . WithTestingIterations ( 10 ) ;
var engine = TestingEngine . Create ( configuration , TestTask ) ;
engine . Run ( ) ;
}
Em seguida, você executa o comando coyote rewrite
da CLI (normalmente como uma tarefa pós-compra) para reescrever automaticamente o IL dos seus binários de teste e produção. Isso permite que o coiote injete ganchos que assumem o controle da execução simultânea durante o teste.
Você pode executar o teste de unidade simultânea a partir da sua estrutura de teste de unidade favorita (como XUnit). O Coiote assumirá o controle e executará repetidamente o teste do início ao final para n iterações (no exemplo acima n foi configurado para 10
). Sob o capô, o Coyote usa estratégias de pesquisa inteligentes para explorar todos os tipos de caminhos de execução que podem ocultar um bug em cada iteração.
O incrível é que, uma vez que um bug é encontrado, o Coiote oferece um rastro através da engine.TestReport
que você pode usar para reproduzir de maneira confiável o bug quantas vezes quiser, facilitando a depuração e a fixação do problema significativamente.
Introdução ao Coyote é fácil! Primeiro, siga este guia para instalar a ferramenta de linha de comando coyote
a partir da NUGET. Agora você está pronto para conferir o site do Coyote para tutoriais, documentação, instruções, amostras e mais informações sobre o projeto. Aproveitar!
Atualizando suas dependências coyote
? Verifique o Changelog aqui.
Observe que o Coiote é um projeto de código aberto que é fornecido "como está". Não somos capazes de fornecer nenhum apoio formal. Para os funcionários da Microsoft, temos o canal Friends of Coyote Teams, que é uma comunidade interna que pode ajudar a responder a perguntas e aprender uns com os outros.
Este projeto recebe contribuições e sugestões. A maioria das contribuições exige que você concorde com um Contrato de Licença de Colaborador (CLA) declarando que você tem o direito e, na verdade, concede -nos os direitos de usar sua contribuição. Para detalhes, visite https://cla.opensource.microsoft.com.
Quando você envia uma solicitação de tração, um BOT do CLA determina automaticamente se você precisa fornecer um CLA e decorar o PR adequadamente (por exemplo, verificação de status, comentar). Simplesmente siga as instruções fornecidas pelo bot. Você só precisará fazer isso uma vez em todos os repositórios usando nosso CLA.
Este projeto adotou o Código de Conduta Open Microsoft. Para obter mais informações, consulte o Código de Conduta Perguntas frequentes ou entre em contato com [email protected] com quaisquer perguntas ou comentários adicionais.