Coyote
Coyote est une bibliothèque et un outil multiplateforme pour tester le code C # simultané et la reproduction de bogues de manière déterministe.
En utilisant Coyote, vous pouvez facilement tester la concurrence et d'autres non-déterminisme dans votre code C #, en écrivant ce que nous appelons un test unitaire de concurrence . Ceux-ci ressemblent à vos tests unitaires réguliers, mais peuvent tester de manière fiable les charges de travail simultanées (telles que les acteurs, les tâches ou les demandes simultanées aux contrôleurs ASP.NET). Dans les tests unitaires réguliers, vous éviteriez généralement la concurrence en raison de la feuilleté, mais avec le coyote, vous êtes encouragé à adopter la concurrence dans vos tests pour trouver des insectes.
Coyote est utilisé par de nombreuses équipes d'Azure pour tester leurs systèmes et services distribués, et a trouvé des centaines de bogues liés à la concurrence avant de déployer du code en production et affectant les utilisateurs. Dans les mots d'un architecte de service Azure:
Coyote a trouvé plusieurs problèmes au début du processus de développement, ce type de problèmes qui saignerait généralement dans la production et deviendrait très coûteux à réparer plus tard.
Le coyote est fabriqué avec ❤️ par Microsoft Research.
Considérez le test simple suivant:
[ Fact ]
public async Task TestTask ( )
{
int value = 0 ;
Task task = Task . Run ( ( ) =>
{
value = 1 ;
} ) ;
Assert . Equal ( 0 , value ) ;
await task ;
}
Ce test passera la plupart du temps car l'affirmation s'exécutera généralement avant le début de la tâche, mais il y a un calendrier où la tâche démarre suffisamment rapidement pour définir value
à 1
provoquant l'échec de l'affirmation. Bien sûr, c'est un exemple très naïf et le bug est évident, mais vous pouvez imaginer des conditions de course beaucoup plus compliquées qui sont cachées dans des chemins d'exécution complexes.
La façon dont Coyote fonctionne, c'est que vous convertiez d'abord le test ci-dessus en un test unitaire de concurrence en utilisant l'API 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 ( ) ;
}
Ensuite, vous exécutez la commande coyote rewrite
à partir de la CLI (généralement en tant que tâche post-construction) pour réécrire automatiquement l'IL de vos binaires de test et de production. Cela permet à Coyote d'injecter des crochets qui prennent le contrôle de l'exécution simultanée lors des tests.
Vous pouvez ensuite exécuter le test unitaire simultané à partir de votre cadre de test unitaire préféré (tel que Xunit). Coyote prendra le relais et exécutera à plusieurs reprises le test du début à la fin pour n itérations (dans l'exemple ci-dessus, n a été configuré à 10
). Sous le capot, Coyote utilise des stratégies de recherche intelligentes pour explorer toutes sortes de chemins d'exécution qui pourraient masquer un bug dans chaque itération.
Ce qui est génial, c'est qu'une fois qu'un bug est trouvé, Coyote vous donne une trace via l' engine.TestReport
que vous pouvez utiliser pour reproduire de manière fiable le bug autant de fois que vous le souhaitez, faciliter le débogage et la résolution du problème.
Il est facile de commencer avec Coyote! Tout d'abord, suivez ce guide pour installer l'outil de ligne de commande coyote
de NuGet. Vous êtes maintenant prêt à consulter le site Web de Coyote pour les tutoriels, la documentation, les How-Tos, les échantillons et plus d'informations sur le projet. Apprécier!
Mettre à niveau vos dépendances coyote
? Vérifiez le Changelog ici.
Notez que Coyote est un projet open source qui est fourni "tel quel". Nous ne sommes pas en mesure de fournir un support formel. Pour les employés de Microsoft, nous avons les Amis de Coyote Teams Channel, qui est une communauté interne qui peut aider à répondre aux questions et à apprendre les uns des autres.
Ce projet accueille les contributions et les suggestions. La plupart des contributions vous obligent à accepter un accord de licence de contributeur (CLA) déclarant que vous avez le droit de faire et en fait, accordez-nous les droits d'utilisation de votre contribution. Pour plus de détails, visitez https://cla.opensource.microsoft.com.
Lorsque vous soumettez une demande de traction, un bot CLA déterminera automatiquement si vous devez fournir un CLA et décorer le RP de manière appropriée (par exemple, vérification d'état, commentaire). Suivez simplement les instructions fournies par le bot. Vous n'aurez besoin de le faire qu'une seule fois dans tous les référentiels en utilisant notre CLA.
Ce projet a adopté le code de conduite open source Microsoft. Pour plus d'informations, consultez le code de conduite FAQ ou contactez [email protected] avec toute question ou commentaire supplémentaire.