Esta pregunta trata sobre el marco de pruebas unitarias xUnit.net .
Necesito ejecutar algún código antes de que se ejecute cualquier prueba, y también algo de código después de que se hayan realizado todas las pruebas. Pensé que debería haber algún tipo de interfaz de atributo o marcador para indicar el código de inicialización y terminación global, pero no pude encontrarlos.
Alternativamente, si invoco xUnit mediante programación, también puedo lograr lo que quiero con el siguiente código:
static void Main()
{
try
{
MyGlobalSetup();
RunAllTests(); // What goes into this method?
}
finally
{
MyGlobalTeardown();
}
}
¿Alguien puede darme una pista sobre cómo ejecutar de forma declarativa o programática algún código de instalación / desmontaje global?
Respuestas:
Hasta donde yo sé, xUnit no tiene un punto de extensión de inicialización / desmontaje global. Sin embargo, es fácil crear uno. Simplemente cree una clase de prueba base que implemente
IDisposable
y realice su inicialización en el constructor y su desmontaje en elIDisposable.Dispose
método. Esto se vería así:Sin embargo, el código de instalación y desmontaje de la clase base se ejecutará para cada llamada. Puede que esto no sea lo que desea, ya que no es muy eficiente. Una versión más optimizada utilizaría la
IClassFixture<T>
interfaz para garantizar que la funcionalidad de inicialización / desmontaje global solo se llame una vez. Para esta versión, no extiende una clase base de su clase de prueba, sino implementa laIClassFixture<T>
interfaz donde seT
refiere a su clase de dispositivo:Esto dará como resultado que el constructor
TestsFixture
solo se ejecute una vez por cada clase bajo prueba. Por lo tanto, depende de lo que desee elegir exactamente entre los dos métodos.fuente
[Collection("<name>")]
atributoEstaba buscando la misma respuesta, y en este momento la documentación de xUnit es muy útil en cuanto a cómo implementar accesorios de clase y accesorios de colección que brindan a los desarrolladores una amplia gama de funciones de configuración / desmontaje a nivel de clase o grupo de clases. Esto está en línea con la respuesta de Geir Sagberg y ofrece una buena implementación esquemática para ilustrar cómo debería verse.
https://xunit.github.io/docs/shared-context.html
fuente
Collection
atributo para que ocurra la configuración "global". Eso significa que, si tiene algo que desee configurar antes de ejecutar cualquier prueba, debe decorar todas las clases de prueba con este atributo. En mi opinión, esto es demasiado frágil, ya que olvidar decorar una sola clase de prueba puede provocar errores que son difíciles de rastrear. Sería bueno si xUnit creara una forma de configuración y desmontaje verdaderamente global.Hay una solución fácil y sencilla. Utilice el complemento Fody.ModuleInit
https://github.com/Fody/ModuleInit
Es un paquete nuget y cuando lo instalas agrega un nuevo archivo llamado
ModuleInitializer.cs
al proyecto. Hay un método estático aquí que se integra en el ensamblaje después de la compilación y se ejecuta tan pronto como se carga el ensamblaje y antes de que se ejecute algo.Lo uso para desbloquear la licencia de software de una biblioteca que he comprado. Siempre me olvidaba de desbloquear la licencia en cada prueba e incluso me olvidaba de derivar la prueba de una clase base que la desbloquearía. Las chispas brillantes que escribieron esta biblioteca, en lugar de decirle que estaba bloqueada por licencia, introdujeron sutiles errores numéricos que hacen que las pruebas fallen o pasen cuando no deberían. Nunca sabrás si has desbloqueado correctamente la biblioteca o no. Así que ahora mi módulo init parece
y todas las pruebas que se colocan en este ensamblaje tendrán la licencia desbloqueada correctamente para ellos.
fuente
Para compartir el código SetUp / TearDown entre varias clases, puede usar CollectionFixture de xUnit .
Citar:
fuente