Coyote
Coyote es una biblioteca y herramienta multiplataforma para probar el código C# concurrente y reproducir deterministas.
Usando Coyote, puede probar fácilmente la concurrencia y otro no determinismo en su código C#, escribiendo lo que llamamos una prueba de unidad de concurrencia . Se parecen a sus pruebas unitarias regulares, pero pueden probar de manera confiable las cargas de trabajo concurrentes (como actores, tareas o solicitudes concurrentes a los controladores ASP.NET). En las pruebas unitarias regulares, generalmente evitaría la concurrencia debido a la escamosa, pero con el coyote se le recomienda adoptar la concurrencia en sus pruebas para encontrar errores.
Coyote es utilizado por muchos equipos en Azure para probar sus sistemas y servicios distribuidos, y ha encontrado cientos de errores relacionados con la concurrencia antes de implementar el código en la producción y afectar a los usuarios. En palabras de un arquitecto de servicio azul:
Coyote encontró varios problemas al principio del proceso de desarrollo, este tipo de problemas que generalmente se desangrarían en la producción y se volverían muy costosos de solucionar más tarde.
Coyote está hecho con ❤️ por Microsoft Research.
Considere la siguiente prueba simple:
[ Fact ]
public async Task TestTask ( )
{
int value = 0 ;
Task task = Task . Run ( ( ) =>
{
value = 1 ;
} ) ;
Assert . Equal ( 0 , value ) ;
await task ;
}
Esta prueba pasará la mayor parte del tiempo porque la afirmación generalmente se ejecutará antes de que comience la tarea, pero hay un horario en el que la tarea comienza lo suficientemente rápido como para establecer value
en 1
que hace que la afirmación falle. Por supuesto, este es un ejemplo muy ingenuo y el error es obvio, pero se podría imaginar condiciones de carrera mucho más complicadas que están ocultas en rutas de ejecución complejas.
La forma en que funciona Coyote es que primero convierte la prueba anterior a una prueba unitaria de concurrencia utilizando la 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 ( ) ;
}
A continuación, ejecuta el comando coyote rewrite
desde la CLI (generalmente como una tarea posterior a la construcción) para reescribir automáticamente la IL de sus binarios de prueba y producción. Esto permite que Coyote inyecte ganchos que tomen el control de la ejecución concurrente durante las pruebas.
Luego puede ejecutar la prueba unitaria concurrente desde su marco de prueba unitario favorito (como XUnit). Coyote se hará cargo y ejecutará repetidamente la prueba desde el principio hasta el final para N iteraciones (en el ejemplo anterior, N se configuró a 10
). Bajo el capó, Coyote utiliza estrategias de búsqueda inteligentes para explorar todo tipo de rutas de ejecución que podrían ocultar un error en cada iteración.
Lo impresionante es que una vez que se encuentra un error, Coyote le da un rastro a través del engine.TestReport
API de testreport que puede usar para reproducir de manera confiable el error tantas veces como desee, lo que facilita la depuración y soluciona el problema significativamente más fácil.
¡Comenzar con Coyote es fácil! Primero, siga esta guía para instalar la herramienta de línea de comandos coyote
desde Nuget. Ahora está listo para consultar el sitio web de Coyote para ver los tutoriales, la documentación, los cómo, las muestras y más información sobre el proyecto. ¡Disfrutar!
¿Actualización de sus dependencias coyote
? Revise el ChangeLog aquí.
Tenga en cuenta que Coyote es un proyecto de código abierto que se proporciona "As-Is". No podemos proporcionar ningún apoyo formal. Para los empleados de Microsoft, tenemos el canal Friends of Coyote Teams, que es una comunidad interna que puede ayudar a responder preguntas y aprender unos de otros.
Este proyecto da la bienvenida a las contribuciones y sugerencias. La mayoría de las contribuciones requieren que acepte un Acuerdo de Licencia de Contributor (CLA) que declare que tiene derecho y realmente hacernos los derechos para utilizar su contribución. Para más detalles, visite https://cla.opensource.microsoft.com.
Cuando envíe una solicitud de extracción, un BOT CLA determinará automáticamente si necesita proporcionar un CLA y decorar el PR de manera adecuada (por ejemplo, verificación de estado, comentario). Simplemente siga las instrucciones proporcionadas por el bot. Solo necesitará hacer esto una vez en todos los repositorios utilizando nuestro CLA.
Este proyecto ha adoptado el Código de Conducta Open Open Microsoft. Para obtener más información, consulte el Código de Conducta Preguntas frecuentes o comuníquese con [email protected] con cualquier pregunta o comentario adicional.